From 3d5a67ed14ebd8926ca65e401071e6f5f7327410 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Fri, 10 May 2019 16:32:56 +0200 Subject: [PATCH] Library: finish and clean-up the solution for VerbPack dispatch --- src/lib/polymorphic-value.hpp | 33 +- src/lib/verb-visitor.hpp | 61 +- tests/library/verb-visitor-dispatch-test.cpp | 16 - wiki/thinkPad.ichthyo.mm | 4660 +++++++++--------- 4 files changed, 2394 insertions(+), 2376 deletions(-) diff --git a/src/lib/polymorphic-value.hpp b/src/lib/polymorphic-value.hpp index 2bbfc609a..6471d4e22 100644 --- a/src/lib/polymorphic-value.hpp +++ b/src/lib/polymorphic-value.hpp @@ -43,7 +43,7 @@ ** of the programming language, we may try to pull some (template based) trickery ** to make polymorphic objects fit better with the handling of small copyable ** value objects. Especially, C++ gives a special meaning to passing parameters - ** as \c const& -- typically constructing an anonymous temporary object conveniently + ** as `const&` -- typically constructing an anonymous temporary object conveniently ** just for passing an abstraction barrier (while the optimiser can be expected to ** remove this barrier and the accompanying nominal copy operations altogether in ** the generated code). Consequently the ability to return a polymorphic object @@ -68,7 +68,7 @@ ** Moreover, the PolymorphicValue container provides static builder functions, ** allowing to place a concrete instance of a subclass into the content buffer. ** After construction, the actual type of this instance will be forgotten - ** (``type erasure''), but because of the embedded vtable, on access, the + ** ("type erasure"), but because of the embedded vtable, on access, the ** proper implementation functions will be invoked. ** ** Expanding on that pattern, the copying and cloning operations of the whole @@ -289,19 +289,20 @@ namespace lib { /** - * traits template to deal with - * different ways to support copy operations. + * trait template to deal with different ways to support copy operations. * Default is no support by the API and implementation types. - * In this case, the CopySupport interface is mixed in at the - * level of the concrete implementation class and later on - * accessed through a \c dynamic_cast + * In this case, the CopySupport interface is mixed-in at the + * level of the concrete implementation class and will be + * accessed later on through a `dynamic_cast` * @todo this whole decision logic works but is confusingly written ///////////////////////TICKET #1197 : improve design of copy support */ template struct Trait { - typedef CopySupport CopyAPI; ///////////////////////////TICKET #1197 : this is naive, we do not know if the target really has full copy support... - enum{ ADMIN_OVERHEAD = 2 * sizeof(void*) }; + using CopyAPI = CopySupport; ///////////////////////////TICKET #1197 : this is naive, we do not know if the target really has full copy support... + using Assignment = AssignmentPolicy; + using AdapterAttachment = CopyAPI; + enum{ ADMIN_OVERHEAD = 2 * sizeof(void*) }; // need second VTable for CopyAPI mix-in static CopyAPI& accessCopyHandlingInterface (TY& bufferContents) @@ -309,9 +310,6 @@ namespace lib { REQUIRE (INSTANCEOF (CopyAPI, &bufferContents)); return dynamic_cast (bufferContents); } - - typedef CopyAPI AdapterAttachment; - typedef AssignmentPolicy Assignment; }; @@ -325,8 +323,10 @@ namespace lib { template struct Trait >> { - typedef TY CopyAPI; - enum{ ADMIN_OVERHEAD = 1 * sizeof(void*) }; + using CopyAPI = TY; + using Assignment = AssignmentPolicy; + using AdapterAttachment = struct{ /* irrelevant */ }; + enum{ ADMIN_OVERHEAD = 1 * sizeof(void*) }; // just the VTable of the payload template static CopyAPI& @@ -335,9 +335,6 @@ namespace lib { REQUIRE (INSTANCEOF (CopyAPI, &bufferContents)); return static_cast (bufferContents); } - - typedef EmptyBase AdapterAttachment; - typedef AssignmentPolicy Assignment; }; }//(End)implementation details @@ -373,7 +370,7 @@ namespace lib { > class PolymorphicValue { - public: + private: typedef polyvalue::Trait _Traits; typedef typename _Traits::CopyAPI _CopyHandlingAdapter; typedef typename _Traits::Assignment _AssignmentPolicy; /////////////////TICKET #1197 : confusingly indirect decision logic diff --git a/src/lib/verb-visitor.hpp b/src/lib/verb-visitor.hpp index 181811f5c..d880bffbb 100644 --- a/src/lib/verb-visitor.hpp +++ b/src/lib/verb-visitor.hpp @@ -24,12 +24,13 @@ /** @file verb-visitor.hpp ** A specific double dispatch variation for function invocation. ** While the classic visitor invokes a common `handle` function with varying arguments, - ** here we allow for pre-binding of arbitrary functions on an interface with individual - ** suitable arguments. Yet similar to the classic visitor, the actual receiver can be a - ** subclass of the target interface, which causes the _second_ indirection in the dispatch - ** chain. Since the actually distinguishing factor is not so much a type, but a specific - ** operation, we refer to the delayed invocation handles created by this binding as - ** _verb token_ on a _receiver_ object (which is the concrete visitor). + ** here we allow for pre-binding of arbitrary _handler functions_ on an interface with + ** together with individual, suitable arguments. Yet similar to the classic visitor, the + ** _actual receiver_ can be a subclass of the visitor target interface, which causes the + ** _second_ indirection in the dispatch chain, thus completing a full double-dispatch. + ** Since the actually distinguishing factor is not so much a type, but a specific operation, + ** we refer to the delayed invocation handles created by this binding as _verb token_ + ** on a _receiver_ object (which is the concrete visitor). ** ** This setup is an extension or derivative of the [generic verb token](\ref verb-token-hpp) ** used for the diff system and similar applications; likewise the intended usage is to establish @@ -38,6 +39,43 @@ ** use case is for the drawing of track contents in the user interface, where this pattern allows ** the separation of actual drawing code from the nested track controller structure. ** + ** + ** ## implementation technique + ** + ** The actual foundation is quite simple: we store a [member pointer]. Typically, this embedded + ** pointer-to-member shall be bound to an abstract virtual function on the _visitor interface._ + ** So basically the "verb" boils down to storing an offset into the VTable on the interface. + ** Later, on invocation, a reference to the actual _receiver_ is passed in, typically a concrete + ** subclass of the visitor interface. The invocation then combines this receiver reference with + ** the offset (the member pointer) to invoke the desired virtual function. + ** + ** However, the complications and technicalities arise from the ability to bind arbitrary + ** function signatures, even together with the actual arguments to use at invocation. Those + ** function arguments are supplied when creating the "packaged verb", and thus need to be stored + ** within this package, together with the member-pointer. The result is a _materialised_ and + ** _delayed_ invocation of an abstract (interface) function, while the actual concrete function + ** implementation shall be supplied later. Obviously, such a ["verb pack"](\ref VerbPack) has + ** _value semantics_ -- we want to store it, copy it and pass it along, often even within a + ** sequence of "verbs". And even more: we do not want to pass "hidden references" and we + ** do not want to rely on some management service and heap allocations. Rather, each + ** VerbPack shall be a self-contained value object. Within certain limitations, + ** this is possible in C++ by using an opaque buffer embedded within the + ** outer value object; basically the pre-defined buffer size must be + ** sufficient to hold all possible argument tuples to bind. + ** + ** The actual implementation here relies on two other components from the Lumiera library: + ** - the lib::VerbToken provides us with the dispatch through a stored member pointer + ** - the lib::PolymorphicValue allows to embed a subclass within an opaque inline buffer, + ** just exposing the common interface. + ** Yet another challenge is the necessity to unpack the argument values from the storage + ** tuple and pass them to an (at this point abstracted) function with arbitrary signature. + ** Here we rely on the common implementation technique from [std::apply], here with the + ** special twist that we don't use a pre-bound function, but rather need to combine the + ** actual invocation target at the moment of the invocation. + ** + ** [member pointer]: https://en.cppreference.com/w/cpp/language/pointer + ** [std::apply]: https://en.cppreference.com/w/cpp/utility/apply + ** ** @see [drawing on the track canvas](\ref body-canvas-widget.cpp) ** @see VerbVisitorDispatch_test ** @@ -72,11 +110,10 @@ namespace lib { } } - using EmptyBasE = struct { }; template struct VerbInvoker - : polyvalue::CloneValueSupport // mark and mix-in virtual copy construction support + : polyvalue::CloneValueSupport // mark and mix-in virtual copy construction support { virtual ~VerbInvoker() { } @@ -84,10 +121,10 @@ namespace lib { }; template - struct Holder; + struct VerbHolder; template - struct Holder + struct VerbHolder : VerbInvoker , VerbToken { @@ -99,7 +136,7 @@ namespace lib { Args args_; - Holder (typename Verb::Handler handlerRef, Literal verbID, ARGS&&... args) + VerbHolder (typename Verb::Handler handlerRef, Literal verbID, ARGS&&... args) : Verb{handlerRef, verbID} , args_{std::forward (args)...} { } @@ -128,7 +165,7 @@ namespace lib { using PolyHolder = PolymorphicValue, storageOverhead(arg_storage)>; template - using PayloadType = Holder*; + using PayloadType = VerbHolder*; template using Handler = typename VerbToken::Handler; diff --git a/tests/library/verb-visitor-dispatch-test.cpp b/tests/library/verb-visitor-dispatch-test.cpp index 29deb3001..8b5057a75 100644 --- a/tests/library/verb-visitor-dispatch-test.cpp +++ b/tests/library/verb-visitor-dispatch-test.cpp @@ -155,22 +155,6 @@ namespace test{ TokenSeq tokens = build_and_copy_tokens(); render_verbose (tokens); // profile.append_woof(1, 2); - - using IrrelvantType = struct{}; - const size_t VERB_TOK_SIZE = sizeof(lib::VerbToken); - using HoldL = Holder; - const size_t VERB_TOK_SIZ2 = sizeof(HoldL::Verb); - const size_t HOLDER_SIZE = sizeof(HoldL); - const size_t ARG_TUP_SIZE = sizeof(std::tuple); - - SHOW_EXPR (VERB_TOK_SIZE); - SHOW_EXPR (VERB_TOK_SIZ2); - SHOW_EXPR (HOLDER_SIZE); - SHOW_EXPR (ARG_TUP_SIZE); - SHOW_EXPR (sizeof(string)); - using AdapT = Token::Adapter; - SHOW_TYPE (AdapT); - SHOW_EXPR (sizeof(AdapT)); } diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 66d3740be..b3859f34c 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -1,69 +1,69 @@ - + - + - - - - + + + + - - - - - - + + + + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - + - - - + + + - + - - - - + + + + - + - + - + - + @@ -75,36 +75,36 @@ - + - + - + - - + + - + - + - - - - + + + + - + - + @@ -116,7 +116,7 @@ - + @@ -137,10 +137,10 @@ - - + + - + @@ -161,8 +161,8 @@ - - + + @@ -180,26 +180,26 @@ - - - + + + - + - + - - - + + + - + - + @@ -233,16 +233,16 @@ - + - - - + + + - + - + @@ -255,7 +255,7 @@ - + @@ -270,7 +270,7 @@ - + @@ -286,23 +286,23 @@ - + - + - + - + - + - - + + @@ -314,7 +314,7 @@ - + @@ -358,16 +358,16 @@ - + - - + + - + - + - + @@ -389,77 +389,77 @@ - + - + - + - + - + - - - - - + + + + + - - - + + + - - - - + + + + - + - + - + - + - - + + - + - + - - - - - - + + + + + + - + - - - - + + + + @@ -480,7 +480,7 @@ - + @@ -495,51 +495,51 @@ - - - + + + - + - - + + - - + + - + - - + + - - - + + + - - - - + + + + - - - + + + - - + + - + @@ -551,7 +551,7 @@ - + @@ -563,24 +563,24 @@ - + - - + + - - - - + + + + - - + + - - + + @@ -593,17 +593,17 @@ - - - + + + - + - + - - + + @@ -628,33 +628,33 @@ - + - + - + - - + + - + - + - + - + - + - + @@ -695,12 +695,12 @@ - + - - + + - + @@ -732,7 +732,7 @@ - + @@ -744,7 +744,7 @@ - + @@ -892,25 +892,25 @@ - + - + - + - + - + @@ -949,7 +949,7 @@ - + @@ -961,13 +961,13 @@ - - + + - + @@ -3923,7 +3923,7 @@ - + @@ -4288,7 +4288,7 @@ - + @@ -5165,38 +5165,38 @@ - + - - + + - - - - + + + + - + - + - - - + + + - + - + @@ -5208,7 +5208,7 @@ - + @@ -5221,9 +5221,9 @@ - + - + @@ -5273,143 +5273,143 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5422,20 +5422,20 @@ - + - + - + - - - + + + @@ -5466,12 +5466,12 @@ - + - + - + @@ -5499,21 +5499,21 @@ - - - + + + - - + + - + - + @@ -5524,7 +5524,7 @@

- + @@ -5572,9 +5572,9 @@ - - - + + + @@ -5643,82 +5643,82 @@ - - - - - - + + + + + + - - - - + + + + - + - + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5736,21 +5736,21 @@ - + - + - + - + - + - + @@ -5764,16 +5764,16 @@ - + - - + + - + - - + + @@ -5812,7 +5812,7 @@ - + @@ -5820,69 +5820,69 @@ - + - + - + - + - + - - - + + + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + @@ -5898,7 +5898,7 @@ - + @@ -5918,15 +5918,15 @@ - + - + - + @@ -5941,32 +5941,32 @@ - - - - - + + + + + - + - + - + - + - + - + - - - + + + @@ -6003,49 +6003,49 @@ - + - + - + - - - - + + + + - + - + - + - + - + - + - - - + + + @@ -6076,41 +6076,41 @@ - + - - + + - - - - - + + + + + - - + + - - - + + + - + - + - + @@ -6627,7 +6627,7 @@ - + @@ -6718,7 +6718,7 @@ - + @@ -16532,161 +16532,161 @@ - - + + - + - - + + - - + + - + - + - - - - + + + + - + - - + + - - + + - + - - - + + + - - + + - - + + - + - - + + - + - + - - - - + + + + - - - - + + + + - + - + - + - + - + - - - - + + + + - + - - - + + + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + @@ -16705,10 +16705,10 @@ - + - + @@ -16778,13 +16778,13 @@ - - - - + + + + - + @@ -17003,50 +17003,50 @@ - - - - - + + + + + - - - + + + - - - + + + - - - + + + - + - - + + - - - + + + - - + + - - - + + + @@ -17058,41 +17058,41 @@ - - + + - + - + - - - - + + + + - + - - + + - + - - + + @@ -17105,8 +17105,8 @@ - - + + @@ -17119,42 +17119,42 @@ - + - - + + - + - + - - - + + + - + - + - + - - + + - + - + @@ -17424,61 +17424,61 @@ - + - - - + + + - - - - - - - - - - + + + + + + + + + + - + - - - + + + - - + + - - - - + + + + - + - + - - + + - + - + - + - - - + + + @@ -17490,7 +17490,7 @@ - + @@ -17505,7 +17505,7 @@ - + @@ -17520,36 +17520,36 @@ - + - + - - + + - + - + - + - + - - - + + + - - - + + + @@ -17572,51 +17572,51 @@ - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + @@ -17628,55 +17628,55 @@ - - - + + + - - - + + + - - - - - - - + + + + + + + - + - + - - - - - - + + + + + + - + - - - + + + - - - - + + + + - - + + @@ -17688,7 +17688,7 @@ - + @@ -17703,7 +17703,7 @@ - + @@ -17741,61 +17741,61 @@ - + - - - - - - + + + + + + - - + + - - - + + + - - + + - - + + - + - + - - + + - + - - - - + + + + - - + + - + - - - - - + + + + + @@ -17809,14 +17809,14 @@ - - + + - - - + + + @@ -17829,8 +17829,8 @@ - - + + @@ -17841,31 +17841,31 @@

- + - - - + + + - - - - + + + + - - - + + + - + - - - - - + + + + + @@ -17977,7 +17977,7 @@ - + @@ -17986,9 +17986,9 @@ - - - + + + @@ -18007,52 +18007,52 @@ - + - + - - - + + + - + - + - - + + - - - - - - - + + + + + + + - + - - - + + + - - - - + + + + - + - + @@ -18075,7 +18075,7 @@ - + @@ -18102,7 +18102,7 @@ - + @@ -18151,14 +18151,14 @@ - - + + - - + + - + @@ -18170,49 +18170,49 @@ - - + + - - - + + + - + - + - - - + + + - - - - - + + + + + - + - - - - - - + + + + + + - + - + - + - + @@ -18228,7 +18228,7 @@ - + @@ -18241,36 +18241,36 @@ - + - - + + - + - + - + - - + + - - + + - + - + @@ -18286,8 +18286,8 @@ - - + + @@ -18299,18 +18299,18 @@ - - + + - - + + - - + + @@ -18328,7 +18328,7 @@ - + @@ -18358,7 +18358,7 @@ - + @@ -18379,7 +18379,7 @@ - + @@ -18402,38 +18402,38 @@ - + - + - + - + - + - - - - + + + + - + - - + + - + - + @@ -18444,25 +18444,25 @@

- - - - + + + + - + - - - + + + - - + + - - + + @@ -18475,10 +18475,10 @@ - - - - + + + + @@ -18491,37 +18491,37 @@ - - - - - + + + + + - + - - - - - - + + + + + + - - - + + + - + - - + + - - + + @@ -18536,16 +18536,16 @@ - - + + - - + + - - - + + + @@ -18564,46 +18564,46 @@ - - - + + + - - + + - + - - + + - - + + - + - - - + + + - - + + - + - - - + + + @@ -18615,11 +18615,11 @@ - + - - + + @@ -18639,14 +18639,14 @@ - + - + - + @@ -19051,16 +19051,16 @@ - + - - - - + + + + - + @@ -19073,47 +19073,47 @@ - + - - + + - - - - + + + + - + - + - - - - + + + + - - + + - + - - - + + + - - - - + + + + @@ -19128,20 +19128,20 @@ - - - + + + - + - - - - + + + + @@ -19153,23 +19153,23 @@ - + - - - + + + - + - - - + + + - - + + @@ -19181,11 +19181,11 @@ - - - - - + + + + + @@ -19197,8 +19197,8 @@ - - + + @@ -19212,7 +19212,7 @@ - + @@ -19350,56 +19350,56 @@ - + - - - + + + - + - + - + - + - + - + - + - - + + - - - - - + + + + + - + - + - - + + @@ -19414,108 +19414,108 @@ - + - + - - + + - - + + - - - - + + + + - + - - - + + + - - - + + + - - - + + + - - - - + + + + - + - - - - - + + + + + - - - - - + + + + + - - + + - + - + - - + + - + - - + + - - + + - + - + - - + + - + - - + + @@ -19546,23 +19546,23 @@ - + - + - + - + - + - + @@ -19574,7 +19574,7 @@ - + @@ -19598,23 +19598,23 @@ - - - - - + + + + + - - + + - - + + - - + + - + @@ -19629,7 +19629,7 @@ - + @@ -19650,33 +19650,33 @@ - + - + - - - - - + + + + + - + - - - - + + + + - + - + - - + + - + - + @@ -19703,15 +19703,15 @@ - + - + - - - + + + - + @@ -19723,22 +19723,22 @@ - - - + + + - + - - + + - - - - + + + + @@ -19774,32 +19774,32 @@ - + - + - - - + + + - - + + - + - + - - + + @@ -19811,7 +19811,7 @@ - + @@ -19824,12 +19824,12 @@ - + - - - - + + + + @@ -19856,18 +19856,18 @@ - + - - - + + + - + - + - + @@ -19880,7 +19880,7 @@ - + @@ -19896,13 +19896,13 @@ - + - - - - + + + + @@ -19920,36 +19920,36 @@ - + - + - + - + - + - - - + + + - - + + - - - - - + + + + + @@ -19971,9 +19971,9 @@ - + - + @@ -19985,8 +19985,8 @@ - - + + @@ -20008,8 +20008,8 @@ - - + + @@ -20023,9 +20023,9 @@ - - - + + + @@ -20050,9 +20050,9 @@ - + - + @@ -20068,7 +20068,7 @@ - + @@ -20084,7 +20084,7 @@ - + @@ -20101,29 +20101,29 @@ - - + + - + - - - + + + - + - - - - + + + + - - + + @@ -20144,7 +20144,7 @@ - + @@ -20157,23 +20157,23 @@ - + - + - + - - - + + + - + - + @@ -20192,13 +20192,13 @@ - + - + - + @@ -20210,7 +20210,7 @@ - + @@ -20231,13 +20231,13 @@ - + - + - + @@ -20250,38 +20250,38 @@ - - + + - - - - - - - - - - + + + + + + + + + + - - - - - - - + + + + + + + - - - + + + - + - + - - + + @@ -20294,18 +20294,18 @@ - + - + - + - + - + @@ -20317,30 +20317,30 @@ - - + + - + - + - + - - - + + + - + @@ -20355,21 +20355,21 @@ - + - + - + - + - - + + - + @@ -20379,28 +20379,28 @@ - - - + + + - + - + - - + + - + - + @@ -20412,16 +20412,16 @@ - - + + - - - + + + - - + + @@ -20433,63 +20433,63 @@ - + - - + + - + - - - - + + + + - + - + - - + + - + - + - + - + - - - - - - - + + + + + + + - - + + - - + + @@ -20504,30 +20504,30 @@ - + - + - + - + - + - + - + - - - + + + @@ -20544,41 +20544,41 @@

- - + + - + - - + + - - - - + + + + - + - + - + - + - - - - - + + + + + @@ -20587,23 +20587,23 @@ - + - - - + + + - - + + - + - + @@ -20615,51 +20615,51 @@ - + - + - - - - - + + + + + - - + + - + - - + + - + - + - - + + - - + + - + - + - + @@ -20673,68 +20673,68 @@ - + - - + + - + - + - - + + - + - + - + - + - - + + - + - + - - + + - + - + - + - - + + @@ -20752,47 +20752,47 @@ - - - - + + + + - - - - + + + + - - - + + + - + - - + + - - - - - + + + + + - - - - + + + + - + - + - - + + - + @@ -20803,16 +20803,16 @@

- + - - - + + + - + - + @@ -20824,10 +20824,10 @@ - + - + @@ -20839,16 +20839,16 @@ - + - - - - - - - + + + + + + + @@ -20862,47 +20862,47 @@

- - - + + + - + - + - + - - + + - + - + - + - + - + - - - + + + @@ -20958,7 +20958,7 @@ - + @@ -20972,41 +20972,41 @@ - + - + - + - + - + - + - + - + - + - + - - + + @@ -21190,156 +21190,156 @@ - - + + - - - - - + + + + + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - - - - - + + + + + - - + + - + - - - - + + + + - - - - - + + + + + - + - - - - + + + + - - - - - + + + + + - - + + - - - + + + - - - + + + - + - + - - - - + + + + - + - - - + + + - + - + - + - + - + - + - + - - - - - + + + + + - + @@ -21358,19 +21358,19 @@ - + - + - - + + @@ -21403,9 +21403,9 @@ - + - + @@ -22146,21 +22146,21 @@ - + - + - + - + - + - + @@ -22181,7 +22181,7 @@ - + @@ -22200,17 +22200,17 @@ - + - - + + - + - - - + + + @@ -22237,13 +22237,13 @@ - - - + + + - + @@ -22256,128 +22256,128 @@ - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - - + + - + - - - - + + + + - - - - - + + + + + - - - - + + + + - - - + + + - + - - - - - - - + + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - + + + - - - - + + + + @@ -22396,9 +22396,9 @@ - - - + + + @@ -22416,9 +22416,9 @@ - - - + + + @@ -22450,65 +22450,65 @@ - + - - - - - - + + + + + + - + - - - + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - + + + - - - - - + + + + + - + - - + + - - + + @@ -22529,16 +22529,16 @@ - - - - + + + + - + @@ -22553,26 +22553,26 @@ - + - - + + - - + + - + - + @@ -22760,9 +22760,9 @@ - + - + @@ -22775,73 +22775,73 @@ - + - - - + + + - - - - + + + + - - - - + + + + - - + + - - + + - + - - + + - - - + + + - - + + - - + + - + - - - - + + + + - - - + + + - + - - + + - + - + @@ -22852,10 +22852,10 @@

- - + + - + @@ -22866,26 +22866,26 @@

- +
- - + + - - + + - - + + - + - + @@ -22896,10 +22896,10 @@

- - + + - + @@ -22911,22 +22911,22 @@ - - - - + + + + - - + + - - - - + + + + @@ -22948,9 +22948,9 @@ - + - + @@ -22961,10 +22961,10 @@

- - + + - + @@ -22975,27 +22975,27 @@

- - + + - - - + + + - + - - - + + + - - + + @@ -23156,7 +23156,7 @@ - + @@ -29370,7 +29370,7 @@ - + @@ -29628,10 +29628,10 @@ - + - - + + @@ -29643,7 +29643,7 @@ - + @@ -29655,17 +29655,17 @@ - - - + + + - - - - + + + + - - + + @@ -29677,9 +29677,9 @@ - - - + + + @@ -29694,8 +29694,8 @@ - - + + @@ -30018,7 +30018,7 @@ - + @@ -30035,7 +30035,7 @@ - + @@ -30053,7 +30053,7 @@ - + @@ -30194,7 +30194,7 @@ - + @@ -30211,7 +30211,7 @@ - + @@ -30225,7 +30225,7 @@ - + @@ -30282,7 +30282,7 @@ - + @@ -32620,47 +32620,47 @@ - + - - + + - + - + - - + + - + - + - + - - - - + + + + - - - + + + - + @@ -34991,18 +34991,18 @@ - - - - - - + + + + + + - - - + + + @@ -35192,12 +35192,12 @@ - - + + - - + + @@ -35255,8 +35255,8 @@ - - + + @@ -35330,45 +35330,45 @@ - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - + - - - + + + - - + + - - - + + + - + @@ -37722,26 +37722,26 @@ - - + + - - - - + + + + - - - - + + + + - + - + @@ -37760,11 +37760,11 @@ - - - - - + + + + + @@ -37848,39 +37848,39 @@ - - + + - + - + - + - - - - + + + + - + - - - - - - - + + + + + + + @@ -37914,18 +37914,18 @@ - + - + - + @@ -40646,7 +40646,7 @@ - + @@ -40821,25 +40821,25 @@ - - + + - + - - - - + + + + - + - + - - - + + + @@ -40854,71 +40854,71 @@ - + - + - - - - - + + + + + - + - - + + - - + + - - - + + + - - - - + + + + - - - + + + - - + + - + - - - - - - - + + + + + + + - - + + - + - + - - - + + + @@ -40936,12 +40936,12 @@ - + - + - - + + @@ -40956,15 +40956,15 @@ - + - + - + @@ -41115,66 +41115,66 @@ - + - - + + - + - - + + - + - + - + - + - - + + - - + + - - + + - + - - - - - + + + + + - + - + - - + + - + @@ -41182,31 +41182,31 @@ - + - + - + - + - + - + - + - + @@ -41625,27 +41625,27 @@ - + - + - + - - - - - - - + + + + + + + - - + + @@ -41658,36 +41658,36 @@ - - - - + + + + - + - - + + - - - - - - + + + + + + - - + + - - + + - + - + @@ -41701,30 +41701,30 @@ - + - + - + - - - - - - + + + + + + - + - - - + + + - + @@ -41792,18 +41792,18 @@ - + - - + + - - + + - + - - + + @@ -41885,27 +41885,27 @@ - + - - + + - - + + - - - + + + - - - - - - + + + + + + @@ -41920,21 +41920,21 @@ - + - - + + - - + + - - + + @@ -41967,9 +41967,9 @@ - - - + + + @@ -41981,23 +41981,23 @@ - - - + + + - - - - - + + + + + - - + + - - + + @@ -42016,25 +42016,25 @@ - + - + - - - - - + + + + + - + - + @@ -42063,11 +42063,11 @@ - + - + @@ -42101,9 +42101,9 @@ - + - + @@ -42135,7 +42135,7 @@ - + @@ -42294,7 +42294,7 @@ - + @@ -42512,12 +42512,12 @@ - + - - - - + + + + @@ -42532,7 +42532,7 @@ - + @@ -42555,7 +42555,7 @@ - + @@ -42644,25 +42644,25 @@ - - - + + + - + - - - + + + - + - - + + - + @@ -42729,7 +42729,7 @@ - + @@ -42740,13 +42740,13 @@

- + - + - + @@ -42807,36 +42807,36 @@ - - - - - - - - - - + + + + + + + + + + - - - - + + + + - - + + - + - - - + + + @@ -42851,37 +42851,37 @@ - - - + + + - + - - + + - + - - - - + + + + - - + + - + @@ -42898,12 +42898,12 @@ - - - + + + - + @@ -42917,53 +42917,53 @@

- + - + - + - - + + - - - - + + + + - + - - - + + + - - - + + + - + - - - - + + + + - - + + - - - + + + - + @@ -43286,10 +43286,10 @@ - - - - + + + + @@ -43310,9 +43310,9 @@ - - - + + + @@ -43324,15 +43324,15 @@ - + - + - + - - + + @@ -43353,7 +43353,7 @@ - + @@ -43368,64 +43368,64 @@ - + - + - - - + + + - - + + - + - + - - - + + + - - + + - - + + - + - + - - - - + + + + - - + + - + - + - + @@ -43450,27 +43450,27 @@ - - + + - - - - + + + + - + - - - + + + - + @@ -43483,7 +43483,7 @@ - + @@ -43497,11 +43497,11 @@

- - + + - + @@ -43512,9 +43512,9 @@

- - - + + + @@ -43528,7 +43528,7 @@

- + @@ -43540,7 +43540,7 @@ - + @@ -43564,7 +43564,7 @@ - + @@ -43572,23 +43572,23 @@
- - + + - + - + - + - + - + @@ -43619,10 +43619,10 @@ - + - + @@ -43821,14 +43821,14 @@ - + - - - + + + - + @@ -44055,12 +44055,12 @@ - - - - - - + + + + + + @@ -44087,7 +44087,7 @@ - + @@ -44125,11 +44125,11 @@ - - - - - + + + + + @@ -44154,20 +44154,20 @@ - - - - - + + + + + - - - + + + - - + + @@ -44185,20 +44185,20 @@ - - - - - + + + + + - - - + + + @@ -44212,104 +44212,104 @@ - + - - - - + + + + - + - - + + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - - - - - + + + + + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + @@ -44321,7 +44321,7 @@ - + @@ -44333,7 +44333,7 @@ - + @@ -44359,7 +44359,7 @@ - + @@ -44371,12 +44371,12 @@ - - - + + + - + @@ -44388,10 +44388,10 @@ - - - - + + + + @@ -44404,7 +44404,7 @@ - + @@ -44418,7 +44418,7 @@

- + @@ -44430,7 +44430,7 @@ - + @@ -44445,7 +44445,7 @@ - + @@ -44457,9 +44457,9 @@ - - - + + + @@ -44471,7 +44471,7 @@ - + @@ -44486,7 +44486,7 @@ - + @@ -44501,7 +44501,7 @@ - + @@ -44522,8 +44522,8 @@ - - + + @@ -44539,10 +44539,10 @@ - + - + @@ -44561,11 +44561,11 @@ - - + + - + @@ -44577,9 +44577,9 @@ - - - + + + @@ -44591,9 +44591,9 @@ - + - + @@ -44606,7 +44606,7 @@ - + @@ -44619,7 +44619,7 @@ - + @@ -44655,29 +44655,29 @@ - + - - - + + + - + - + - + @@ -44696,7 +44696,7 @@ - + @@ -44709,12 +44709,12 @@ - + - - + + @@ -44726,7 +44726,7 @@ - + @@ -44738,37 +44738,37 @@ - + - + - + - - + + - + - + - + - + - + - + - + @@ -44914,9 +44914,9 @@ - + - + @@ -44931,7 +44931,7 @@ - + @@ -44945,14 +44945,14 @@ - + - + - + - + @@ -44965,7 +44965,7 @@ - + @@ -44978,15 +44978,15 @@ - + - + - + @@ -45372,10 +45372,10 @@ - + - - + + @@ -45394,7 +45394,7 @@ - + @@ -45406,18 +45406,18 @@ - + - - + + - + - - - + + + @@ -45429,7 +45429,7 @@ - + @@ -45441,15 +45441,15 @@ - - + + - + - + - + @@ -45463,26 +45463,26 @@ - + - - + + - - + + - + - + - - + + @@ -45623,26 +45623,26 @@ - + - + - + - - + + - + - + @@ -45671,7 +45671,7 @@ - +