V61%DHDURZ1.BITNET@cunyvm.cuny.edu (Ronald Lamprecht) (07/20/89)
This is a collection of patches that provid a general performance increase of 11% to 35% for the ST. One important patch should also be valid for the PC and I would guess, that the result is a speedup of 3 to 7%. The Improvements: - Elimination of unnecessary multiplications in proc.c message stuff: (This is common to ST and PC !) Did you know that every message causes 4 pointer multiplications during the phase where all interrupts are blocked ? And 3 of them could be avoided ! The multiplications are hidden in the statements "proc_addr(caller)" what expands to "&proc[NR_TASKS+caller]" causing a pointer multiplication that cannot be avoided. But there is no reason to repeat this calculation in every subroutine. Instead of transfering only the caller number the related pointer to the process structure could and should be passed, too. Furthermore even to 'sys_call' the interrupt handler can pass not only the variable caller (extracted from the external cur_proc) but also the related ptr which can be copied from 'proc_ptr'. By this means all 3 occurences of "proc_addr(caller)" in proc.c (sys_call,mini_send, mini_rec) can be avoided. Only "proc_addr(dest)" remains. You may be astonished, but on the ST this 4 multiplications costs more than 50% of the message passing time (appr. 300 us)! And while the processor executes these multiplications all interrupts are disabled ! On a PC it will not be that expensive because here you have only 16 bit multiplications. But due to my results (see below) for the ST I expect a more than noticable effect for the PC, too. I think this is a good example for "The Book" to show that it is not important to program everthing in assembler, but that you should take care what C statements you choose in time-critical parts. Effected by this patch are: kernel/proc.c - new arguments for sys_call,mini_send,mini_rec elimination of "proc_addr(caller)" changed references for mini_send,mini_rec (notice: "proc_addr(HARDWARE)" will be evaluated by the compiler and causes no multiplication!) kernel/system.c - changed reference to mini_* (PC: please check *.c for further mini_*,sys_call references !) kernel/stmpx.s - changed reference to sys_call (PC: change reference in klib88.s to sys_call !) (PC: please note that the provided ST patches cannot be applied directly, because of different line numbering and additional ST stuff in the old routines. Therefore I would propose, that the first one who applies these patches to the PC should post the appropriated PC cdiffs) There are more hidden multiplications and divisions (ptr differences) in proc.c. But they are in less time critical parts and more difficult to eliminate. So I thinks it's not worth changing them. All further patches apply only to 680x0 processors: - Reduction of 32bit multiplications to 16bit multiplications in _mli.s: The multiplications caused by "&proc[n]" statements will be compiled to _mli.s subroutine calls. 32 bit multiplications are necessary because both the element size and the index n could be greater than 64k (16 bit). But the 680(0,1)0 can only handle 16 bit multiplications. Therefore 4 mulu calls are necessary to realize the 32 bit multiplication. What I have done besides a slight code improvment is introducing a check before executing the multiplications. When both arguments are less 64k I will execute only the low word x low word multiplication and guess the upper LW result. But nevertheless I will execute all 4 multiplications if necessary. Effected by this patch is: lib/_mli.s - which should be substituted by the new one. (don't forget to recompile the lib and copy it to /usr/lib) Of cause this patch affects not only the kernel but all other programs that are linked with the new library. I haven't measured the speedup for average other programs yet. - improved phys_copy routine in optimized assembler: This improvement is based on Dale Schumacher's posting [1],[2] and Klamer Schutte's bug fix [3]. Indeed it's Klamer's version with a few further improvments (more registers used for copy). I didn't apply the patches for the FS as posted in [1] and rejected in [2] by Dale. Effected by this patch are: kernel/copy68k.s - new file containing phys_copy,... kernel/system.c - #if 0 #endif elimination of old C phys_copy I have been disappointed by the results of this patch. It's contribution to the total resulting speed increase is very low. Even though Dale wrote: >This version is >optimized for the typical copy block sizes used most by Minix (determined >by actual profiling, thanks Todd!), he couldn't detect with profiling the time that is wasted during the message handling with all interrupts disabled. In [2] Dale asked: > Also keep in mind that there is a factor of 16 >improvement in floppy performance just around the corner if someone can >find another way of feeding data to the floppy task more efficiently! Measuring a performance increase with synchronized floppy access doesn't make much sense. But you could speed up the floppy access by simply using another interleave factor (see results below). - improved shadow routines in optimized assembler: I rewrote the flipclicks,copyclicks and zeroclicks subroutines in stshadow. Effected by this patch are: kernel/stshadow.c - #if 0 #endif elimination of old C routines kernel/copy68k.s - new file containing assembler routines The speed increase by this patch is quite impressive (see below). - improved message_copy routine in optimized assembler: Instead of using the struct copy statement "*dst_m = *src_m" that is compiled by the ACK compiler to very bad code, I made a phys_copy call, where a special fast copy for messages is provided. This patch can be en/disabled by defining FSTRUCOPY in const.h. Other compilers may produce better structure copying code. Effected by this patch are: kernel/const.h - FSTRUCOPY defined for ST-ACK kernel/proc.c - phys_copy call introduced kernel/copy68k.s - phys_copy optimized for message copies Of course a further perfomance increase could be achieved by writing a special assembler message copy routine. But this routine would be dependent on the message size. My patches would work even if the message size is changed without adapting copy68k.s (only a slight performamce derease would be the consequence) Perfomance report: I have tested the following commands: test for: - img copy : cp minix.img /dev/fd0 phys_copy - vi -> flex: calling flex from vi (both with more than 300k) shadow - flex -? : a page of output to stderr messages - cp : cp /usr/bin/flex /tmp all - make : make make (a realistic application) all Results: old +mli +phys_cpy +shadow +caller_ptr +FSTRUCOPY perf.increase img copy 40"5 39"9 39"9 39"3 39"5 39"3 ? vi->flex 2"85 2"65 2"60 2"30 2"15 2"11 +35.1% flex -? 10"65 9"70 9"66 9"53 8"85 8"50 +25.3% (*) cp 5"48 5"14 5"04 5"05 4"41 4"39 +24.8% make 4'40" 4'12" +11.1% (*) after linking FS,MS with the _mli enhanced library version a further performance increase to 8"26 = 28.9% could be measured! (The time are measured by hand for 1 to 3 test calls -- thus giving 1/100 s values does not always make sense) Besides the floppy copy the results are quite impressive. Even make make that spends a lot of time in usermode shows a speed increase of 11%. Floppy access is overlapped by the rotation synchronization and therefor not a good test object. But floppy access depends on the used interleave factor. Because Dale's results [1] for the old kernel are extremly high: >1:30 of wall-clock time under my older kernel (around 0:55 with a >GCC-compiled kernel), but it only takes 0:12 seconds now! I made some experiments with different interleave factors (all disks formatted with 11 sec./track,1 sided for minix.img): Interleave factor cp minix.img /dev/fd0 cp minix.img /dev/fd0 from harddisk from RAM disk 1 1'01"5 1'02" 2 39"5 35" 3 37"2 36" 4 38"1 41" 5 50"8 53" 6 45"4 44" So I guess Dale uses an interleave of 1. Interesting is also the fact that sometimes the harddisk is faster than the RAM disk due to the DMA usage instead of a 68000 copy operation. MANIFEST: kernel/const.h_cdiff - FSTRUCOPY added kernel/copy68k.s - new file kernel/Makefile_cdiff - copy68k.s added kernel/proc.c_cdiff - message speedup (caller_ptr, FSTRUCOPY) kernel/stmpx.s - changed sys_call arguments kernel/stshadow.c_cdi - copy routines disabled kernel/system.c_cdiff - phys_copy disabled, mini_send arguments changed lib/_mli.s - new version README - this file [1] Fast phys_copy() and direct FS copying by Dale Schumacher from 13 Jun 89 [2] Fast kernel copy BUG! by Dale Schumacher from 15 Jun 89 [3] Fix for phys_copy by Dale Schumacher by Klamer Schutte from 16 Jun 89 All patches have been tested thoroughly within the last few days and should be free of bugs. Wish you a good performance increase and resulting more spare time to make own contributions. The cdiffs and additional files are shared, compressed and uuencoded (Sorry, but I'm on EBCDIC-Bitnet): Bitnet: V61@DHDURZ1 Ronald Lamprecht UUCP: ...!unido!DHDURZ1.bitnet!V61 Theoretische Physik ARPAnet: V61%DHDURZ1.BITNET@CUNYVM.CUNY.EDU (Heidelberg, West Germany) -------------------------------cut here-------------------------------------- table !"#$%&'()*+,-./0123456789:;<=>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ begin 644 fcopy_sh.Z M'YV-9<:@>0,"#X@6()J$65/&3!HV9;Z,(9/&C!D%<\J0 7'BA1<L+^:\&'D"z MA(^$"QL^C#BQHAD0/'AP?'%" 185.%$R= CQ2XP8":B@J0/"2!DQ(&+0 %#y MAHX8,W3 B)$T!XX<-EMHU:D28M"A()3485.UJ@X:-734R%'UJDV<<./*5?$Vx M9PP62^-FW7JWQD&M+6R" &%S!8@@4Q+T #%FS$''+8@$H1)$2I(O4Z@<E#QDw MR>8V-G# &"T8!!,BBD&\J#-'S@LV:<2\)E-ZB)74JUN_COUBC)W2;'"S=@U;v M3-VYR(^#P,%"*0B]6 8_$:(D]1PZ;>#@<4'P>ILP:=QP!P%'SILQX^?DN5ZFu M37HZ<]"$(?/FSG@NI1,,ID,GS_@Q;)RWQGAMM/>&'/YU1P<9W[UG1H!PP)$@t M"-?=$5X:]^4WV'5CO"&>@FN(0<9[=I!1AX-NT/%>>>&I2!!^6(0 @GX@T!&&s M&!"]QR <W)6&!!%2I.:""R^@T5L8;+#AAAPNH '"D$7V]H9[3D)I9(=N7-?Dr MDT0:688<YC'I)(R#T6AE2&?PYU^578:4QAEN(+GEF?W!4<:69,XX&)9:.GE&q M@%N6=]Z6:A*:AYUX[H50#LWY!5A@T8$P776+>:?=>]^%-YZ@Z'6W'AWMO1??p M?/5E&"F-A1($H( $&HB@C@TJ^. ;$4Y8X86FEKDA'5B^%^*("I9XHJPIKBA'o MBZ;*B.J-.2JXXW^TYA':@&_X"*20;8Z!I))B<AEEAU1Z>Z6'?8K[PI=A)GKJn M8&?.D69_<[8YQYMQLA%OE'7>.::&C)&KHI^ .LDIH? ZF6^B+R@0T$ %'02"m M%&7,5R!&&LWT44@CT632PQ$S6 9,,G54$Q9"I3$'"":#$$:_209$1QH>@O#&l M2W"$P2L:99Q,AWQTD&>>'6ELM/(99;CQ)9+D?6G&@=^Y,<;'X8TA1\09R7P1k M%C^54"-!,]2@]=)RU(@S")FY(*G1*&=WH(TIDF>S0!0.-);0;,Q!D!@?VX%Dj MT"" +?;'4 QA4QAN;)0$"'>\,3<(9]21\QPLB&WSWR!,/<=8/:>\\AQV:E0'i M'%:#,,/6(-Q0@@LVV234QTED]W-[1<.G0^I8(%0$;&V$9S/,;H1>AQM&/SW'h M'&$@"$(;F*<!!VS:ODPNRKT/[%B!PX=!-(5TU&'1[)&B4/+)*8/;1LQT$)29g MRH6#$#@((:106FF#@4 $WWDH#L(:;M0G><]EV/%E'L=[G/4^IBW6Y P$2X'#f M&UKTI>,E;WEI:![O3F:B8[GA#/#;S]C@()^JW0%G4U-9DJ '*C!]#CXJ"R&.e M!%2Q'QPF?:.;V=_:T*_%X2V#*K/# LE0L1#@<'4.9,/+("C!YQ7O8V@(&@][d M%Q[*7<=FL$O1R43 J2_,APQR0(&V6B:'%(@ AQ^<7!GP4+/"Z8P@(C !I[;@c M!"E\@3)36,(45K!%B,BA"R)@3!A8$YXSJ(P\"TQ1 Y$G1.4Q;W<>PN'.)J<Mb MX+VA9WC+X0XU8C8AU*%G._L2U$Z6O\I1C7P$F9J=)K>S\"%I#&-!I!MPV,3^a M_8]"=1"#>2X9GCN!( E9 M5\0D<'.1!N#F;X4A]EY@8V #"3>N0B"-Q0AS;@z M+6R9Q.'4V #%C2B0@= D"#(Y]3CLR:$.8\A>"#NT.,)M)#Z*8\-&(EFSX6DDy M<N5[ ^HB%3\CU$$.F93#^$+HRMZ5CR/JF8-$ME429&+SFW#HF7P*9T<]1B\,x MPUOF(XEI3$6.36_'8A8!M]5 %(RQEV$(9\7,8!X:(O.C7ZH78^[Y!4ZE 1Bw MN*0([6;1CTVSFN3I)>*2"+=&PI2 M$K#2$O*D2HF5 XGJ.0QDWBR OU2A&S v M80P;<\^B"2]T5#3/&*Q(!BQJD:-=S&,3I0<"% 1TH$EB0>[<D(8O9*1P+,#Au M6MLZM3&\U*>1#(,.@T;)LQD3!%D]#U>]RL/K>-&3F<K2/.,WF"S8[SL S.MUt M/&0RG)$A<C'M&?G&=KY2GFPIA!SB(9V7I7Y=IZD'*H-%"0>"&L! :S)$)O6(s M=[UVSNN"-4I#@<H:A@@Q272C 0%K4B"C(*3O@ROY&PZY.;P#@6", ;GD 3-9r MM= :,H*J/-FV2(BN$VHWA!0A'HYZB,,G]&YEZTM#SRPTPOQ!\F.+Y!\9BS8Oq M__VT@%4#X<?J1Q3YV-=#?XV!#6"J7KD^<+03K*1,301?@K0!@);#W,G,6H:/p MX2U =WBIWY!YOL.-T4[AQ.'*]@G?A4KT9=H:[W,MXK*^.1>9@8/G&^2)P\.5o MT@UK$%O*-,>X&6]DC&'(#D1<'#81 %$(,UY#'O^)SCOL#V69X^0C6:DV?!(.n MDP01U!E\24-7XC.)N&TB1#/B3#MB5J;Q!0%_XY;.C=B((3C45@C#V+,A8 ^*m M!9*BFNTGD!E7K8DO*U +I*9>[)*E9OB<PSQQ6 06BW2=2TU9S6Z6PC)PC['Ql M8X@<C,:&%Y#5849S<O$:EV<4^NVL=53KA=Q:M,O.]0MUQ2&F9TWKY^).=Z3%k M:A6OF,4Z?LF+LJZUL!FS4*)M9&K!G)K3#NBW5[_5U:NN:UG=&T%+!WO8M [Lj M5GF- B14A@A7J$P1#LM>LD2R?TBJ T[%L%2@9F<E<K@VMC%M3CT:4,I!%"UVi M2=N^8&N:TR'Y5*@@0VS"&=N3R;9J@X^W:KK0<][#1D'@=$ >B$"4@#@;0XY5h MX +'^,T,]\PGP]GZ!16P -7;DC?$&8ML32[[9/U^>*936H9.6VH[)W.80 Q>g ML98K^VFD0WF25+[RLDZ\X!>T:4-<#O0FKJ$X.,"!"\Y(H?6@E2PQE[7$AT#Qf MY5'M8^XM,2DW^#.^;N1\DQ;( 1OIWI^J+$*PJ1A%ZDH'8\95YH/!&WX_)D.*e ML%C9/8,-VICI3&'BMMY7++2'D':^ZVCO)8 >VQO4&>Q9OLQHB@;!ZI"=VELBd MKLT^H]4;,@)/GE'.(7*X#C$_]D&"]!:".0LV=3^6=IQ1'<9V1N?B%*AZ9+[>c M/"S"Z?I:8I$YN$_FF__8$8_7^21VM6CYOFX12UMOB@!M7L]#P5%!X/>$O_SXb MF!ZK5CNN8$SB#(#+;R)$(AIH AX+Q4A#- KK36+NNR2"F%,D06JN6US;<@H$a M86-@M@;@0P<G(&7KM39.LG,7-$R9Y!ZT$P0C!')?UD"U=T"O]U< =DP$$1HPz M@ <P$'K"8S>I1W&T@Q 08R+AQ#NA,P,R( ;J%7U$E%VD(V PV#/6-8.D!3Z]y M\P5M !M3QST_-#8YB&#/LW>0!EAJI%5;X 9X=&>@4FHG4VYN!RYPL!*T(7/_x MY(- >#*7(TN*<WD;E229YX($AH,'MF\35&G+%! "A" XI'=[5#5B\$@&,S8Uw M%T4],R]ZH'SI8U"%,T;+5$/JY'9;%C$E)#FK)',V0 ,YA@("=H8I4'Z4XX$Hv M /-D0(AZ%,;" (+109#%HDW*(-&J%A#J$E@\S&@-19$44??!79N6#W&\T]3u MLS=]2#EF.(I%J(8>LF@R=P6F=SC^]3'T@39X,R^%]4=S !MG@ 8]TR$\E#:"t M8@>EAC(\V$MOH(+#M#)JIW%QV!"=!UVH='E^)%MI.'V9!XS05X<[DT*D%CNOs M" +K=S*-N 8UAC@/01;B*%T4U6[RJ#^)(P<;81 8]GD"28J\>%[ITSB/4U/"r M%2$-Q 17X$F7(T24:#3^4X'SZ'E4N(^@ E4(A)#HR$HO$3QOZ!^$@06,YFB@q MDH2>Y3:49C)"B'>#41POP(48DG,(@5QPHWN%&$E?>!WJ)5TN.3:AMGJ+572Sp MA@+%> (] S9$@V6>9(7)A4S%@3X;T2$2 F5;0W38EAO$$1O'5UXOL7<Z=C*Uo MIS(LB8#]2#G_5G,P)5/;98<6:!Y;%F1SL%H]LWR"QQ ;82'MB$Q'61R^]"J>n M-XQNX)0!!%%5Y69CPSD59B)P@$-^HU='<SUT&39:QF4GDP=EH"(G*(VO8TUHm M8'5:"6%A6$O0(S,)U7]]*#3N5&9?,I.8]CVB^0;^4XTI(P87MQ$Q0P1(\C%3l M(!#-%%(@=(" ))2XM04QT 4LL 4RT 58F9*8M@345"!A,YQ#P1]E@)PQY4<.k M81!;, -=8#:XQ$,5HU[(:9U!]B7(F9'8USN Z20K$TQW0)DA!T*W28WP6%;Uj M-S5G8#(E=#(&M!%^<YJ3Z'D400:)N9=PEP<.>8$GLV%C8P13H#)H.7HMN9K,i M*9WU-C5JX#+IV3O0*9WL)C_!Z8N8UFC!]&@P%6EH^3;T.36T26MOV6FG.2U3h MYS!MZ&0\ 50I AYLA5L<9)K1P@)#DI2S=J,!QQ[NX1@\.@(5P10@, *M-J7\g MMU:J%#J3MQ%V5J0"=9JT@VG":)D_!7WA]7J!M*$GBDP1)D0G$UM,!9,"89X&f M>#)8TDNQ04N)I(7:-#;E8R-D\:;D2"&=LQ%14XM_=C(9"4 89C9%X#_^)#?-e MB*)#=@?F 2J7QE@^8)OPR8(F@T,^0"N!E@:O26244R>&UB];N4(:1R&F>D %d MRGRJ=Z)-<"$&P92?^25KI1&B>J(AE3WQ9QX\T4>E1S@$J'G92 ;M<W>8-C;Dc MI$X-RGV[&D[XV(Z"4JRXA4SM]V0I<P<0M:$5Y( X(U<"=#V?*'A^-)\@>5#>b M97_B!1$C4F,D&IV6JGQSX)>;&C\G(8%V<S\5!CI-M%:..7::9(U_9 ;!ZEPRa M)&"BJEO3J(>K.2NUDC1R #9- W1JP!I[.4M_"*T'8C1A,Z5V4R >LE&+B&D^z MX!#I0SB9B3AA $ R%$P:,4QD8#,K\T_(1+%;:2/YRGS\9!$1)%0I8DP^)'--y M0#7WM(T6B[&$TW1.HZBLIUY.HAY.@P;FP5:GRK/HUQC=1!\YTZ!RE1(.U)/Tx M94N6U#-K%JWG=*@/>7H0LI4A-8(O"JM"!J$RQT>'YU[ZB4T69U\*&T[.16%*w M5Y$H=&'U,8FA";&C&3>DXF265TL\R)JE>JICUA[C)0<U&C^',S68^D@E]C$/v MHCP $D$$R *G6;H:IUWITX=:Q3S)^H61BWG0@T.G)1_T81]CRE@L*J)%*6DRu M6FF;RUA,>KN/VW$.(Z4O$8)66CA8>FMQDFLRU*4@8&>S&WLTR:0YB@,#HI,]t MVC?)E:="NHVQF;F5DYJ8M[OQ T20.:)2\W5U^Y)IF3)Q4 ?J!36N\SAI8%^$s M^U,8IK@J63O[63&S-4 2$2WG2TMHTT2DZIH5<[FRJ;GJ.QBXQ!Z[)$-Z6XZ/r MV4O@](P(_$11&#N I0)D<!T^" *+H0*ML55ML&2F%ZHR1Y7R&K]C$P2=T2_Oq MUE#_U*@PM4O06 :1<SC?$8TK Z8'+"%QMBV1\T$'NSD@E@9(H["J=YJH6L!$p M SYH678\-"*:-Z>UE\2]<VYN\ )I.EY)R$,L.TP62@524 5#\ 10D 6KR2?_o M8C9/('(R_"5Y*7.0%7HJ:&&?F8C7\4WA5%6LF@?#],,JRKLL63%MZL7!>T3[n MBFG:ZR];@A!%D1EM_,9Q3*TL.U+.E1DM8,-+<&U,^FF8;,147$<D9!Y_G(6Um M5LD2HJ,GD\JE&:8(W,"YL[7.9<5 =8782Y8UE'K*US?Y:8%*,R5/"S51"[]Ll MZW;&*53^DX286F@7)&*&&A!03!80;+Z^?,@)+(:4^)+7^WDVI%HRQT-V$HAMk MLUD?\\U\:$M- $ 2:LZ%&) YUD\H\Q+1Q,?G^C'QC+ ,>'#S&88J<[.MB5O;j MV[UEU8F;PXS.N%S)K$]!!G0\)+7VO$ZAVR]94@;UJW!CB050D,P9JW0*A$\Si M6:;V!2KLX9BB.WD8ELA3TC0E/,E*>=,XC6TL_90'<FD(H5M^1,4@0'&, 3ISh MM1U K1H\9 <O8 9D$((Y+6RJ'"V"@1! <Q G\2!C1-1U-$Q:;1 D-24@<-4Hg MP(Y.PJ[UMTB],P.CL08OM2&X6Q]5W3<081 MX$*#0=1%/$!<>DEP@&;.@BY1f MS5B^O,<Z!SJTQM6@ Y8O (-C_-6J@1V(/=BSEG+1@1#?P1"S1M29_<YDRUN>e MM#="Z1@9F)!O/6^6;1,08[AS,+RS1KV#L0(_F 8@L *JO)4K,"JY6]N^)@<Md MI5,KL,:;#,=R/!AV<K$ND*A?1SM)3<4T ,BX!>#,0,Y( )L,=W5?=V,1=TBc M,#K;7=W2/6O<[=W"]@,V 30ML+)U/1@R( (X$-[M;0/P+0(V -6,U=YLC6GMb M'0/AK=\B\!.UM@)=XP(Q4 (V =EW/1@Q -WR'3_5?0/V7=TV,&"8!M[D/1@Xa MX-[]S5@9[EH!+@,UX (SH#4HH +'-P:3C6DU( (T@ /QL^+.,1@K#@-+H>(Bz M ,;3@,L3A6TIN/4_>$TX (X8.!8T-F81@,G\-QY1-DWC>0QT-X!_A,$3N0Vy M4>(O%09FD(A]J<93P )-<*'LBDPX^5QNL%!/LQ&$63P ]*DQ4Y_''&\/=]Q.x MNVS0\[X71SH9+@,#MA@R('4YH#7/'$E.=3E3PZQ5#D3=NGR#WIAU^XFH2A7_w M-#H[G4QU\Q=BPQJ,L[_#% ,OL. AN,=ZPP:.0T%O<$!MAR3@NA['0[9OE1$Av M+00YPU<Z,S9<"\YNFC,2QH;U>[^BJ;_^ ZF2NNJ:W=DVD6:0:49_%"":Q<^Zu MQ<S"E1'ZE(T /1!WH%W9[+X8W; %[HM&$+==2[<I@YM?0DT0690V]4A;:K4"t MD;6FNJ7UED_@&#;N-3@]EHTUDC.:)08A&DZ46.MS^[5EL,XE3$R4,ZM^&S& s MN[!,8A.P;I; "1'(2:@GTZ&HBDS4>Z-L^%%3\X, E$3-R#T^$ ,ZD-\R!*Y)r M,F@!\JK=^CL7?3PRJTX-A/$H4#R*DSXPH!9^P:YA8!,^< 1#, 2#-B57.,,Wq MF@)GECF:54S'E!(G<_-/3B$!X2$#GS]W<+1"/!\ /24?\V'")(77ZB3=YW*9p M(TAR\+>BJ_ 3MEWAE:Q.RYU9R*X GA'H\0(@I7'- :M;7,6XFMQM< 8IL+FXo M5$)FWS<*'S\H/G)I@-1]K]3]T]1/;?A&O?=)3<:-[]0PX)4W'=8T)!\"N?:Tn MIOD/$P1- *_V&,#8QN,0%P,G,!71'=6JWQ1?1)/W?=/<O>&TO^)$=^$0-P,Wm M( (R0-DS8 .QCVTU7G0SD.&HG],T$ /#/VRVCVVNY=Z470,ST/S"1N%%AQ8Ll M3MDTH..T X">QY 1]? ?<V_HPUUEC_!\]Q(Q8)YDC^_#I#EU\Z=G;ZWQ91,Ek M^YG-/NM(5#Q=93(Y)F5(L42DUBB'%!!]I(_[. [2@4R(0!,( L]N@-B$\&#!j M?--+6!D>*+A0,5IQ-$B++[()#] )) $C4 0RPR2K9+FD24B$[A,_,)EP<V/$i M[:!ML0PBRZ0%]]I1LP:3':4?10-I3J=1"#MA):Q ES 8,-E"VU%7Q%<]G%,Vh M?K8*\7D)+7 PP+-#]3G*2F_[;7(@<KQ 3I8%P,_,V30U)R1(-IPC;(Q@L:D8g M0H>;R8%W)$5Z(!BT.? AKMD')T@1BN">0BX*8#(T"R[X@P DH4:CC#$&+f M8 ?)PRT[8@"DC,FKR.%L6HT[:B;]:: I0<9BDW 2#L0V.K ,.!DVE[+BAQ0He M D' 1:!FX;)7A(/#& V@>(9@7!E"(V4A$ !5RY]S)T68Z$.V3"I6^2/;!"Gd M[Z!VP@;H@PIAX7<L!ZR !4I446"%&(^*"8$J< 1D!$X[4;E0.Q6G7M@WB I_c M"X:]PRT40_)4%!(?JIIJK0J 1,-=:)P:2/PX4>P).^G"[?21JJ%8BT1B(1L2b M0YL@@0Z-C#H@P^A,^1-\5S%VQH%0',WHK\RGR/,QJ(GJL4_<)V:QKG,B-R@/a M%H@D)*7"A([OE(XJRYXA"D/#QS0MIK',ZAQ&^U"XKI#@EOK#.8Y(L6MVI,/(z MU8?>D:>.169),+1#"*@7HT$'B)H5L $Q @0@1]1!:2 %DA^3(ZQ2('%4XB8y M0) I#PN##MB$*N#&H !18Q=#(@3\CJ#Q!D+ 3B0"/?$GNH ;1!-#P$T$BL)Fx M=:26ES$'U([ZN&5IH/15!BA@7#X3Q?F*)> J9L7V)P22 !5P D6 "@"!(5 %w MG$ 6L )-P 7P1;_H HH 5J0UW:8,\!4V\$S.0.2X O@.!!P!7D4X\L!82A@+v M@R#8-1!@"?-21M@('>%BB 22L#$Z(\B8"2-#>:&QP] 9;(*,0 &DK UI!-95u MI2K":L0;J>CTI('4X\':0#7*.C$".0C'X4@<BZ-Q/(YSP36Z1DSS!8Z'/$(9t M3X)"!,6@./H.AQ/P/ 'L:#G#^"$$($H$(7RJ9U[ "0)VCK;4]7*-R#$]JL?Us MB!R58XQPC3T@/LK'^4@?ZZ-]O(_X,3_JQ_RX'(L 1<@U3*5\P*'W&",&PPA@r M+,"I'3*Y(3#3^A-E$P)X2T8 AK_P*+9"A;R0&#)#:L@-B2$I9$K:CE2!O[D q M&& #A!Q;"%3; L)HPO<#*GK'=!PV!Y )N,<0P!YKI(VLD1.,UDR=%A,_7 "Hp MP -*4?;U2+G7,WID22$Z.]):]<B;92.0))%D+%MQ>- .)\DCV<6/#))($HVIo MIB<QVZ9D<+R18#),#L<9.6S,!@TA"VF 3 J;51@>Z47%D$@BR3RB+W1&(\6Dn MG;R39!*7_+6:&#]BQA/1.-QC.ZZ<-B #7 !9X%&[J)%LA ]YT]I ^SN4F&P7m M?8GE*&QFW@UX*>D-!20:+&@H,:7*$ .99VJ(D^C12^:)=I04?NV2$+6G9BCMl MH,=S$@>BY1$J2EEKR,"CM(,%*58VD%E9((4-&9 !+" ,8*(PP.,0@L/1CG<Rk M689)VN$"9IM-FS7CX]<=RK+".5+ "@B6]@W3R(BHY$E&94Y9>$)R3[ !)C$Mj MN8\,(#K1\DY,2[,"!ZPE"["5M69;?B:$U%$<92QT,Y&QP(1+F+(\9HW1 ))6i M9 T2G;:#:7[ERI$14\IHG('=80<HSF0)(>)1(6T$A3DPR\ 9:)7QPU;:A'])h M!P+F&7B6F"9=8DQJV2ZOY>.C-?(2#162&90^4 "AO)?W3O7H2VPC!OHEIB$>g M=@#66,R!.5$*YN^#. BS)%E,ANDP!21 HQ?3B6+N2X4Y,KG/Y<,".%-G?LSXf MD2[=PZ$D S.@!9 !&L "6@"[/&V#04;@S/+W&3U)@&(/J2='0DMQ-S)MY;NDe M >B2;4Y+MXDUB<X< %<ICOOH/F$C(["F"W RB^%5'H\8@"Y94<'$1/!RV/1-d MJK 8"A*A;!B.DW#N2Y'I9 8#UGR7/Y-OFLN_B<(\T9MP$HYR.DVZ&(0"/L=Qc M,TA]4-B( ;2!:0+$!?%!8R%>]LF78#"%T@AA" &/_\$J..$%A<W=["V'\V Zb M3<X9.#_G\3B7^Q(^J(C*:3FSI>)42N\N7P9)FLDZ"5O0@)WE4EMZSDKU. F2a M_@B=/. DA*#T1G0 !+ED+"=SWL@(P:DKPP:AZIQ/,R-TS(@),AF+\IPUOY+Hz MU,SL2>929ZUAFN528RY-B[D=YN;3;#7UDVJ*.ZLY&+ZFR<R:6U-[6@ZC^>QZy MCL444'J,Z*B![+"4A.5+\9*Y@PQ@SP0J+L]GQMR;LM-Q_CZ#(#A#)_PLG^.Rx M::9/;+,^C6?WW)Z@DW$R!?WI2V:-0>R8A,0FN,XS,$(+IZ@[G.\2A3*6OCDZw M&N?W7*$X='#:3;P9/('F\ 2<4910&E&B@#Z!Y0Q%F4ZS<[90*-I")></+:*3v MTW"B3\19_&1G!"V>W!.*1DZU>3.I*/H$B[+3=#:0@&0!_Y&3:9\424G5FBN"u M/V? NY2<V,9\%M(I"CS1YPP@.E>D@)[0=^D\9XV,(*3L"@^T@%$D0W*E0-J5t M(7%Z#AM"6C"YI@#%-K\S;R9.]>E'9<8G=9^A%(:&C5+*2%4IW-R7D;1MFM)*s MJCTQ*=4J")LT!G52_0%(>27-[*$W\S.Y%7IA$YJ7WU$ F+'/- R$0,=4X!.Dr M&*#1(X"$T:@Q3D(U10.#\"7$!-2H'+ZI3X@!8> K$ 6Q0!9B %MPIVHA!^"\q MMD ,)^0W5:?!L)V^4WE: ]("B*.GQ\$X*@<;P"AN0%Z "XH"!!!4%G #;@"%p MA!0&4DNBC2G@;8C $[@"7R *8)L9D !>@ JH'+\C3HR7H^>X<E?%8"X9X62Ho M@(01*4: 1/T83D"C*B4:T%$_ZH&4(671LHR%8?+11MUS8*F#H3#41J?6$%ACn M*<,"AL&EJ@2TL06)FU!UIA6A-$#5ES 9*L-ER SO(U)XU(?*(;NJ5_VJ7?6Gm M0E.%(4TWXQ'TC!4C-&[3C%$2O&FTH&6G460T4]M85$&#:" -6$ U%E52MAQAl MXPTS&K/Q_.G5EX ;.\_.VHU3K$&V#>!8)Y6E8UV/:C)^V)DGH#Y @!QKC@/&k MQ7D&LW&A7N2\J8X@X#H>CNQ(*P=#=YP7'H<54K$\6$'-'<!Z@Q_RL<K6]$@Fj M&:0@D2*!DE:.+CB@NI+58!@CDK!&) Z8DO)RC SIK7ML.[JN\P"[<@X(6*Y_i MQ%49U[+47&EEZFJNA@^!K0SI&CJ0*ZT$AP DN\HMXBH@)F(>8&DS<C^JU_7*h M7MMK?>R/_Y$%!<@#$2$IY8&,'PGR8P1%!ND;'>1@@Y#+<4)F2*X*5@ML@?60g MM#)$SH 162*O GCL&> 5%P:G=3@-]5-.DPPRLE>"@-\G8!BLB8Q+X"GQ8:#Tf M\<-N4QO(32(,'5ZG!B(-N1-CD2.T<G0\N1%Y S[L=P)?!J'>4" \)NT&6#7Ze M)Q'6$P:!#+L=EX)2H+$?=K<B5Q:P7)?L=35=VN7Y+$J($R-II5\0D3"@QCK8d M 0C.REFS^6=1-N\!V4,HU 9#E260C76VJEGA2$>AY)/LD5>22BI)=G$D]V62c M+)+L@DGN/#O[9MD%J-QC;79(5LDG$6=-7YE$*9MF,'P!)5M=[2RB=9%?H,DVb M6FSC AZMHGVRJPM)6EK."%Z]9)I=LZ 6H:+98?,2T"1Y8 S/D;8YAAR37$OKa MK &N9Y!T2-<X59(80Z/]M*$6U.9)-[ GGZ*?M!& TM7.&S/@-& 7Y[2#A.>9z M=%?L^D_$E(9=.0H+B\@ '%L'0:86E6]509:CI.!/ 4EQ(FV<B &4%OFB1"Ny M[1:QM:9+VW83R>EM,8VEQ)0^0%/"!T[)!CSEC0B5G^F>D$IP>2J?0*KDDT[Sx MD&++8%DLG\.,S+4(U^$<N/D0;@$$8UD,M.8#M=&B(R.R+:]9MV7R/F$!<#MMw MRR7$G34?"/LII8H+N]1M1,F<.E+C$MML&S\^+J;Y0"X.I\F(9-M CBNS)0B[v M]4EH7)NP:&$#;VVN)-36FM#F&3=_'?,$M^*6#;Q;2BH[+VY$H0I-Q+ONR[IAu M+\KE"& .3ZWHJLN,.2QYZ?-TNB>#*AP504IKS*<,?9K8AG+&#XX+();N%XT?t ME[2K;-L-.\<F[;"ANDWSZE)2K=LVAR4>_;IRMYO\OK$K2\\NWSVZQ=9TN5VOs M.W.;B;*UN5"6=,!:GD-T\*[5]:)>5W,"UHVP% ($K: Z.9<;P2ZMRT#-I=:\r M 2\@#,B %A &;$#7?+?:<VR:30R:>EHKJMJM/'1E8)I6@WLWKL]M1$&W:F+,q MF0<#W*6MU)HB%XP&B%T"^A@NC[,!>& IL!OT.CD7Z/ EEL87]:I>UIM\X>X_p M8KY$A>'^3.@K?<\K]DJ[UO=J:M_5VWJ[I@R@ <07;(9-[&%8"<)!"[>#@?R^o M*.J+?G,3QCR^9,#UMH#W._-B@/Q=HO0WA/R3^SM^H^_^/;_#1O@>ROAK,F, n M\J6AW]= A5\L\GP=\/2%P,)& C=0[&LRUR_W3:%O /R*-?&;?SVP^35L$3C]m M6DX3W'X',/SUH)8T 2^<^]N!RR__C<'^]VI:X #L?F^P =:<#W,'LV"%ZH)_l M< B6P;RE^%9@K3EQ<_#RU< KF ,/!AK0A$%PK1'!O,4 7\OM&P:>'P*^PNZ0k MABQA+NR#O3"M <-DN 9T30$3?Y$P!5W SG<+=V$8_(2#L.4<PERS!=!A[&N'j MZ^]@6,-[V";P7I\;=,F +-&]7)<%[-9&9$5YR/NJ1N0D1<"3R%AO/.]DVI=?i M*.]^($\W&ICN\W3$/31='9!.Q$=K"-GCP[5&#"2163.)J_#SQ&IM"$@JU*5@h M$.K1 X;%;Q@*OUN3N7K) U.OC)B@G8> $5["539_">]%]LD&MJ!:Q.N;(VLg MM$8//)?*(3-0K:E=M10"&\\:Z,H2L2OHLQOW!.ADVW]26"[/EK*X@5=*?DEKf MO&9W;:_MD[WC3ZZ!0'G3]$#BU3C5%B'0W+ !>5<7Z5BNPA;;Z(%V/&ZCH+E%e M&NT8U[ @>(Q%&M*S[:"7$JO)6X$R=NNMP[BW9D-4ZMMO:2J7H[^E _<XX+I-d M84EP[>"Q1(_TN!X'L(6,[QQNRZTU$C>G]4WX%[TF<LD%NSK7)OACECL87"YCc M";DZ>9DXWII+72/O/X&N03F 1=HOP5RA;- UNP$4[0+A.\$\:3*'4+IAX%*:b MXAP<D7MRFXO'DTOJ8AO+RUCT;M:MOM(R$@O+F[:3E=.6(KQPF2O'CZ$,NQ:Oa M[!S(R]8I$P2$G)=+[Z\\O:F7_0I@V(N 92\S1IO.N!\.9JI<> /HWV6ET/4Qz M#ZC*W$4Y\PGUS);SEB;2&!I :P!HYCXVX#0;8[X[-^\"L63-&=,U(\_^NW7_y M<+!\I'FY;;IFT;R5=7.P-,VYN34'R]0\=2/&K %Q-B#^8DM66CY Q\Q"K,]Hx M].[+1_QJ"P=A7J[(.?A"80"L?2UP#:[#"!BZ0H5$7)C_[Q#NSMSW]>+@\$R5w MD\(,(,^TV3"?Y]3KG1?S>O:^XOD]MV%@O#;],/>9S\0R/7O-^SQ_\S-\WLKRv M&3$'Z#*LGHNO]A3/,N! "QN+,VMJP)-3SG,9 S?GT,$QT:TWP@*M9KDV8NJ\u M1IDL54;.K-02;SP1EHGIP"96/9UXQGSB^'Q]+R4Q5M"*68+BNV5\02&S[7W*t ME'E?3N/L&)-E\JD4-HXARZ@9;PP=P7&KO<B8AHJ5X\A[CA6''%#')9<=\^1Ws M_)/1,DPNTM=XU.I)58F/[TRPA=*)]!\/"'*KE L/06[*!KG94C4T/6PF0DVVr M%VSZ(9.%LLRETRW83<AU>H4U9(>,%L\M.K[2!*1+5V1YW&X9"^S-E)NR(]M;q M4!F2\VVBQ<O]]M^N2L3IFOVN2R:3$,,].,Q8PEHIE"D9(<M'?("25HC+MI)Vp M_-)@VK'2CC$@J+.G48X?.5GF4@@KC:7]-%J>-7_3)MCIK_QP<3(>Z+Z5>$OGo M&HH\=X,U%A@#:KI81UP\$'/I<IM^O' Z6<GIK125>2ZF)4!7F32OT<-K^&JUn M7Y:=AQKH .6H:W<G]#+*NUA7*_?AVAQP,S3%W=7IF/:42M4LK[\PVV2>PYI7m M@&6Q_';G+Y_.->MZ2F?:J?NNK6Z\ALW-LR6/7&IEEW,-7J;-U19:]]9SG8,!l M<T'6UJIB3M/HJUF,C[%ZSLB-V4QI9CUF>P^4R*[3XCHV1[69&TK:@Y"Z:+FWk M.O_*&D"</7%V)KW75PIC3AQ]@A$P%?L)$MI?^^?#;(P3<WHNP+U3:8>*">Q!j M;W33)L/(&)PA[?T,M$DVT6Z_W0]J=^T1++29]C'6GD<[!B3M8+RT2[;3;K]1i M1VR79ZI=MMTVUD;;"&QK_^*Q;7JOMF)N#BY(;H]LLFU\[7:.-MIY6VUS[;EMh M.0UW>HX!-R Y8U^^38&'MM]FO1.WXB(P$) #UG9_GMJ-^VMS31D@ V" X+Z[g MQEF_\6RH37 5<>'XV?L2%4/BB.VS>7:*#@@KNFVTZ!>]E]*')X;8_WDL"\^-f M=[,;B-[1>IQ$$[IB4:HZ/1K^/%FZ.JV%; GA0O+'T<(VYF0KMN4/- .,P"$5e MGH:A13.?C="(*F]KT-[Q8P2XWH+]/,-WS>L9UF<7Y^S=6SC*-RJ<Q[%:68ICd M3 ,ZG 0 .1G-,4F?VOI*I^_@5@IC+S@-XVM$33H.-@OZT_@[?^-),<UKR?1@c M^+4A91\#:JGF!CZPHIF6 GDIO^E?3#J<;:,>-G"@'7=D.ZBG*;8[1MB_&E/?b M-#BPPE8X"R_42"-=*Y\8OJ\+.&_)R)!ZWDKJCTRIN^5(QM0F65-'[)7LJ1W&a M2RZ0H=H%4!R$(+OFY(1Z,7.*E:7JF;:JOS7[2,@(X255<04&I&P$!51&3PQIz MI"NOYERX[#<[3:92V"0!?D:$_AFLND4^*2O%VDZ"+@[$% (]YP&59,&X9'[Hy MI%2;:"4MHTVK2*++D$9E_$=)Y[<DG]Q(SN;D!D=U"M'M? XF63'8U4 ;)O Lx M5BF:@RO!]7< H^%7>OO<Y&EMBUFI#C>YSK5'1A4LD,+QG2KOG-.Z6D]L!WZ6w M%_7),)0V 0YT\ 2^RD$N'H!2UMIC$]8$OJW#*S"7RN!5.\=EXU;#>\G2M=?:v MTS"@X5=^3<@>\*[EU^&H7',\*B.T>0K>"+P\>JRI21F<XP=+?LL8>UH2RT-*u M=,K @4#?MAF>#QLQ<#^WM_"VHMU\0#D0894DT \S,AIDP+Q-Y^HI7O/ 99:=t M*^";#W.6QK&SN?YTWO1[RD[L*06M>T9\I%(FP 0 $FQR,LR:S.@J7(+LSAI^s MKGK\^2H5G@&=9>^-\7A9"/E)3^@7/0[,FFZT!BBQ\,P??!<I$.YK";4-P_/<r M@"C] ]O-6))W[P+[UIPJ6F*U:&&=<7HZ#;C*V2'OZKE_CH'?. )3Z#03HS.6q MT^2#W/#G'IGJVY"^=%8:T??E&,CJEIFK8^"V3C.'3)2.%JU<<[KOW]$S9(+]p M'MQ]VV0/:)3M?1VSQ;SB8:-J5M"@'HG7.BL5W^-C(R!G\SUTJU2\MM;B.WY/o M]NF,3!E+J]GLQ<C:,.X?7KB_=M96QB$$0"%VYI.;%CN(+AQ!=TA[8N!+N:NVn MY=:^-(#U;CC-O95P@.<.F=O9;N=V!GVZYW7IK=QF._4.]]T.SGS[X@;LR3T,m M+'<6$+@G=W&>W?G7"!N]U_S: _!5)SJR&XG.]KR.@*,Z)G[?O'LZ_>[1/HQOl M^]L^[3LZM1_V*K9 77L\C\UR_7D2[_#0\HXW]?A>4_U9XW5I?B>$NDI^Z&"4k MKH_2PH'/JY1:1_ Y6,&[:R9AX*L4YK76$CX6=_;XT6INJ2?^[NU\J+. HNZZj MM^:(WO !]\,+3_/.HM%[S.S=:$Y& V^ZF7EEYWX/1&'#OYLZY1W@CREV[Y]Fi M5$:+/,8NXDE\=Q_RL9M$1V)/#.$--NZ6ZBY^TL5H6D%TAC2V$=;1HJRWMJ :h MXJ.PNRSJ&)C+4K$O6SVN6%G1<[\X:K-M>EVYP?PM+BOJK-7$J=X1RF]1^Z!.g MO7E=VG8C?]^+/ D&WFW^SW?Y0"^&R;6?+_1"&CY@>0F!Y/L\>9CH.6/Q8C[/f M.G_%-UZQ,&]B![QX@A>#KG>>3]\"YGO?ZX^>+N. IN?-2!JNW]'\KCF)<UW'e MLQR^<$C.TR1@"#P^?VKT')<R^ H_ CX0#/#>I_3NGF^KNTOGMV>7]3U;R-L d M6V_@";VU)/)>GJ@+>HS=[/?\M._-U5YH\WEL'S^<?89?\_C<VT-[<9^;L_V7c MO_;S.MQ;>T1/[;O]NG_VY=[=:WMT+[75_;QG]]S^T,/[=J_OO_U9-_?2'M^Gb M>X _X@5]JZGUX%W)TVYEO]3%@"C& Z08<=9X]K&\'<IS"7:1! := :(1-E! a MR&L"0D#-K_19W#J5_<2&\]19%<]Y@1@KE[<>$_G ?9H';WVN.E$\D&^F5^IJz M3-74$4T9QF:4'N$4FUJ,M4H:3P+0?X)QE28H!Z#_$]*I4" *1D&HN[BF@//.y M0HBT"O5T*T@/?,I.D\* 40I2(2K !F+]0-J<50.U(\%K(7G(&H-9,[/JHQEx MJU*!6=0='"$@*B$(!0?9<9TU-OC[ONF'$&5 B%4-VP@+1[?Y-N'F$\*3P,\(w ML6 *V %P?Z@&(JI*&2P#9J "&62KSO$_XK-R3 <! 1NK5E68WE&+*,(#:UD5v M=&2=C&\"/(P52)U4\"7PFXV5FE#3_MI_%%+U[4>*S/]1YSX'@GH?BYGA_1,2u M0,K\P@%$%*%Y /Y\-?M9ZG8L_&3@\$L!<"-N(L>ND;O2G_I_0J-7(QC_\7#\t MD'_WM]2*,/D/0^6_JIC_X6C^"]C]?];G#_WO!?J4?J$B-%"_ 5']KW](.<;7s MGZID_^"GK3<A)TPXAGI0<4)I\*CNU;VZ5_=J'QU._% !"2 !)( $D 830 )(r M #0B?GQ4^*$"W*M[=:_NU3[2_@()!:J $& "22#WF*9M@0) CM,@+9&CMT6.q M%?8%VG'C/RK'!V&V#9#C-$C+#D@ ":"FDHTBX 2(0.3XA$.@""0!*U $(H=Sp M$0)/@ H@@<&/,'4W6-D!"2 !U-2=0A!21F8C5Z>:+-#^2-$B*,25_@+M> <Do M@ 104Q<XT*%%;FA_B2ZBXES:<="Q^P2!]D>*;Z8"V@ 6W $)( '4U)%.]E*Bn M':?]D6(/)-0)QU =!6 H#1[5O;I7]^I>[:/#B1\J( $D@ 20 -)@ D@ "8!&m MQ(^/"C]4@'MUK^[5O=I'VE\@H4 5$ ),( GD'M.T+5 R'$:I"5R]+;((0?@l M0.1885^@'3?^HW)\$&;; #E.@[3L@ 20 &HJV2@"3H (1(Y/. 2*0!*P D4@k M<C@7(? $J 2&/P(4W>#E1V0 !) 3=TI!"%E9#9R=:K) NTOD"L[; RR#B:"j MGH,<@ ,[( '4U&]).E JQ28T":6-.Y?>-O@'0XN@$%?Z"[3C'9 $D!-7>! i MAQ:YH?TENHB*<VG'0<?N$P3:'RF^F0IH UAP!R2 !%!31SK92XEVG/9'BCU@h M]HFC<K@!S"'JL'V< #\^JED#8/&#]HM_3#9[T:8WZ6 BZ#G( 3@0_AE+BU@Fg MX9_+Q_V/.@2J.JKB3>=$X- 05H9HVM. :OY9(7[( ="Q&*Z_5^EMCS^#3"FSf M<J6_0#N&"0>AC;P1Q"!'0 ?X /4\DI_@79L$A9#&_D"4$ */($A<*%".H6Xe MTE^@';./Q1 $_.)+>2E[(#_( 3B0WN" U-P"GY *?(%/> 2DTV(H E] "(1"d MS" %AD#X+Q,B>=.$_PEY Q@%#G"HN/\FM,>;D!-R -=<< ,&.G#YN-_[-TCQc M:$\"??F\ <%/!.@?I6O^&61*H0"0XS1RC4B? D7 "1"!E[('EF,"Z!V+ ?I_b M%2X2.5;8%VC'C?^H//Z::LR<1N>< D7 "1 !5PH"A, 3H )(8/"7B2F% D".a MT\@U'WT*% $G0 1 !_@ X,H!"R&)[ $7HH<@ /I#0Y(S2WP":G %_B$1T Zz M+08W$/[+Q)1" ;TC!"R&)[ $7HI(WC0[H*:2C2+@!(@ X<-"@Y^Q]('(/QBFy M% H .4XCUXCT3S@$BD 2L +C!@3L@>68 'K'8G@U=>6K<)'(L<*^0#MN_$?Ex M\<^:K0IRG$;G_(1#H @D 2LP"IV+$'@"5 )#/XR(0?@0'J# U)S"WQ"*O %w M/N$1D$Z+P0V$?\;2!TI#'TBH.<"0+CA' 1@B_V"0^QND>+0G@;Y\WH#@)P+Tv MC](U_PPRI5 R'$:N4:D3X$BX 2(P$O9 \LQ ?2.Q0#]OPH7B1QR Y$CA7Vu M!=IQXS\JC[^F&C.GT3FG0!%P D3 E8( (? $J 2&/QE8DJA )#C-'+-1Y\"t M1< )$ $0P ?XP" * 8OA"2R!ER('X$!Z@P-2<PM\0BKP!3[A$9!.B\$-A/\Rs M,:500.\( 8OA"2R!ER*2-\T.J*EDHP@X 2) ^+#0X&<L?2#R#X8IA0) CM/(r M-2+]$PZ!(I $K,"X 0%[8#DF@-ZQ&%Y-7?DJ7"1R5 XX$#E6V!=HQXW_J#S^q MP;!508[3Z)R?< @4@21@!4:A<Q$"3X *(('!7R;D !Q(;W! :FZ!3T@%OL Gp M/ +2:3&X@?#/6/I :>@#9I\X*H<%QQQ^@E^ #H/!H[I7]^I>W:M]=#CQ0P4Do M@ 20 !( ]$\ "2 !T(CX\5'AAPIPK^[5O;I7^TC["R04J )"@ DD 3O3(A ?n MJS'\O2URM./&?U2.#\+4W6!E!R2 !%!3=PI!2!F]!)%MJ[J/^GV9"Z']D:)%m MN/ =D 20$TE':V'AJ2,;X8WALE;H0,NA/9'BF^F MH %MP!"2 !U-213O92l MHAV/*7]G\ ^&/9!0%]P-: [7$/=K517@7MVK>W6O]M'AQ \5D 20 )( - _k M 22 !$ CXL='A1\JP+VZ5_?J7NTC[2^04* *" $FD 3L3(M ?*S&\/>VR'$%j MCTKD:,>-_Z@<'X2IN\'*#D@ ":"F[A2"D#)Z"2+;5G4?]?LR%T+["^3*#AN#i MK(.)H.=P!8_*#D@ -?5;D@Z42K$)34)IX\ZEMPW^P= B7/@.2 )H*:2CM9#h M0U+&-\,;P^2MT $70OLCQ3=3 6T "^Z !) :NI()WLIT8['E+\S^ ?#'C#[g MQ%$Y_ 3F\.0.*DZ 'Q\57%DS/S(YE)@K15C@RIJ!)^?BLD2.#H\</?5CG(#>f MEE3@!^T7_]MQ98>-0=;!1-!SN()')7*0,'R'!2.'"N"86##\,Q:@X=L\^%@3e M SL@ 22 FEK\:8N%>3P6:)V'#8@RUG;C%_#@@Y^Q W?AES'6H"(''8@B>R d M!%!3Q]IN).@>.EF)KPLQ$O=^W4\?M/_A W?AESE4='8 0F@ILJCHI$F8"7Mc MQ%E0[PSH)H6=K&A_[> +,8 Y/+FE@/OIR4<%5];,CTP.)>9*$1:XLF;@R;FXb M+)&CPR-'3_T8)Z"W)17X0?O%_W9<V6%CD'4P$?0<VC$6C!PJ@&-BP?#/6("&a M;_/@8TT,[( $D !J:O&G+1;F\5B@=1XV(,I8VXU?P(,/?L8"-'P;<AUK 2)Rz MV($DL@,20$T=:[N1H'OH9"6^+L1(W/MU/WW0_H<#-'P;<I5'16,')(":*H^*y M1IJ E;039T&],Z";%':RHOTWH3W>!+NPU:'"[X,.<?^C5@%H)X(>!P8*(0XMx M2=0'R0S\W0Q!J(7UI@D$QL$P!*IZQ6,JS3^#3*FOHDQ\P&)@ A?U"U2!*5 $w MI (".EP/C*&@,5@H;X %) "3V (?($V @)"N@MG'XNA"32!+P %I, 3& )?v MH(VD "^8 $3RID$!1> +"(%0^ 6(0 FD H\_*Q@^L((%.^?U]RJ][?'7U)%.u M]H(.K^Y.6>P\D+E> D!H_\-IQUBP<UY_PH+O'G]-'>EDKX$K:]Z!G#@%F>LEt M (3V/YPII:M,V%%);W"@YUJ/DR'2H0!F8 )/@ I\ 2/P"<>-$=\T** (? $As M$ J_ !$H@53@\==4:K5+VO'@Y_(3\LFY7JA %7#_36B/-\$NY !#6KI#$'08r M#![5O;I7]^I>[:/#B1\J( $D@ 20 %Y-74D "2 !T(CX\5'AAPIPK^[5O;I7q M^TC["R04L Q68#*,PA:!^'3F&/@J7"1RK+#&?U2.#\+4W6!E!R2 !%!315 Wp MZ26(;%L1!&[YS6A_I&@1%.)*[X $D !JZDZ)(*#3CK_R;W5E*@8*<"Y!P"^^o M%-H?*;Z9"F@#6' ')( $4%-'.ME+B78\IOR=P3\8]D!"=:? LG2/3\!0&CRJn M>W6O[M6]VD>'$S]40 )( D@ ;R:NI( $D "H!'QXZ/"#Q7@7MVK>W6O]I'Vm M%T@H8!FLP&08A2T"\>G,,?!5N$CDN()')7*LL,9_5(X/PM3=8&4')( $4%-%l M4#?I)8AL6Q$$;OG-:'^!7-EA8Y!U,!'T'*[@4=D!":"F?DO2@5(I-J%)*&W<k MN?2VP3\86@2%N-([( $D@)JZ4R((Z+3CK_Q;79F*@0*<2Q#PBR^%]D>*;Z8"j MV@ 6W $)( '4U)%.]E*B'8\I?V?P#X8]8/:)HW(HW7)8!C@'Z! _/NH0V!83i MBJAPJ\ /.1)"$X@<]:86+A\.UM*4%.T7_]MQ98>-0=;!1-!SN()')7*HL%;Sh M);!@Y% !2#%G'I7POQU;!/"_:.%?1EA7L((%.^?U]RJ][?'7U)%.]DHX6$%.g MG,*;=#!#1OO%/V.94BC@JW 1+)C>X$#/M1XG0Z1/@2+@!(A $G "1^"E?'0'f MO0>"S93Z*LI$)H2@D-[^UX"6GP-;8-" E2[P4O9 0BW=<E@&/#W<3T\^ZA#8e M%A.*J'"KP \Y$D(3B!SUIA8N'P[6TI04[1?_VW%EAXU!UL%$T'-X-E\""T8.d M%8 4<^91"?_;L44 _XL6_KD\8YE2*."K<!$LF-[@0,^U'B=#I$^!(N $B$ 2c M< )'X*5\= >]!X+-E/HJRD0FA*"0WO[7@):? UM@T("5+O!2]H#9)X[*H?O)b M8;1 %:!#F0 0.:8%+(82UC'A0'J# SZHMVP!(E">"D0;:"FW+/R7B1(&1#NGa MR[3C)@X%:!'.]QQ20 D#HK6MK&B?0^C!4P" R#'C= @P@230&3 #$AB!5" %z M//X,T@=H)0DS830DA:TP'Q3^MV,) Z+IK0VX%5[],2K%E0[_,J(/+,>=7SNVy M0O<SI&AA=.#^4P$@<DP+6 PEK&/"@?0&!WQ0;]D"1* \%8@VT%)N6?@O$R4,x MB'9.EVG'31P*T"*<[SFD@!(&1&M;6=$^A]"#IP D6/&Z1!@ DF@,V &)# "w MJ4 *>/P9I \LQ\$:6HN 86RJ<>R[DMEH85:NM ]ZER:L#8QX(^;!7TH\FQDNv M\Y^E@,>_'*U4W3#D@X&$F3 :DL)6F \*_S)BYVO8$@9$TUL;<"N\^F-4BBL=u M_F5$'UB..[_G:T:'<7.F3M OFVH58Q1][)$=<$XX3?HC RY@C^R <\ZITP<+t M41_#,06GT$_/@I$M^[5C*]R<J</U8V<D(I$ZH'1+A:]?]F]">[P)=@$'<,T8s MX&"APX2, 3B :[K3\0D8\H,:: T)8&PF@ 20 /HF)OK/TVDNMYW(7A'H?WX0r MF<&!)7O-:ID $H",: -8,#]0S@3@-KUFM4P "4!L7NDOT(Z%:@(0F<&AI6@5q M+/AZJV4"2 R8OLT6[""G#@%Q28T"<6YY ?*F0 D DOA%*^W6B: !%!QP4I^p MH)P) -=[S6J9 !* C)@"1< )$($7\ F'0!%( E:@"+P (? $J 2R ]JH#4Do M +=BFK9% D@ 8M,T;0L4 '*<!NH"*R?G2G^!=JQ6'/]8S8S3%'OHME)!!]-Dn MV52K&*/H8P_=5BKH(&T;IW+U)N0$XY6[!&'3QZ=1'\,Q!:?03\_"E2W[M6,Km M&*_<U7&X?NR,1"12*MR D<=AR_Y-:(\WP2[4 .8@8$8'=)B0_(TY")BE@/L?l M3AQ(;W#@"[B!W3H'5L *"/^#H0]DU:0ZI;2R1W6O[M6]NE?[Z'#BAPI( D@k M 20 1@ME$T "2 T(GY\5/BA MRK>W6O[M4^TOZ;T!YO0DZ0 3& .9#N$ 0=j M)J0,<*<L@'3_/MS_</I :>@#N=]Y78VD^O9[OF9T&(!PX 3]LJE6,4;1KSI.i M2A B_7$J5V]"3@"$ ^><.GVP$/4Q'%-P"OWT+'S]LE\[M@(@'#A</W9&(A*Ih M _J<5 A![E0;TM:;D!/ZJ2'MIVP!.I2)!. >H( 4> )#0(>B@!:1 C0EZ"BWg M6L53MI$W@ACD2/@O$PG /4R!)' $OL #A *=4P[ @?0&!UK*E;H@X;],) #Qf MV%*TRAS0"N%?622 *>4R5\VSR?Z)OPA$CB;0!+X %) "3V (?($V$CE,0!MXe M*2%@,3R!)?!!3T4"2 !E)(*@ !'02!13>,!8":$)B(#(X02>P!=P E6@"3S^d M_) Y <2&]PH*5<*=RR&&# #JBIE(,WC9"40?564Q-H LB)G."3P5\F$H <c M@ /I#0[T7.MQ,DS 8O #4* (. $BD 2<P!$(_Q.RGQK2?LH6</^I2 #N 0I(b M@2<P!'0H"F@1*4!3@HYRJU4\91MY(XA!CH3_,I$ W,,42 )'X L\0"C0.>4 a M'$AO<*"E7*D+$O[+1 (0CRU%J\P!K1#^E44"F%(N<]4\F^R?^(N ]=<J@R6+z M>)OIG_C'3>1H DW@"T !*? $AL 7:".1PP2T@9<2 A;#$U@"'_14)( $4$8By M" H0 8U$,84'C)40FH (B!Q.X E\ 2=0!9K X\\/"4 .P('T!@=:RI7"+8L!x M!NR FDHY>-,(21E4;S4U@2: G,@)/AG\92(!R $XD-[@0,^U'B?#!"P&/P %w MBH 3( ))P D<@?!/6V]"3K !,N NV T#QTFI V0 7?!!L@ AXK[(T4?B/R#v MU?Q;U<O_5*>45O:H[M6]NE?W:A\=3OQ0 0D@ 22 ! !>$T "2 T(GY\5/BAu M MRK>W6O[M4^TOZ;T!YO0DYH1(Q"OAU4G)!0Y1LFDF\#!O<_'.0R9%" 5N@=t M/F Q%-_\H )0@!;A?,\A!9 !:VD84A@*T"*<[SFD ..S E9 ^!\,?>"IZGXNs J/Q@\JGMUK^[5O=I'AQ,_5$ "2 )( '$E(<@0L5C D@ "8!&Q(^/.E8!r q end -------------------------------------end-------------------------------------