== Quote from Andrei Alexandrescu (seewebsiteforem...@erdani.org)'s article > Associative arrays are today quite problematic because they don't offer > any true iteration. Furthermore, the .keys and .values properties create > new arrays, which is wasteful. > Another issue with associative arrays is that ++a[k] is hacked, which > reflects a grave language limitation. That needs to be replaced with a > true facility. > Any other issues with AAs that you want to see fixed, and ideas guiding > a redesign? > Thanks, > Andrei
I've thought about this a lot, here's a laundry list. 1. Huge AAs (over about 1 million elements) create massive amounts of false pointers. Whether this should be fixed in the AA design or whether the AA design should assume a good GC design and hope we get one is a matter of debate. 2. Every insertion to an AA requires a memory allocation (read: requires taking a lock in a multithreaded program). Again, it's debatable whether an AA design should consider this or whether the real answer is to fix the GC. 3. The structure of AAs means that the GC must scan everything. There is no part of the data structure that can be marked as not having pointers, so that the GC can skip scanning it. This takes forever and a day. 4. AAs are really, really, *really* space inefficient. For *every element* in the array, you have a struct that looks like the following: struct aaA { aaA *left; aaA *right; hash_t hash; /* key */ /* value */ } Assuming 32-bit ints and pointers and zero overhead from other sources, this means you have *at least* 12 bytes per element in wasted space. 5. Everything in the current design is based on RTTI instead of templates. I haven't benchmarked this, but I'd imagine it has to slow things down a little. 6. The array of aaA structs can only have the following sizes: immutable size_t[] prime_list = [ 97UL, 389UL, 1_543UL, 6_151UL, 24_593UL, 98_317UL, 393_241UL, 1_572_869UL, 6_291_469UL, 25_165_843UL, 100_663_319UL, 402_653_189UL, 1_610_612_741UL, 4_294_967_291UL, // 8_589_934_513UL, 17_179_869_143UL ]; I understand that there is theoretical justification for this, but in practice I'd rather have O(N) performance in a few more corner cases in exchange for having my AA not be horribly space-inefficient. I've worked a little on a design that's based simply on two parallel arrays, one for keys and one for values. I used parallel arrays instead of structs to cut down on alignment overhead and so that if one slot has ptrs and the other doesn't, only the one that does can be scanned by the GC. Collisions are resolved by probing in an order defined by a linear congruential random number generator seeded with the hash before computing the modulus. This means that, even if two elements have the same hash in modulus space, as long as their hashes are different in full 32-bit space, the probing sequences for resolving collisions will be completely different. I might have mentioned it here a while back, but I'll post it here for comment. AFAIK it solves every one of the problems listed above. begin 644 LinAA2.d m+rhj...@87-s;v-i871i...@87)R87D@:6UP;&5M96YT871I;v...@=&AA="!U M<V5S(')A;F1O;6EZ960@;&EN96%R(&-O;F=R=65N=&EA;`T*("H@<')O8FEN M9R!F;W(@8V]L;&ES:6]N(')E<V]L=71I;vxn...@*@T*("h...@0gdz("!$879I M9"!3:6UC:&$-"b`j...@*b!,:6-E;g...@t*("h...@0f]o<w...@4v]f='=A<F4@ M3&EC96YS92`M(%9E<G-I;VX@,2XP("t...@075g=7-t(#$W=&@L(#(P,#,-"B`J m...@*b!097)M:7-S:6]N(&ES(&AE<F5B>2!G<F%N=&5D+"!F<F5E(&]F(&-H M87)g...@=&\...@86yy('!E<G-O;B!O<B!O<F=A;FEZ871I;VX-"B`J(&]B=&%I M;FEN9R!A(&-O<'D@;v...@=&AE('-O9G1W87)E(&%N9"!A8V-O;7!A;GEI;F<@ M9&]C=6UE;G1A=&EO;B!C;W9E<F5D(&)y...@*b!t:&ES(&QI8V5N<v...@*'1H M92`B4V]F='=A<F4B*2!T;R!U<V4L(')E<')O9'5c...@9&ES<&QA>2...@9&ES M=')I8G5T92P-"B`J(&5X96-U=&4L(&%N9"!T<F%N<VUI="!T:&4...@4v]f='=A M<F4L(&%N9"!T;R!P<F5P87)E(&1E<fev871i...@=v]r:W,@;v...@=&AE#0H@ M*B!3;v9t=v%r...@86yd('1O('!E<FUI="!T:&ER9"UP87)T:65S('1O('=H M;v...@=&AE(%-O9G1W87)E(&ES(&9U<FYI<VAE9"!T;PT*("h...@9&\@<V\L(&%L M;"!S=6)J96-T('1O('1H92!F;VQL;W=I;F<z...@*@T*("h...@5&AE(&-O<'ER M:6=H="!N;W1I8V5S(&EN('1H92!3;V9T=V%R92!A;f...@=&AI<R!E;G1I<F4@ M<W1A=&5M96YT+"!I;F-L=61I;F<-"B`J('1H92!A8F]V92!L:6-E;G-E(&=R M86YT+"!T:&ES(')E<W1R:6-T:6]N(&%N9"!T:&4...@9f]l;&]W:6YG(&1I<V-L M86EM97(l...@*b!m=7-t(&)E(&EN8VQU9&5D(&EN(&%L;"!C;W!I97,@;V8@ M=&AE(%-O9G1W87)E+"!I;B!W:&]L92!O<B!I;B!P87)T+"!A;F0-"B`J(&%L M;"!D97)I=F%T:79E('=O<FMS(&]F('1H92!3;v9t=v%r...@=6yl97-s('-U M8V@@8V]P:65S(&]R(&1E<FEV871I=F4-"B`J('=O<FMS(&%R92!S;VQE;'D@ M:6...@=&AE(&9O<FT@;V8@;6%C:&EN92UE>&5C=71A8FQE(&]B:F5C="!C;V1E M(&=E;F5R871E9"!B>0T*("h...@82!s;W5R8V4@;&%N9W5A9V4@<')O8V5S<V]R m...@t*("H-"B`J(%1(12!33T945T%212!)4R!04D]6241%1"`B05,@25,B+"!7 M251(3U54(%=!4E)!3E19($]&($%.62!+24Y$+"!%6%!215-3($]2...@*b!) M35!,245$+"!)3D-,541)3D<@0E54($Y/5"!,24U)5$5$(%1/(%1(12!705)2 M04Y42453($]&($U%4D-(04Y404))3$E462P-"B`J($9)5$Y%4U,@1D]2($$@ M4$%25$E#54Q!4B!055)03U-%+"!4251,12!!...@3d].+4e.1e))3D=%345. M5"x...@24x@3...@159%3e0-"B`J(%-(04Q,(%1(12!#3U!94DE'2...@2$],1$52 M4R!/4B!!3EE/3...@1$e35%))0E5424Y'(%1(12!33T945T%212!"12!,24%" M3$4-"B`J($9/4b!!...@1$%-04=%4r!/4B!/5$A%4B!,24%"24Q)5%DL(%=( M151(15(@2...@0t].5%)!0U0L(%1/4...@3u(@3U1(15)725-%+`T*("h...@05)) M4TE.1R!&4D]-+"!/5...@3t8@3U(@2...@0t].3d5#5$e/3B!7251((%1(12!3 M3T945T%212!/4b!4...@55-%($]2($]42$52...@*b!$14%,24Y'4R!)3B!4 m...@4t]&5%=!4d4n...@*b\-"@T*:6UP;W)T('-T9"YT<F%I=',L(&-O<F4N M;65M;W)Y+"!S=&0N:6YT<FEN<VEC+"!C;W)E+F5X8V5P=&EO;BP@<W1D+F%L M9V]R:71H;2P-"B`@("!S=&0N8V]N=CL-"@T*8VQA<W,@2V5Y17)R;W(@.B!% M>&-E<'1I;VX@>PT*("`@('1H:7,H<W1R:6YG(&US9RD@>PT*("`@("`@("!S M=7!E<b...@b2v5y(&5R<F]R(BD[#0H@("`...@?0t*?0t*#0ip<FEV871E(&5N=6T@ M.B!U:6YT('L-"B`@("!%35!462P-"B`@("!54T5$+`T*("`@(%)%34]6140- M"GT-"@T*<W1R=6-T($ME>59A;%)A;F=E*$LL(%8L(&)O;VP@<W1O<F5(87-H M+"!B;V]L('9A;',I('L-"G!R:79A=&4Z#0H@("`@<W1A=&EC(&EF*'9A;',I M('L-"B`@("`@("`...@86qi87,@5B!4.PT*("`@('t...@96qs92![#0h@("`@("`@ M(&%L:6%S($...@5#l-"B`@("!]#0H@("`@<VEZ95]T(&EN9&5X(#T@,#L-"B`@ M("!087)A;&QE;$%!(2A++"!6+"!S=&]R94AA<v...@i(&%A.PT*<'5B;&e...@t* M("`@('1H:7,H4&%r86ql96q!02$h...@5bp@<W1O<F5(87-H*2!A82D@>PT* M("`@("`@("!T:&ES+F%A(#...@86$[#0h@("`@("`@('=H:6QE*&%A+F9L86=S M6VEN9&5X72`A/2!54T5$("8F(&EN9&5X(#...@86$n<W!A8V4I('L-"B`@("`@ M("`@("`@(&EN9&5X*RL[#0H@("`@("`@('T-"B`@("!]#0H-"B`@("!4(&9R M;VYT*"D@>PT*("`@("`@("!S=&%T:6,@:68H=F%L<RD@>PT*("`@("`@("`@ M("`@<F5T=7)N(&%A+G9A;'-;:6YD97A=.PT*("`@("`@("!](&5L<V4@>PT* M("`@("`@("`@("`@<F5T=7)N(&%A+E]K97ES6VEN9&5X73L-"B`@("`@("`@ M?0T*("`@('T-"@T*("`@('9O:60@<&]P1G)O;G0H*2![#0H@("`@("`@(&EN M9&5X*RL[#0H@("`@("`@('=H:6QE*&%A+F9L86=S6VEN9&5X72`A/2!54T5$ M("8F(&EN9&5X(#...@86$n<W!A8V4I('L-"B`@("`@("`@("`@(&EN9&5X*RL[ M#0H@("`@("`@('T-"B`@("!]#0H-"B`@("!B;V]L(&5M<'1Y*"D@>PT*("`@ M("`@("!R971U<FX@:6YD97@@/3...@86$n<W!A8V4[#0H@("`...@?0t*?0t*#0ho M+R!)="=S(&9A<W1E<B!T;R!S=&]R92!T:&4@:&%S:"!I9B!I="=S(&5X<&5N M<VEV92!T;R!C;VUP=71E+"!B=70-"B\O(&9A<W1E<B!N;w...@=&\@:68@:70G M<R!C:&5A<"!T;R!C;vup=7...@t*<')I=F%T92!T96UP;&%T92!S:&]U;&13 M=&]R94AA<v...@h2rd@>PT*("`@(&5n...@8f]o;"!S:&]U;&13=&]R94AA<V@@ M/2`A:7-&;&]A=&EN9U!O:6YT(4L@)B8@(6ES26YT96=R86PA2SL-"GT-"@T* m9fen...@8vqa<W,@4&%R86QL96Q!02A++"!6+"!B;V]L('-T;W)E2&%S:"`] M('-H;W5L9%-T;W)E2&%S:"$H2RDI('L-"G!R:79A=&4Z#0H@("`...@2rh@7VME M>7,[#0H@("`...@5bh@=F%L<SL-"B`@("!u8get...@9fqa9w,[#0H-"B`@("!S M=&%T:6,@:68H<W1O<F5(87-H*2![#0H@("`@("`@(&AA<VA?="H@:&%S:&5S m...@+r\@1F]R(&9A<W0@<F5I;F1E>&EN9RX-"B`@("!]#0H-"B`@("!S:7IE m...@7vqe;F=T:#L@("\O($QO9VEC86P@<VEZ90T*("`@('-I>F5?="!S<&%C M93L@("\O(%-T;W)A9V4@<W!A8V4-"B`@("!S:7IE7W0@;D1E860[("`O+R!. M=6UB97(@;v...@96qe;65N=',@<F5M;W9E9"X-"@T*("`@("\O($=O;v...@=f%l M=65S(&9O<B!A(&QI;F5A<B!C;VYG<G5E;G1I86P@<F%N9&]M(&YU;6)E<B!G M96XN#0H@("`...@96yu;2!M=6P@/2`T.#(W,54[#0H@("`...@96yu;2!M;V0@/2`R M,30...@s-c0w53l-"@T*("`@(&AA<VA?="!G971(87-H*$L@:V5Y*2!C;VYS M="![#0H@("`@("`@('-T871I8R!I9BAI<RA+(#H@;&]N9RD@)b...@2rys:7IE M;V8@/#T@:&%S:%]T+G-I>F5O9BD@>PT*("`@("`@("`@("`@:&%S:%]T(&AA M<V@@/2!C87-T*&AA<VA?="D@:V5Y.PT*("`@("`@("!](&5L<V4@<W1A=&EC M(&EF*&ES*'1Y<&5O9BAK97DN=&](87-H*"DI*2D@>PT*("`@("`@("`@("`@ M:&%S:%]T(&AA<V@@/2!K97DN=&](87-H*"D[#0H@("`@("`@('t...@96qs92![ M#0H@("`@("`@("`@("!H87-H7W0@:&%S:"`]('1Y<&5I9"A+*2YG971(87-H M*"9K97DI.PT*("`@("`@("!]#0H-"B`@("`@("`@<F5T=7)N(&AA<v...@[#0h@ M("`...@?0t*#0h@("`@<VEZ95]T(&9I;F1&;W));G-E<G0H2R!K97DI('L-"B`@ M("`@("`...@875t;R!H87-H1G5L;"`](&=E=$AA<v...@h:V5Y*3L-"B`@("`@("`@ M<F5T=7)N(&9I;F1&;W));G-E<G0H:V5Y+"!H87-H1G5L;"D[#0H@("`...@?0t* M#0H@("`@<W1A=&EC(&EF*'-T;W)E2&%S:"D@>PT*("`@("`@("!S:7IE7W0@ M9FEN9$5X:7-T:6YG*$L@:V5Y*2!C;VYS="![#0H@("`@("`@("`@("!I;6UU M=&%B;&4@:&%S:$9U;&P@/2!G971(87-H*&ME>2D[#0H@("`@("`@("`@("!S M:7IE7W0@<&]S(#T@(&AA<VA&=6QL("4@<W!A8V4[#0H@("`@("`@("`@("!S M:7IE7W0@<F%N9"`](&AA<VA&=6QL("L@,3L-"@T*("`@("`@("`@("`...@=6en M="!F;&%G(#...@=f]i9#l-"B`@("`@("`@("`@('=H:6QE*'1R=64I('L-"B`@ M("`@("`@("`@("`@("!F;&%G(#...@9fqa9w-;<&]S73L-"B`@("`@("`@("`@ M("`@("!...@h:&%S:$9U;&P@/3T@:&%S:&5S6W!O<UT@)B8@:V5Y(#T](%]K M97ES6W!O<UT@)b...@9fqa9r`a/2!%35!462D-"B`@("`@("`@("`@("`@("`@ M("!\?"!F;&%G(#T]($5-4%19*2![#0H@("`@("`@("`@("`@("`@("`@(&)R M96%K.PT*("`@("`@("`@("`@("`@('T-"@T*("`@("`@("`@("`@("`@(')A M;F0@/2!C87-T*'-I>F5?="d...@*&-A<W0H=6QO;F<I(')A;f...@*b!m=6p@)2!M M;V0I.PT*("`@("`@("`@("`@("`@('!O<R`]("AR86YD("L@:&%S:$9U;&PI M("4@<W!A8V4[#0H@("`@("`@("`@("!]#0H@("`@("`@("`@("!R971U<FX@ M9FQA9R`]/2!54T5$(#\@<&]S(#H@<VEZ95]T+FUA>#L-"B`@("`@("`...@?0t* M#0H@("`@("`@('-I>F5?="!F:6YD1F]R26YS97)T*$L@:V5Y+"!I;6UU=&%B M;&4@:&%S:%]T(&AA<VA&=6QL*2![#0H@("`@("`@("`@("!S:7IE7W0@<&]S M(#T@:&%S:$9U;&P@)2!S<&%C93L-"B`@("`@("`@("`@('-I>F5?="!R86YD M(#T@:&%S:$9U;&p...@*r`q.pt*#0h@("`@("`@("`@("!W:&EL92AT<G5E*2![ M#0H@("`@("`@("`@("`@("`@:68H*&AA<VAE<UMP;W-=(#T](&AA<VA&=6QL M("8F(%]K97ES6W!O<UT@/3T@:V5Y*2!\?`T*("`@("`@("`@("`@("`@("`@ M(&9L86=S6W!O<UT@(3...@55-%1"D@>PT*("`@("`@("`@("`@("`@("`@("`@ M("!B<F5A:SL-"B`@("`@("`@("`@("`@("!]#0H@("`@("`@("`@("`@("`@ M<F%N9"`](&-A<W0H<VEZ95]T*2`H8V%S="AU;&]N9RD@<F%N9"`J(&UU;"`E M(&UO9"D[#0H@("`@("`@("`@("`@("`@<&]S(#...@*')A;f...@*r!h87-h1g5l M;"D@)2!S<&%C93L-"B`@("`@("`@("`@('T-"@T*("`@("`@("`@("`@:&%S M:&5S6W!O<UT@/2!H87-H1G5L;#L-"B`@("`@("`@("`@(')E='5R;B!P;W,[ M#0H@("`@("`@('T-"B`@("!](&5L<V4@>PT*("`@("`@("!S:7ie...@9fen M9$5X:7-T:6YG*$L@:V5Y*2!C;VYS="![#0H@("`@("`@("`@("!I;6UU=&%B M;&4@:&%S:$9U;&P@/2!G971(87-H*&ME>2D[#0H@("`@("`@("`@("!S:7IE M7W0@<&]S(#T@(&AA<VA&=6QL("4@<W!A8V4[#0H@("`@("`@("`@("!S:7IE M7W0@<F%N9"`](&AA<VA&=6QL("L@,3L-"@T*("`@("`@("`@("`...@=6en="!F M;&%G(#...@=f]i9#l-"B`@("`@("`@("`@('=H:6QE*'1R=64I('L-"@T*("`@ M("`@("`@("`@("`@(&9L86<@/2!F;&%G<UMP;W-=.PT*("`@("`@("`@("`@ M("`@(&EF*"A?:V5Y<UMP;W-=(#T](&ME>2`F)B!F;&%G("$]($5-4%19*2!\ M?"!F;&%G(#T]($5-4%19*2![#0H@("`@("`@("`@("`@("`@("`@(&)R96%K M.PT*("`@("`@("`@("`@("`@('T-"@T*("`@("`@("`@("`@("`@(')A;F0@ M/2!C87-T*'-I>F5?="d...@*&-A<W0H=6QO;F<I(')A;f...@*b!m=6p@)2!M;V0I M.PT*("`@("`@("`@("`@("`@('!O<R`]("AR86YD("L@:&%S:$9U;&PI("4@ M<W!A8V4[#0H@("`@("`@("`@("!]#0H@("`@("`@("`@("!R971U<f...@9fqa M9R`]/2!54T5$(#\@<&]S(#H@<VEZ95]T+FUA>#L-"B`@("`@("`...@?0t*#0h@ M("`@("`@('-I>F5?="!F:6YD1F]R26YS97)T*$L@:V5Y+"!I;6UU=&%B;&4@ M:&%S:%]T(&AA<VA&=6QL*2![#0H@("`@("`@("`@("!S:7IE7W0@<&]S(#T@ M:&%S:$9U;&P@)2!S<&%C93L-"B`@("`@("`@("`@('-I>F5?="!R86YD(#T@ M:&%S:$9U;&p...@*r`q.pt*#0h@("`@("`@("`@("!W:&EL92AF;&%G<UMP;W-= M(#T](%53140@)b...@7vme>7-;<&]S72`A/2!K97DI('L-"B`@("`@("`@("`@ M("`@("!R86YD(#...@8v%s="AS:7IE7W0I("AC87-T*'5L;VYG*2!R86YD("H@ M;75L("4@;6]D*3L-"B`@("`@("`@("`@("`@("!P;W,@/2`H<F%N9"`K(&AA M<VA&=6QL*2`E('-P86-E.PT*("`@("`@("`@("`...@?0t*#0h@("`@("`@("`@ M("!R971U<FX@<&]S.PT*("`@("`@("!]#0H@("`...@?0t*#0h@("`...@=f]i9"!A M<W-I9VY.;U)E:&%S:$-H96-K*$L@:V5Y+"!6('9A;"P@:&%S:%]T(&AA<VA& M=6QL*2![#0H@("`@("`@('-I>F5?="!I(#...@9fen9$9o<DEN<V5R="AK97DL M(&AA<VA&=6QL*3L-"B`@("`@("`...@=f%l<UMI72`]('9A;#L-"B`@("`@("`@ M:6UM=71A8FQE('5I;g...@9fqa9r`](&9L86=S6VE=.PT*("`@("`@("!I9BAF M;&%G("$](%53140I('L-"B`@("`@("`@("`@(&EF*&9L86<@/3...@4d5-3u9% M1"D@>PT*("`@("`@("`@("`@("`@(&Y$96%D+2T[#0H@("`@("`@("`@("!] M#0H@("`@("`@("`@("!?;&5N9W1H*RL[#0H@("`@("`@("`@("!F;&%G<UMI M72`](%53140[#0H@("`@("`@("`@("!?:V5Y<UMI72`](&ME>3L-"B`@("`@ M("`...@?0t*("`@('T-"@T*("`@('9O:6...@87-s:6=N3F]296AA<VA#:&5C:RA+ M(&ME>2...@5b!v86pi('L-"B`@("`@("`@<VEZ95]T(&D@/2!F:6YD1F]R26YS M97)T*&ME>2D[#0H@("`@("`@('9A;'-;:5T@/2!V86P[#0H@("`@("`@(&EM M;75T86)L92!U:6YT(&9L86<@/2!F;&%G<UMI73L-"B`@("`@("`@:68H9FQA M9R`A/2!54T5$*2![#0H@("`@("`@("`@("!I9BAF;&%G(#T](%)%34]6140I M('L-"B`@("`@("`@("`@("`@("!N1&5A9"TM.PT*("`@("`@("`@("`...@?0t* M("`@("`@("`@("`...@7vqe;F=T:"LK.PT*("`@("`@("`@("`...@9fqa9w-;:5T@ M/2!54T5$.PT*("`@("`@("`@("`...@7vme>7-;:5T@/2!K97D[#0H@("`@("`@ M('T-"B`@("!]#0H-"B`@("!V;VED(')E:&%S:$EF3F5C97-S87)Y*"D@>PT* M("`@("`@("!I9BAC87-T*')E86PI("A?;&5N9W1H("L@;D1E860I("\@<W!A M8V4@/"`P+C<I('L-"B`@("`@("`@("`@(')E='5R;CL-"B`@("`@("`...@?0t* M("`@("`@("!R97-E<G9E*'-P86-E("H@,BD[#0H@("`...@?0t*#0h@("`...@+r\@ M1'5M;7...@8v]n<W1R=6-T;W(@;VYL>2!U<V5D(&EN=&5R;F%L;'DN#0H@("`@ M=&AI<RAB;V]L(&1U;6UY*2![?0T*#0IP=6)L:6,Z#0H-"B`@("!T:&ES*'-I M>F5?="!I;FET4VEZ92`](#$P*2![#0H@("`@("`@("\O:6YI=%-I>F4@/2!N M97AT4VEZ92AI;FET4VEZ92D[#0H@("`@("`@(%]K97ES(#...@8v%s="A+*BD@ M1T,N;6%L;&]C*&EN:713:7IE("h...@2rys:7IE;V8L#0H@("`@("`@("`@("`H M='EP96ED*$LI+F9L86=S*2`_(&-A<W0H1T,N0FQK071T<BD@,"`Z#0H@("`@ M("`@("`@("!'0RY";&M!='1R+DY/7U-#04XI.PT*("`@("`@("!V86QS(#T@ M8V%S="a6...@1t,N;6%L;&]C*&EN:713:7IE("h...@5bys:7IE;V8L#0H@("`@ M("`@("`@("`H='EP96ED*%8I+F9L86=S*2`_(&-A<W0H1T,N0FQK071T<BD@ M,"`Z#0H@("`@("`@("`@("!'0RY";&M!='1R+DY/7U-#04XI.PT*#0H@("`@ M("`@('-T871I8R!I9BAS=&]R94AA<v...@i('L-"B`@("`@("`@("`@(&AA<VAE M<R`](&-A<W0H:&%S:%]T*BD-"B`@("`@("`@("`@("`@("`@("`...@1t,N;6%L M;&]C*&EN:713:7IE("H@:&%S:%]T+G-I>f5o...@1t,N0FQK071T<BY.3U]3 M0T%.*3L-"B`@("`@("`...@?0t*#0h@("`@("`@(&9L86=S(#...@*&YE=R!U8GET M95MI;FET4VEZ95TI+G!T<CL-"B`@("`@("`@<W!A8V4@/2!I;FET4VEZ93L- M"B`@("!]#0H-"B`@("`O+R\-"B`@("!V;VED(')E:&%S:"@I('L-"B`@("`@ M("`@<F5S97)v92a...@h,3`L(%]L96YG=&@@*B`R*2D[#0H@("`...@?0t*#0h@ M("`...@+r\o#0h@("`...@=f]i9"!R97-E<G9E*'-I>F5?="!N97=3:7IE*2![#0H@ M("`@("`@('-C;W!E('1Y<&5O9BAT:&ES*2!N97=486)L92`](&YE=R!T>7!E M;V8H=&AI<RDH;F5W4VEZ92D[#0H-"B`@("`@("`...@=f5r<VEO;BAA;&PI('L- M"B`@("`@("`@("`@('-T871I8R!I9BAS=&]R94AA<v...@i('L-"B`@("`@("`@ M("`@("`@("!N97=486)L92YS<&%C92`](&UI;BA'0RYS:7IE3V8H;F5W5&%B M;&4N7VME>7,I("\...@2rys:7IE;V8L#0H@("`@("`@("`@("`@("`@("`@("`@ M("`@("`@("`@("`@("`...@1t,N<VEZ94]F*&YE=U1A8FQE+G9A;',I("\...@5bys M:7IE;V8L#0H@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ M1T,N<VEZ94]F*&YE=U1A8FQE+F9L86=S*2`O('5B>71E+G-I>F5O9BP-"B`@ M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("!'0RYS:7IE3V8H M;F5W5&%B;&4N:&%S:&5S*2`O(&AA<VA?="YS:7IE;V8I.PT*("`@("`@("`@ M("`...@?2!e;'-E('L-"B`@("`@("`@("`@("`@("!N97=486)L92YS<&%C92`] M(&UI;BA'0RYS:7IE3V8H;F5W5&%B;&4N7VME>7,I("\...@2rys:7IE;V8L#0H@ M("`@("`@("`@("`@("`@("`@("`@("`...@1t,N<VEZ94]F*&YE=U1A8FQE+G9A M;',I("\...@5bys:7IE;V8L#0H@("`@("`@("`@("`@("`@("`@("`@("`...@1t,N M<VEZ94]F*&YE=U1A8FQE+F9L86=S*2`O('5B>71E+G-I>F5O9BD[#0H@("`@ M("`@("`@("!]#0H@("`@("`@("`@("!N97=486)L92YF;&%G<ULP+BYN97=4 M86)L92YS<&%C95T@/2`P.PT*("`@("`@("!]#0H-"B`@("`@("`...@9f]r96%c M:"AI.R`P+BYS<&%C92D@>PT*("`@("`@("`@("`@:68H9FQA9W-;:5T@/3T@ M55-%1"D@>PT*("`@("`@("`@("`@("`@('-T871I8R!I9BAS=&]R94AA<v...@i M('L-"B`@("`@("`@("`@("`@("`@("`@;F5W5&%B;&4N87-S:6=N3F]296AA M<VA#:&5C:RA?:V5Y<umi...@=f%l<UMI72P@:&%S:&5S6VE=*3L-"B`@("`@ M("`@("`@("`@("!](&5L<V4@>PT*("`@("`@("`@("`@("`@("`@("!N97=4 M86)L92YA<W-I9VY.;U)E:&%S:$-H96-K*%]K97ES6VE=+"!V86QS6VE=*3L- M"B`@("`@("`@("`@("`@("!]#0H@("`@("`@("`@("!]#0H@("`@("`@('T- M"@T*("`@("`@("!T:&ES+F9R964H*3L-"@T*("`@("`@("!F;W)E86-H*'1I M+"!E;&5M.R!N97=486)L92YT=7!L96]F*2![#0H@("`@("`@("`@("!T:&ES M+G1U<&QE;V9;=&E=(#...@96qe;3L-"B`@("`@("`...@?0t*("`@('T-"@T*("`@ M("\O+PT*("`@(')E9B!6(&]p26y...@h2r!i;F1E>"D@>PT*("`@("`@("!S M:7IE7W0@:2`](&9I;F1%>&ES=&EN9RAI;F1E>"D[#0H@("`@("`@(&EF*&D@ M/3T@<VEZ95]T+FUA>"D@>PT*("`@("`@("`@("`...@=&AR;W<@;F5W($ME>45R M<F]R*")#;W5L9"!N;w...@9fen9"!K97D@(B!^('1O(7-T<FEN9RAI;F1E>"DI M.PT*("`@("`@("!](&5L<V4@>PT*("`@("`@("`@("`@<F5T=7)N('9A;'-; M:5T[#0H@("`@("`@('T-"B`@("!]#0H-"B`@("`O+R\-"B`@("!6(&]P26YD m...@h2r!i;F1E>"d...@8v]n<W0@>PT*("`@("`@("!S:7IE7W0@:2`](&9I;F1% M>&ES=&EN9RAI;F1E>"D[#0H@("`@("`@(&EF*&D@/3T@<VEZ95]T+FUA>"D@ M>PT*("`@("`@("`@("`...@=&AR;W<@;F5W($ME>45R<F]R*")#;W5L9"!N;W0@ M9FEN9"!K97D@(B!^('1O(7-T<FEN9RAI;F1E>"DI.PT*("`@("`@("!](&5L M<V4@>PT*("`@("`@("`@("`@<F5T=7)N('9A;'-;:5T[#0H@("`@("`@('T- M"B`@("!]#0H-"B`@("`O+R\-"B`@("!V;VED(&]P26YD97A!<W-I9VXH5B!V M86PL($L@:6y...@i('L-"B`@("`@("`...@87-s:6=N3F]296AA<VA#:&5C:RAI M;F1E>"p...@=f%l*3l-"B`@("`@("`@<F5H87-H269.96-E<W-A<GDH*3L-"B`@ M("!]#0H-"B`@("`O+R\-"B`@("!+97e686q286yg92$h...@5bp@<W1O<F5( M87-H+"!F86QS92D@:V5Y<r...@i('L-"B`@("`@("`@<F5T=7)N($ME>59A;%)A M;F=E(2A++"!6+"!S=&]R94AA<v...@l(&9A;'-E*2AT:&ES*3L-"B`@("!]#0H- M"B`@("`O+R\-"B`@("!+97e686q286yg92$h...@5bp@<W1O<F5(87-H+"!T M<G5E*2!V86QU97,H*2![#0H@("`@("`@(')E='5R;B!+97E686Q286YG92$H m...@5bp@<W1O<F5(87-H+"!T<G5E*2AT:&ES*3L-"B`@("!]#0H-"B`@("`O M+R\-"B`@("!6(')E;6]V92A+(&EN9&5X*2![#0H@("`@("`@('-I>F5?="!I M(#...@9fen9$5x:7-T:6YG*&EN9&5X*3L-"B`@("`@("`@:68H:2`]/2!S:7IE M7W0N;6%X*2![#0H@("`@("`@("`@("!T:')O=R!N97<@2V5Y17)R;W(H(D-O M=6QD(&YO="!F:6YD(&ME>2`B('x...@=&\A<W1R:6YG*&EN9&5X*2D[#0H@("`@ M("`@('t...@96qs92![#0h@("`@("`@("`@("!?;&5N9W1H+2T[#0H@("`@("`@ M("`@("!N1&5A9"LK.PT*("`@("`@("`@("`...@9fqa9w-;:5T@/2!214U/5D5$ M.PT*("`@("`@("`@("`@<F5T=7)N('9A;'-;:5T[#0H@("`@("`@('T-"B`@ M("!]#0H-"B`@("`O+R\-"B`@("!6*B!O<$EN7W(H2R!I;F1E>"D@>PT*("`@ M("`@("!S:7IE7W0@:2`](&9I;F1%>&ES=&EN9RAI;F1E>"D[#0H@("`@("`@ M(&EF*&D@/3T@<VEZ95]T+FUA>"D@>PT*("`@("`@("`@("`@<F5T=7)N(&YU M;&P[#0H@("`@("`@('t...@96qs92![#0h@("`@("`@("`@("!R971U<f...@=f%l M<R`K(&D[#0H@("`@("`@('T-"B`@("!]#0H-"B`@("`O*BI!;&QO=W,@9F]R M(&1E;&5T:6YG('1H92!C;VYT96YT<R!O9B!T:&4...@87)R87D@;6%N=6%L;'DL M(&EF('-U<'!O<G1E9`T*("`@("`J(&)Y('1H92!'0RXJ+PT*("`@('9O:60@ M9G)e...@i('L-"B`@("`@("`...@1t,N9G)E92@@8V%S="AV;ved...@=&AI<RY? M:V5Y<RD[#0H@("`@("`@($=#+F9R964H(&-A<W0H=F]I9"HI('1H:7,N=F%L M<RD[#0H@("`@("`@($=#+F9R964H(&-A<W0H=F]I9"HI('1H:7,N9FQA9W,I M.PT*#0H@("`@("`@('-T871I8R!I9BAS=&]R94AA<v...@i('L-"B`@("`@("`@ M("`@($=#+F9R964H(&-A<W0H=F]I9"HI('1H:7,N:&%S:&5S("D[#0H@("`@ M("`@('T-"B`@("!]#0H-"B`@("`O+R\-"B`@("!S:7IE7W0@;&5N9W1H*"D@ M>PT*("`@("`@("!R971U<f...@7vqe;F=T:#L-"B`@("!]#0I]#0H-"FEM<&]R M="!S=&0N<F%N9&]M+"!S=&0N8V]N=')A8W1S+"!S=&0N<W1D:6\[#0H-"B\O M(%1E<W0@:70@;w...@t*=f]i9"!M86EN*"D@>PT*#0H@("`@<W1A=&EC('-T M<FEN9R!R86YD4W1R:6YG*')e...@97ap96-t961,96YG=&@I('L-"B`@("`@ M("`@<W1R:6YG(')E=#L-"B`@("`@("`@<F5A;"!C=71O9F8@/2`Q+C!,("\@ M97AP96-T961,96YG=&@[#0H@("`@("`@(')E86P@<F%N9$YU;2`]('5N:69O M<FTH,"XP3"P@,2XP3"D[#0H-"B`@("`@("`...@=vai;&4H<F%N9$YU;2`^(&-U M=&]F9BD@>PT*("`@("`@("`@("`@<F5T('X]('5N:69O<FTA(EM=(b...@g82<L M("=Z)RD[#0H@("`@("`@("`@("!R86YD3G5M(#...@=6yi9f]r;2...@p+c!,+"`Q M+C!,*3L-"B`@("`@("`...@?0t*#0h@("`@("`@(')E='5R;B!R970[#0H@("`@ M?0T*#0H-"B`@("!S=')I;F=;<W1R:6YG72!B=6EL=&EN.PT*("`@(&%U=&\@ M;7E!02`](&YE=R!087)A;&QE;$%!(2AS=')I;F<L('-T<FEN9RDH*3L-"@T* M("`@(&9O<f5...@h:3L@,"XN,3`P7S`P,"D@>PT*("`@("`@("!A=71O(&UY M2V5Y(#T@<F%N9%-T<fe...@r,"D[#0H@("`@("`@(&%U=&\@;7E686P@/2!R M86YD4W1R:6YG*#(P*3L-"B`@("`@("`...@8g5i;'1I;EMM>4ME>5T@/2!M>59A M;#L-"B`@("`@("`@;7E!05MM>4ME>5T@/2!M>59A;#L-"B`@("!]#0H-"B`@ M("!E;F9O<F-E*&UY04$N;&5N9W1H(#T](&)U:6QT:6XN;&5N9W1H*3L-"B`@ M("!F;W)E86-H*&ME>3L@;7E!02YK97ES*2![#0H@("`@("`@(&5N9F]R8V4H M;7E!05MK97E=(#T](&)U:6QT:6Y;:V5Y72D[#0H@("`...@?0t*#0h@("`...@875t M;R!K97ES(#...@8g5i;'1I;BYK97ES.PT*("`@(')A;F1O;5-H=69F;&4H:V5Y M<RD[#0H@("`...@9f]r96%c:"AT;U)E;6]V93L@:V5Y<ULP+BXQ,#`P72D@>PT* M("`@("`@("!B=6EL=&EN+G)E;6]V92AT;U)E;6]V92D[#0H@("`@("`@(&UY M04$N<F5M;W9E*'1O4F5M;W9E*3L-"B`@("!]#0H-"@T*("`@(&UY04$N<F5H M87-H*"D[#0H@("`...@96yf;W)C92AM>4%!+FQE;F=T:"`]/2!B=6EL=&EN+FQE M;F=T:"D[#0H@("`...@9f]r96%c:"AK+"!V.R!B=6EL=&EN*2![#0H@("`@("`@ M(&5N9F]R8V4H:R!I;B!M>4%!*3L-"B`@("`@("`...@96yf;W)C92@@*BAK(&EN M(&UY04$I(#T]('8I.PT*("`@('T-"@T*("`@('-T<FEN9UM=(&UY5F%L=65S M.PT*("`@(&9O<f5...@h=f%l.r!m>4%!+G9A;'5E<RD@>PT*("`@("`@("!M M>59A;'5E<R!^/2!V86P[#0H@("`...@?0t*#0h@("`@<W1R:6YG6UT@;7E+97ES M.PT*("`@(&9O<f5...@h:V5Y.R!M>4%!+FME>7,I('L-"B`@("`@("`@;7E+ M97ES('X](&ME>3L-"B`@("!]#0H-"B`@("!A=71O(&)U:6QT:6Y+97ES(#T@ M8G5I;'1I;BYK97ES.PT*("`@(&%U=&\...@8g5i;'1I;E9A;',@/2!B=6EL=&EN M+G9A;'5E<SL-"B`@("!S;W)T*&)U:6QT:6Y686QS*3L-"B`@("!S;W)T*&)U M:6QT:6Y+97ES*3L-"B`@("!S;W)T*&UY2V5Y<RD[#0H@("`@<V]R="AM>59A M;'5E<RD[#0H@("`...@96yf;W)C92AM>4ME>7,@/3...@8g5i;'1I;DME>7,I.PT* M("`@(&5N9F]R8V4H;7E686QU97,@/3...@8g5i;'1I;E9A;',I.PT*#0H@("`@ B=W)I=&5L;b...@b4&%S<V5D(&%L;"!T97-T<RXB*3L-"GT-"@`` ` end