fs/buffer.c patch for multiple devices

Gadi Oxman (gadio@netvision.net.il)
Thu, 11 Sep 1997 12:41:38 +0300 (IST)


Hi,

I have appended below a very ALPHA multi-device scaled-up version of the
buffer cache as a patch against 2.1.54.

For each device, the patch tries to maintain:

- Private hash table.

- Private Clean, Locked, Dirty and Free buffer lists.

- Two buffer heads pools -- one for normal buffers, and one
for page cache async labels.

- Estimate of the current and maximum device speed.

- Limit the size of each buffer cache according to the device speed.

- Flush dirty buffers according to the different device speeds
simultaneously.

- The patch tries to maintain a short queue of locked buffers
for each device, in an attempt to increase interactive response
during high I/O write load.

Of course, the patch is very ALPHA and far from complete -- seems to work
(the system is very responsive during "cat /dev/zero > /dev/hdxn", for
example), but I would recommend having a handy backup before testing :-)

Gadi

begin 644 buffer-2.1.54.gz
M'XL("-2X%S0"`V)U9F9E<BTR+C$N-30`[#QK4]O(EI^=7]%D*KDVDHQM'N$Q
M<(<$,F$O(2D@DYF;95VRU8YUD26/)$/8#/]]SZ-;:CUL`ZFMO1\VE3*VNOOT
MZ=/GW:?E^:.1<&;"<6(YG,6)?R/A>RAOG9$?2''3:W?;FQMK@1_.OJUY,33'
MR=H@B(;7:T'0CV_[@^"Z/11+VI\YCO-06(WW42@NY%2(;='M[F[T=C?617=G
MY]4SR[*63=2X',]H<+>+@]>W=C>V>?`OOPAGO=.QMX2%?[;%+[\\$XU9F/A?
M0^D)/TQ%(H=I%-MB&,W"=`]:DS2>#5,1RS]G,DG%*G[#Y]@99G3'TO5L,7&_
M]:G!RL$%4?A5C`+W:X*/O4D?1GL3&`NC";S8%X.Q<S#H)_Y_2W%P('9H0L(@
M:XOY]QXCWV7DNST;%D?8KZV*]^[=0(IT+(4[B&#O1OXWF0@_M84;>H`:MOJI
M\"*9A']+Q2"*TK8X]4?P-,%%RQA6Y@.RJVN$'!*T/YB-1C)N#L8MQAX0^BK3
MOC=I,EZ>O*&6Q+V1?5IEDS[IX3#PFVJ<<Q#&?80H/<O"1SA9%)?'X+S^2#1A
M!XD<7R;NOZ+XJ@6/ZYY_>7]R]N%<H1(C+E?B9]%4M+-X^UH'!]V6^,Z4VUHG
MRKWJV*^8<`W`))W%(=+\'N:WG@F@91!%UV($,%PQBJ74^]XFVJA_T.TTBJ9B
ME@"9T]M(=TILT:6Q`;8B[?DG[DPLW4``GOY0MC-`P$UO9JEF'M@*,7:#D4@C
MX=Y$OB?B61CBOD30"<%YP&M(2GA&".'"-CH[L")KH_LJ7QBP5P@;.I-[]!/I
M!_"=@^'$$RO[P+:M<C?'[`8;QH1,Q,&^Z&ULM&#;YK9W>]NMA;/&?R*SX,3&
M=I5'>(_102.0>F+/3.L83VKTC-%:UBSKNYUN6;.8W8NZ9&-GM]/+=<E&#WD*
M/IGR/_GA,)AY4OSL)I.UF3L<RB1ICP_*+7Y4\W#@I]&4>EO%!C>-)OZ01L`8
M3X[\4(JS\_[%R3^/+\3F,Y&D;NH/Q7#LQH+Q1D'I^Z$GOWWIOKH2^X3LYBN[
MMRVLS6V[N\7HYK#>'5Z\$TW\['\\_/7X8A4_:88UA!6-FDH-,OP^*CVQVFKE
M0&CL^\.+?XBF@N=TH?F9H[!#=?DUCFZ57DF:^&`:^S9K79@$E("3=:^;;A6D
M(QGW4W<0(,<NZ"F">-8/_"3]`KB<GEQ<`@W$][-/IZ>VN%\R%*4^&TLT+@W.
MAE]/Y*0_=(=CB9I],.;OTV7+$+,0%(='<P!D!+P$I5C"@(7];UT_[8,.FDGH
MK@;CL[Q_QB9(;A!@M0W0H;-7V*2\K9_>366!@AT;"%`+B%"MAZ:6N[A?#%P4
M!&`TL257LQ<R%6?_%+=C&8)"9A"T0T0,L%[9.-)@#0&Z%FU:@KK9$X,[TKVD
MCEGW*A,'H"]+'9-H`O8S'H[]%'3;+$;5'@DTC!,WA98;UP^0\P3L>A3?L4%`
MU!DK>,JK`D,RC^6O`0=@%?ADKB^SOY4-G<M:;*3>@<5&W'%Q4S=V)Q)LN"!'
M*#,X`V\4S)(Q3!*1&A(G(W$7S83K>2**GPGBJPFZ"VYX)Z)1$5B"+LVU%`D0
M`NDPFWI(A6L9AS)82^Z281JTAVC)E!GJ=LF^=CL]>YO]*J(-(]&?^.&7,U`M
MYX?OB9&$Z-A"=/%#B$W\[.$G_>YV\C]=^(\L5X#E?BO`PHZ;'>S=RS]I]%:G
M8_SI=39>V6+SGK8(E*Q27&^/CX]>'[[Y1__HLM'L=H`L[_XIUG#ZEK$ARGLC
M'@(,0O<K"P]+5[E?OZ]<I7S'`=AWPPN$H25@!*5Q.T9KU_0FZ+=8;$31AT(#
MNK^O``&C#\"?N$9OBCTS<K/DMQ2?W)./A9Z-0&_3NC?0(Z_"#T%9#%""FO1)
M+(9?%([T'0SU.%^??E96'%7@TUE:(_$%UJ_5<8,QBX*;W(5#EH4<6:"D)IPM
M*C3%83ZYHC6`!V,F+`A4(M,F`@!>4$8-X+4R-Y5(C&#U@]S:P/-:`[C:$KS5
M9#2FL(])\]>W'_N'EQ_>G[RQ16Y0^Q_.CX[/86Z:#G=UI3@%;>O4#?UA\_E;
M4#6@E-`-#$"F4?"4ZL/^@OK_9_B<0&7K,H'9'5L9X=6%YAL!H+YH^JQW??"A
ME;Z''Y9%2!GL@K.0YK6$G]&MQCI9/`@M$!FEYDOL:-BE;'!)>9H/.2K:%Z]/
M/X!THB76[8$+3$N6A>,*)0`C*;V!"Z%+M0D][.+3[E86GH#<U(ICHRKN)%`0
M<L$'\.RAWAUV\!,9WZ`M45N%AJY-'==,,K_^]+;_[O@0N('H;3[H'U[\<?:&
M*<_BGZD#IOL7_ZIMB"!MUOGQQ?'Y;\=':D2#Q-:P'\1"S<R$V.+B]/"UXE#:
M!E8R*Q#HT0]#M33F"#-),0DLZJ0<?_%WT1&[HJO`EIP#COY0/?T$$W:(WV.0
MW>OF\VQ]+[S"`@'Z"P\X'6:R13T1<*Z?9`CA`ZL^4DBL+!Z@@S-%C:VV6$TG
M4U87K'>)(J8NU9AKQ(=`*XJ<`1KN\(N$L,4I0S"D!+:`(<UZ/>%-,;20+7*]
M8:H(4RV,JFI!.36*0Y]G(YNPD/+R6AB!H7PJ3KE&I86+W#-6R00@&Y)K7EOH
M8+]L5UCGWX*G,)OVE8%&SYX#>I`3<@W6NQBA]L`UZ/8X1.5`D()T9`O1`*^D
MGSNQS9?<`9_8XJ72&"!B4R#W+KAZ$!B#IDNN=?<40DP_N<[6GZ<H<&VS<!K,
MOO:96)1)0%UOB?>'_Y'E$/1.-6202":0WN0^8Q:%BN=V138$.11)JK7Q0L3N
M,>\SBV,9@B5%FXG:[1)"IOZGLY.SR^/S\T\?+T]>GQ[OZ5P(2P_K+,S$X,Y!
MW)R`('NS0&**A0@,C@T0&4C<6P<2,XW1IDK@2=9.MS&XM0G8#TH/A7X"$/;$
M"(UMLX4I(A%&J7+GP)<&'_/7R',G?GKGP)^P+<0%^L=:,)L0K4[<:4),CP$Z
M>(0I6*+6,P?F3:80UKNAC&9)<"<\/T[)#P=#%=P`$K=^.L:,AKQ!IS4F@@\D
M2M'015^^34`^`]+@VHM9P!XX0+IUP=(#^X-:0G@PS,>P()'HM@(U43N`8H)6
M0(N`A-&MN`4O5J)CCV*C'5WLRM@S>FIA-/5:(3)!$LWUX(DS<U\2U7?_[,/G
MPQ/P)3OE!G[<;9G>)S5\.#VJZ7YX>JI[&^AX49\VK0X3%56X2<+?!GVF"/E5
M0<!?P!3REU7DB52&$*5_!Y$B+\H&&4OC.YN`H$FVA8QC;9M5EY!)5FP5C;EN
MW2I[IA`58[+R0R@9.A(_C!Q&/!UCL@T?X6\4<1C<:3'?<OX+-H\FMD5FQM6V
M[''W;FUWW<DFR,AE(%H\7HWKM:B)9A]&DVD@4S\*,2;4(R@?"``U^V-`1#BT
M"0(P3,.+B(H-HI\FV))4<)Y29?UJ*#BDU.<"XS+'N@DF)L$0).X(0]'A&&Q#
M`AH:Q!>$:.B"L4:.E]^F$,4B(%@@,#Q'<0-9I(F`91K17X0=>:(V#\65L4>1
M9530W!^=G%_^<459P\QWP/C[:Y1&:A$]:LV\GG)6(8>RVA/@\3B..`#G84_0
M9,@P+::GH<[)Q5QAAX/&\J3FK)S(5!X=C\(?Y)_G2<Z5FL4H6,KYT3U1Q;]\
M:>C[%16#.?7ITUJ-37UA/U^S8PAQNV(_D5S[4\S,`S-!B,Y<Z"<JE;&JT\K`
M/X=G1RPT0*2V;E_C+[0B&OK77V(%>V639MS8W5,/BBB#2:(_1?LF..E?3]M[
MDF-:S\D(F*<LC+@\Y,79-(TP96`K[H/@A,:16<)L3BA./J#ZB.*VN&`ZM%6/
MM8R>M"S<`*8K$`1QPR<K%5+#4QX/_W0K<7MYB$:ML#^LR#2=BF0RUGP4X0D*
MJYEA(&$5VG*(0MOAV1^Z12\;9`V%+!W[L4>;65UN%6W84M[W?5!3%=R*6`U8
M?MT!ZK^BAM13:5Q^__UW5"_@1U`OF-M'$Z(Y4YTCX9$#[QYMJCGX%CP&4#/@
MP04>>Q5)(*<I&N2!3&]AA]O".8+G[S%Y,%9A&,D<"_)5FR+S0NQ!S,;>22$R
MK0S-M4E!>\`>*]OT,YJYDC*QZG0)?^/(I\#KUGPUH@"MU*RHG)R!O7EC<`GR
M`".(`_XNQ+FDTPT@/@6)C*"*I0U%9W)O+4L7%8Y%DH^02Z=X)O-P*+9`;5F/
MU%K68J4E2KQ>G3./18O:K.ZLJA1`:*U?><C]*"X!-U*JQ#,TZ/-BF+[Y^?SD
M\IB2C2\SS6=,X#@U$^B'AH:UYFG2"G.)!ITX.JBJE+G<K;>TF/LX/JHQM;FA
M6FACU?BG&5D>7+6RO:>8687)_]O997:VIXV.]30K:RTSLE:C8:B;QYI8ZPD6
MUC(-K%4^*291T&N]Q4,86?"\T6IBS(,>;#(;#J7TN++!'Y'W2B@H5Y<$&G88
MB:'B&Z)-J&5/F^%$`@Z>"I:B,-``LDA`N\@<F2I8P*D1$9Z8!/!A:P]8J.$3
M#+@-[[HT5:NM=O4I?H0USXT0FDOOA4H8ZDUEOH0OEH5=?][OM7+[M<39*)D+
M'M9<P5@D$]5<L1Z(?_FCD2\3&BC*(]DNJQ1@27E;-;K;FJ.ZK<6:VZHH;JM&
M;U-^B_V,74QJ+<C9Z"`9]24M06>-*2V00F`>HPY4:R\TUHW4QSD\6@)7_%R@
M6['-A*LSCQI"*:-=,]K2$P/3&(=<8JTN(TXYRB"1Q@SE++L2Y-IZG[S@9]X2
MA"4*M4"U2)6GW*O)%;](=D4.A3+$=B:>^)V`9/H2G^3H.!DZ.#"85;.U=A%-
MG>VP:_'CIS7@"SG?.15/Q(59)Y59!2U9.E5[:`Y*GX2IC(R9PLFRV@].OUB/
M2[]83TR_6#^<?M''*Y1^L=C*_+6?9<F(2+Q$UO292VUG239;G)Q=]M\?_@Y*
M!"C%7/P0..S1+`94T<BLB`5K8E'8=H&&D#/JM.$P:>'P@KR-`BL06GRD6'UN
M)"-I*NJ1S*:J0_[,#R-/ZF<_/(/WYRQ*50<'CX)X6<B:H\<NRZE!VIF/=&5J
M1].W"KZ;KPD1*AUPS%FK7BFMR$TF@1]>NU^EDM&$>04WL$5Y^=[.CMU]):SU
MK2U=KJDR^R,/C>S9>?_#Q^,S"G#(`03)X:B>HL)]D9T64(H=_GA?1AX%`V3`
M\6E+G_@L'-+2!Q4U<WG0G9Q7'`$#^OP@FX5_9O/,Z;YH!MHK.F+%GLZ!Q[N7
MS4"_L@GF])XW`9*4=9YS?'+VV^&IJI3MK=L;7:#]]D9VZE01-@M/<H6J!0K!
MKP2U.(LIBW(;Q=?@9=)!`WAU$XFY;RHY\A$Q?^@&J(?4"0I"6:MEB1'XP533
MT"R4&8\\S?B<-:?=6Z4_>_E31>M5D6^):F$BK8J<D*SZF>!4P,NU.DT2`TV@
MUX=';]6>5+G0^1$N=)[*5LX3N:4RKL0$!G8X>S2EL"W_"9]4:E(%M+;*560_
MPA#LCS-*E3F9Q6TB'$T)4V/\ST:ML'$%MR#73L!7!`C8J&`W_/#&#7P,O6K<
MA98JA-ZTNYL@&#NO="&HKJ#A+R&&[`L.=!:>8,`PL-;-4)6#=/88G%E70@^X
MPJ&2\J"VJ\5I#>Y#&0W'\<V,1BD344UN+,@L6(U2FC(TLY0UN<BP-A6Y'"-1
MR0/D:8!Z3*UY+2JRSESC<@<^E1:5A=))M`F3J^7KBKAK@S!BH^U->QO+SK?U
M-8I[9D1''V+VL1YI%)+YI&BM!<H]TX(MJC8^.OZ-..>_N$/K959&W,H!(1P3
M2E[G]*4ZQU5^BJH;ZR:OF<\JSC>QA1Y8+*[Z4H2+5Q2,FM@`(7#Q/E57PKY'
M$QJAPLLY4D7F@`B[LVUW-Y"TZUU[YU61MDNFT7(T?Q*K!H(?)C).0<NFT3)$
M%9Y*MRKNF<:@89B]4<4VRTQ/LJ9J6'Y[>[$K3L\_J6)5T@W#*(YGTU1ZSUM:
M;1<*+%[WWYX?'YM0$$#=T!(^!33J,Y6E1X7AV8CL26XZ,XV59TVO$%>5GA7U
M[748_``T5=I=7D05;Z,PKZJY2]=YZLH<!V.L)GJ9"P8-H2T,8U5TTS3V'3KC
MF+SB"+5.DQX17H@8`LQ'4*Z%IV&-JU:@>D++WL-$("O??YP,%*1HX>B\6$+7
M)WYZB\6)_9.SH^/?F_F%KHR9GRPG;W'K%@E*T214Y80`S!FZDE]TH)5<U0^4
MDVEZ5YK/X+2<1\O@#/Y4)55.XPD"^G@)9<-612=#M1;7FJGO'R5:SOU2Z5K.
MO:1YD_G,YWPO[WNN'W7]29TLH(>!%P>,?07G&O-@R9B.<+E\1!U>\/4+GQ/-
M5'*LKI:LZ0/;AW)TL9"N3OF_\'+>I&Q<KN+8=S$OZ3F-LC-H*$0^D9MC=96+
M56LL.7.<ZYP'<Z?U:.:TS/QJ2:&WT6-D)L4,^MPN=7C\,,RLSO_AID078Y?A
MY5N$.S)7:6-M,>5381^>[J_,U=4%3P4/-T@Z%EFW.B/[HQ9S#L'W^,2+4<,-
M8FO)X4IF!FN.5;4P.'P^B&I<#[4:10/:J&X<-]SKR>=Z6=H*?(ZQ;"V_5@04
M(J%]7JJSS07>J%8F85>GE2CSTXAN&B=%4Z1/_@X]*FS&\GVL1AMI/=56QZ_S
M!9>7LE)+02::X7B4B*'(6&7Z57(XK!H:U@##CC6/JX(TIZ-J$S76+D/%:3P4
M%Z?Q4&2<Q:2Y7R[@5+N]5,"ISOS)WM@RD_@X(<\M_URW[4H55AG2H81CC^\D
M1BKO$PUN_&B6Z"-K=3!;8MT'\O<2%JZ7Y4P+U!5OL#1;C846T6I4'%]^?O_O
MR(Y/MR+?^?"KM`O9!LPE0Z-B:^@Y9]R6F*8',2X@A=7L+CID7H$SF#$6^GI%
M"5/:\%[D[O;CS9WS8\SHY&:M9!@,L_(PR^#\>_$?-B]P/JG>3,GZ1[Z>D)7J
MA"*4M^1'.^Q'<[GEF&JYU2LA,C5@WEU1Y%\:DF<CJI$Y9Q47Q^;D]"^)SN>S
M@1&AX^*/OU&=.M:!CFG-,M&+8\ZL&4L.)0X^B]*ZD?=S!7&I\IN3VU*#5<5#
M'3JU,E[_P@`_U-?C*F?SM!'&'6\0^D9C4?Z\/NG.>X`:6>U@*26*:RFT9,G+
M/4[(B^;>GKX\5#,!WQ93LZCJ("H/Y!PPU^J)K.(/NA<X`_NK9XKSJ+26_$:(
M"U43I4O@.?W-'Y<RW8^'I=/@QLA"<S%';NS6;@$:%81X?#78N'AH=+'U/7U1
M+:0M$(=Z9%2[Y[=O[&Q@OGSSU9:]0SE=/N>7*2\3(5>X1[,,GG!^`PT9\KV=
M04#=^74X5WOYW1UU<N,LN(HS&.MLFW'48SWUJ(?+R$QT^$H=O8^G94;O2(*M
M[J:]W@,:[&S;ZQOJY(E?[5,+0+WCAU_NLZ]WLY`2J)[34X%;^9IFD<RMW>+Y
M?DN7G5`&PBC=$8V'H4:8_>]<3BY>A>9Y!+_UZ;.D$TIUK^?/&942@B,ZF@5B
MS/?>O(A/,AWMHX*3@P4U*OD#<&";W3B:H>]1<E^YQ!)K_-T0=Y[OVM&K-/RL
M3!/31FK.-D%#=?U_>0!8+&K6-PM,C-`\O#D]/CS+,3.O9!O(+3D25(4]''90
ML60@74#53YNOW_6/N%9*&5&Z[:E+\,UNG[("WF4]S^6?RSM=1C.\&[J\X\<X
MPM><S.E:.1DLJ-"*-!E=#<UI`MA35]/K*SI9CZ3Q71^L-$5HV<$HH8?%0)7#
MS@H6->-;@N],9]=S\^&AOF2!!8+J&O6+Q!9\+_=%\(W6$+(D9!6"N6^FUV>2
M+3^(S=]T@.*6TR1[(T+?':;^3>&B<TN?U>K:>.4IS2FS%\O.MD5-V?S8-'>L
M3^OZ\J25RQ3SCJU+W?75B,I!7J'*OVS"^3Q^N0A5^\V5H6K7.B'B^PAUK"FR
MROW%,?0"/<'E[7Q^2S9P<\O>`ANXM=&U-[>S][4U!)MV>AU+@#7K)?MOWOV@
M:I4PZH-B]JC6P[S`KYS7S.V#J$@#;:&JK"],L,UNCJ/V`R?5VV0D2-1FZ7<H
M36,P*I[$8":[C\KWP@&PKQ.(^36XD;IGBK`2.WMA4RCQ-45N?$>7MM,QA,2W
M4@\*([I"2V]`N>$;[8%[`USKR>(MNGHE@CJD:]189+=HS'LH!1&@;:=`6O7/
MN+O1`!;F.:L7)*IM4ZUH57.Q-:N];XF\+-_0IO-N8<P%7P/9>-4ANW192?7"
MJU\9/^1JNL!BZE4>VE.BA)')E+MYP9T14#GFNX+XY5U]_3ZO9L[SNC`/0VDW
M#Z33B-]R"9%:!+HVO_.O7RF0`",Z$GH/\0HS%>7598W,JW'UAP<L@,9+D6I2
MDDKZC>AS7VB'NB81I!-KI1<FE8FP(`B8[]9GL5MMEVQ/"I>WN=I+>58U+7E!
M&'B9Z"A$@]0%$GK[G45Q@55UO\M+;#WH72DJN-<*J.0-M\R#Q<H$NT889_]/
M;=?6W,:-K)\GOP+65K*B>3%)W27+*3GV)JYUK)S8/MFMK12+$BF)L4BJ2"JR
M*^O_?OH*-#"8$>7D^,&29@`,KGU#]]>N)$A[?LQJ7=HTJ]H&DH["NKS4C8+O
MY1PI&^Y'(%@KI$X"!`24;`HR6(025_`,(MD=7<"1G7;.0-KOS/@+")B!<KUS
M1+9%K-P$J3>@2@'EGDYFYL'C/I$!8@<68@Y19&`I_X%84S06.<Y1(=I;V9)`
M*G25,7[$HT!ZLX!_^^Q8]D4C`Z6*=DW&5GC/N'%X:F42AE.B;&=#Q-T3I6-V
M.SW#Z-@+=P/D#,CP\)H"L@2.D2"X?'S4+ZC74(24P(&0RC)EI!/05>8SU(:&
M"U"8N0E!-P@(?B8H6JRL:#W,A4^2HO"K:];%5C80N;>OSAX(H95;9>&:?B=,
M=-F5T<J;IV'2&Q)E*37,8I!O`N]'UN%._]D250TU,EQL:X$DY*<6\U7>KJC/
M(>`AUT:BQCQ5+O@Z)*OL]7?19+'7W5,7/^;$9P)!2W`MP/8O$'P0Q'&2=6]O
MJ*5`<GZ%\[(8?GHDZJ&+D;!$$YL\]?3'PU^A;BC$:?)K1@V<L)H8OD2ER+[C
MGP7/JLFO*/CY]KPMIYE\)8\RQ3%.M5^R%5EO*7^,3@<3$I[AG1[-\%;?8_=6
M!=6Z]&P&@>PHO2"U#"=_38`>K5%X>"N83=<_ZSR&W7YKIP>#V.Y[?^+27(D$
M4'PN(NH@\9[G5Y,Q(J>!R`?"^G+%*,@H*-XN@-(.KPF6!B4)V,+FU"9]U",$
MQ[''SE3ANIP/R[LY7OZ,6B)>#CF(=CR;WUY>==P[.!M#V/^KU36ZO2Q&L*WQ
MK.!IPL,BQ)P.:RUQ!GJQ8T3HM0ATJ6`MD:ZATKE(\X0H_XC(GD@FB6@.5RMT
M\HIPQ98&["F>\-)@%.N0NX=CKNA;N[3PT%,*X/4A8ACG-6/M``,RB;*/J#,M
MQQ7#/B"N.UXQRZ72A'1*\%&Y#?+?_[JJRU^^]J45`]%E-+YP/.>#%R^?O__^
MJW:%F''H)2+T8H+MBK*&MY\=BXCQ55M+M;PD5=\1?S,#<R;"4+27/T=3^9:0
MMU"#&OP^!NT'1)$[Y*LL@+A.IT/X;$B8%1*6#'M#QENAF7K8J*$Y4NNX-;:M
MM+TBD(#!L=JEG?V%A)L[00MIN;#62P(A(^U.CK%&^V%OQP12/](]$'6HXU@/
M92R2LS$J#)-+W`W`ZZ<T`8C-R'=RW$(LBJA6<;:<7]_"YH?#/)G>3L,^\BQ8
M[;SRH)V<O?CD?18"N=_?(B*_NZ]!8%DA'5CRV?6'=6Z0ZD(SC&MJO?&^)*3+
M]QMD!<.=+/LWB8Z5_BCWU&57Y"K'IA#\6/"8%\#(J*8S/ALT2UM[K?X63-/^
M3JLOJ0VLUJHT+.]UJXTJ%NLAN6XBDTX\/;U/+AN&*>`L-MXH'R0XEW+,&6^^
MU)<P]K2L]"<0RSU*:_]X]>;D]>M_XUGXX`T>1,L"P@-A<LVN/Q&MGN.E\=+!
MT1NUQ'!/\#Q##$/Z^U)0Q1$^ADP'Q]U&B-1E6S[A#`0SO;$S'/>"(LM&#M)Y
MG-%M"RNOA3<@7J&]K#"AZNW4F';<#0_)Z':\V7OZ-%BKC>L^;)1C0N#5!W('
M>$P_0R=]VX48)TSK\*C4?C.T7WB,W^@+A5PRLM*;5]Y=M"%YV^ZBZ-;<[^ZK
M!(?Z-J*"CJT$?C%9@%B#I$@0W=2S%LUFE\`==%ED?QUZ_3,HM5Y@35\PJ+(]
M5H_LG;2_)FX)B]:MK(>E1+IH8'O[:*!L[O>W6]M=;Z@DS^!(OP&!1[ZDDB,A
M2\3F5&"^I6?/T"T"?V.ILES@6`M$;BU-]2-P)+EGX7TD7(8A2-M_VHZ48$)^
MJ1V)G+>KY?2,':E=N17;)`3`Z!#G\T1'1CB>X4X0OS1B[0XIB!2B+Z"PQY(6
MM;`Y[EQV\(;O?+@<BWL;BL9+$(.148*0AK)BH^-^`$IRS88.@0MM!S-6[63@
M7PU!]5ZG])6:OA'U<K*\F2_'1^NXV)//%&^,DM-4,SA469`M?>V"2>DD2,7<
M69;LN(\^L"YV3C?V5#&_PHB5S63MLC(N9["^?,!$QCHKS56]SC;*5@KLHIZ:
M^+U0=)HV?8/V?IY!VKFLRD0*X^U%2Q=%XW]LY2M;-Z-LAJI,,7R7++JC7N.2
MB#9'&.Y/L9T&=TED:KE8#,]73Q"Z7^X5DZH"[;%.==*W_1U'X,F"@<%)E>["
M%3PCP1`EPNP\`G>&B@YTP%U-+D'L=C?CQ3F(LA@?+D8I+^0N!)H3>$0)*JT:
M/!.(J(XOQ(E&H@R7LZ#:MHIC5*I(8N\VCB*,1[V@&=H\&B11Z.U,L+VIXEXY
M-*FQ^=,"-/[9"JE,FQSRM+2F.")2;+_8:93@$@6_V9]U$M=>GY[^-*`W%A"R
M#G_4;(F&XG25=)CT(N]@=YL8_P&F`"+N6'V_SAW4^T:G;,M?EKK*^T4X\,0:
M##ES;TY?O/Q?KI0<R8;1.@[V,!]4\Z"[K8))I<[@/7DV579'1:`DLRO&6A3-
M@_=GHT,WF<+Q74[0N$IH8_["/5?8:QHB7+<JJKOT4I-6P-"]"&:,D;"[.Z0^
M-`_V^UZ-N.<6J@+D_EZ'];\PW45P8J_(E_/LV/UX\J_!^S?OW[Y\(1:AMTQ;
M*^]AB@`!#>_H0^[;4K8!=VC=7S(!2B6G_^K.N!+F/^_NPJ0C$!NDST8@@G7,
M2>%_R6L!\]1M*4X^+O,1!X%E)HF]%,H>PR;=TA&!+-CL2Z(S*[1?XIMA$E8D
M]D2D$+#_XC*EV\"S@=X'VF`"43^J/%I]T^6<&2S5HM6?-_M^%TVN3>!8>P@T
M([#OG(W")^6`[ZQPT\UGYV.$`U1GMZ7W\%J,S^>(Q<Z8ZJNY;\7.%>(+JL27
M#=F@-@;X8=3YHZ413)SF@^LE.$%Y(H;_WW,C65#)8_?Q_.J2)S9,4$N-;2@[
M1N4R9<B2+%=T6+;&J9:(*?<-2DC#^*,<UU5!1=14?U\:CIY>+2CQ[W411&"'
MTC'MFIT!S)8;:%-WE-=V$(C6TT@T'J+;U.UB?&0AN#BE@$ENPDH">K:C2C`B
M]8$TW^!9R1O&U:<WP\7*#,^0Q^875$\-:8'2/MC]6I"*OY"<UN_PH+;4E_/1
MY%4<(LT%HZZ5"?DKT;_R;LQ_@8$3[X-R]MZ0%0:PC$V/LX?UE93M=%6@RIG_
MX@L$$KY![.35X-ZV,*-;748>>SO`%;_YQL[2_]?DM:,!R14N6V'I0M"Q8(P&
M53QP`CLTG`VO/RWAI('T+#).;P>H_3[.%<AXO0,]W*SG+Z`V.E')F.5&9S*?
M";DG>R(/6[.6DH2.!>_&(R;]<[3/CV\B`+YH$EW,"/)>)S$MB',AX#U9R]4?
M[*0!>Z"SC;$G79)T@3T\8@+@C[E)FRC9$O]0M"NF^)CPT155IIW'2MWI2_.+
M"Y!8[G&91_\T,OBAJ5QX@DJWW(!++A74'T3>MM5C$J2PKMVJ%630YU.K+T:S
MJF6=\9+S-XJS^0#O_H[\B3W80@6CU^MY#2/RB`X\3_P@C=\AJI1T55K'_8B]
MWLO_./URZ/EG,;)S)_N]/;QT@5YN^=L7NC2#F<3+9?;VQ>U-&Q[VNJ`%$S(^
MFV;+NY_;(,/`>+:D5)%`C.[(*64Z6:*J+$(<'\KAC+,L8W!;L+^74AX%42_D
M/&J6BB52H4F/M&YRH358S9I<*\I$Y&V;:PPJ4_+!X_KY_1L8V??>>NV/UI'J
MZ+W^]C8EI>SM[L@>S1EQ\>YF:"-"W#T6R>Q;R9QUGWG2%1QLQ8>"8$NYJSM]
MO"7L]?:V6\$O>(,I-4CML*^FP]7Y%4IG>'(Z`=PKJ$[LMFK"LU0'JI%GBRA_
MGXRBNHT*V5F`?\MMN<0#&Q%(3F>O3ADC-;:+R-3(<T,D7,!1Q2)D8=3<5_V]
M?:)#_6[77,&\NQI_PO"7P6R^&B#(R1U>@`ND22F9XB-3"9DAUUJ,+V$@>.^,
M%;$GND/AW$^0.S\REVD(E!@S+*PQ@.,+]('_:*C#8:_A9:FD#M&T^HK!&9RI
M+#HEOOWAT(T_3EA+0R<:S+/%/69'XLD,/H28A8B\_"1>E9^^]V#'WW`=A2CF
M[&W[6ZU>%V9XJ[O3ZK.XD<]LY*J""\TK_(![S,NZSFF)-L]KLD8E_OO.*.,A
MF(+NN!^2G)[EVS14J^Z=WJXR7CDNBH)+/XM#O@0FO&D1KTE,7@_<.A\ZICZL
M9/;-!J@D0-95W8^QJM7XD_WH,U<%/5[D`]FJ6O($XP'1<KY..J\1_'K%"GHG
M]II8O&[(GIO#ZY9SMX*7&6)F]V02I&B230\=WBK-%T9"IUM[%#'H9+QZ<MKQ
M*96W^V3#[6WM^MOE=4ZM.1#\PC-2<M64(1-I9>I2:]"J,T<95T#@K'@I?7:[
M_'2H20D/R#$0AM'%7T1-><<>J$20AJ*I!?]??VF@SKJ'G$(!G3Z&B\M;)&'4
MC&;NAJ9&F+!ZBOS\#KTAT$/"-H6BV7"V*MFN[LU'_Z6)O%E(**LHM:H$4<F*
MR%VQ%!).P@-<?'C#L@/]-VZGUR.4+O[[F7$S3FX^R51OAZO.]$)P0A"TJ+-=
ME;O+/D5VTM3K7T*L\^Y%B5_1^B$`\:>DR^4Z<C%AK-S1S=A.E[)(E9[GJ!LH
MZY0IW!)UFS"V2]G:Y6:%#O=QFBUZ$WK?L.3"B:M,7IA0*:![O_A@BZ8"@_D\
MG_[,4M[C:.4=$VA/YOVL$E%7Y+>><8RU;>AM;T;PM,4RF%A2PR)VI`>F*"K;
M2*O*.:RI80I9K)5</WQCF5'Y-F@VXME,I'`3N4PP1.:5O5%(\2[([,:)"&"%
MF\W$G;W9C+>YU_M3^9N-`-6RN7<LL)@'KDB+^MN6+/KB$=_Y#*;#F__\>/+3
MX,W/O#M_[82$\UPJI`R/_8O3A.*I9[1L\9ZY).WMB(*XO:\*XL-(-\X'AE^M
MJ?H9!!57R)S$AK&&YL`:KH8B?^\(8'=O)]SR`-TS"E;-TL1@?"+_)`A]O.HW
M%H?.!;B7FP101Y&C37G40(9+\<2FT$RZ=O*)=K\5E<.WJ18O!L[(N$3=-.HL
M0S>U9J$;#X9SH_0OJSW:G=2NW4FIG^]]^U2'ER&T81/RVNZ#A(<;<&>KU]K>
M"FCL%X3)0-E;@GS:<B;S+DD_7`"F6__2F#T?%VH?&GP0DFO.KX8+6,+;"_*)
M6/Y'$!KP0/ZQ07Y!&ZT-]A^"7\A=8N,SPX6L7=_Y!IRT`+\@%<.??$T2?N,[
M%/Z&.4WL`#*0+.=+/DO*^"7;&[N['SKGOMX=?7B.LH5?P&?/>KP/DCIDR\(J
M6`=K)+?7N3H<S'R8J;.4>YP'P5\XO])!_Y$UEB4UJYLL*M:N0L]P3M`O7)PN
MU#E-5$S?E<C^"E\RRI/H5=RX7!1X+/!>^JA<VGB]84F?#*R=P9K``CC@9C/:
MVM3?(V_NSMR]..?/.11Y5)J7!A?RNO8^+./7HQ!]`K^S"S5^]?CK$8BC&P1M
MO/'UR*FN!;_>!-\>^(O&0HIXFYU8Y3#P-UO<;SZN83Q<6-LT#5)KC..F3IZ4
MC?TX]\^]FN&E1?Z?H`^*`ZR/[/&0OF3XXC1ZV$J$_4)5WH-D<WEQ(W)[4H_4
M+M'@WKU^3F9O]"BX18`O-+"_/GG.<8<9\WD[N(W*_L`NB),`><F&V`'DD%D`
M--HHB3P=1R01MC\2[K>#TY]?8`A5-V!RAR]$N-<$%Q*%0I6,A1+PHAXJH:%6
MMP6''+_Z6#Q6<AUOB'N=]X&!$1K_&!;H/80(UN&MI;#,E4TWHF+=Z"]<CL$/
MOWQW\MT/+P<GKU]]_Z8EKE?>#LST0OIDY^0[#BH5IW:SDF:1=4[T>O;$;K=[
M[F'ER":TEREF<J%='?;BZ8*92EI"ZVM$L\"[HU&74;7.':-=\G%B\Y^,8C1-
M,*]?$.\Z)+TW82'"0(P*#%)'9+H+C(53D*S+5]`@]^5\I1;0I!D!*Y4RBV@>
M-L-?FD5]QE_+8]*R"9?AXA&?26L83L.E;>+)*F2C&G[3+(HJCD.95&*.4YXQ
M\41^&-.ACZ[)=;B#Z[*=9ICO+-_1K-`L=^$N%&`)#CJ,,OI*<+S((J7`T'^^
M_/G-2Z`PSU$`9$N3>K"A8:2*J1W[,,7E[<W-?)%E<*104!O!LKJ<H%^;X^Q)
M;C0$@7#6@N5!O_+?YF<2U0"D70!K$'SS$YR[R3G+XKO[!ZT]O.?8[7;1OX+3
MM952>LW.!_/KD1\I,ZV0%$+M<YHV<B:I*?WS$-D!?]`FK$?L4[R^.GF8G9-8
M'4PR_75+>?[4OWLF@%VT?!(!*J&?:],:C/MD3,\48DUB^:5F^9E4ENA6QD;P
MV@V3V9!`M<NWRQQBV*Y%C:/XCH:`\-P#(>=38F<R8A>.P3Y\5"KH/(0&PN?=
M>L:\>G**VTK]*CL^8[2+@TV`/LS8P2B*MN*B=<FTJ:%'J33KDT][B?:%3RW/
M:3O4QCI1E*O"&;RCPDE6:A<&O'ZR>NV7VYS]J73U*J7XP;A,YGI]E635=ND(
MLER&4E/D]9!<FS.KG-@US.4Z+M>631OJ9Y'4"I=)8%^X?+;ZY&Q*IV86[U8"
M9F:AO1`XCHK&/<GNH^XH?%O2=7WL/F>D'9\GE268*#5H"VT4:=[5T]<OLGE7
M<WRG)D%S.C>T'YFS^U.1DNQ#SS_]%1'*M]%N9_`_Q2YL>_;]"W),J/\DL'`N
MZG.-S[P&YU<@F'VZ&G\0L2Z4D<D_Z&)X3IJ5,,".<R=T?85H+11CLYS?0!W,
M-4A,FQ%?Z#J,\Y'?SB9DL%R`-+F23+EDE=L@;(3E$@%M0;<9_7:+'MWS.SS,
M9V.D;^+3AR3OC@+I%5WG]_%B<O')C4&&#BVWL/+X=_P%BDP17P#]H#0<6:RK
M^[UNJ]]'CKI[T-KQCHI;#?<_MQ/.<([]I2`?2=R.*=V=1K;"`#%X$KJY.40^
M&Z*#L)V"(H1@;]"@,6I3X=-U62EG!33^=Y@`H'O7&\(YT2T9D<&^:C)311T2
M$3Q&4W54_Z.6X0)7AN(F:PHGM)PV2CA\(3&Q%(ES@Y>2K*\5P/7TV*T;R(8A
M4$U6`N/LVT\KKK3Z%5UZ!`-6S8+'/IH>E8M^MD.P2<ZACGG0*+7CY>C-B`(T
M#!:&3W\Y11>O,I`:G_/9F*Y`9>U,7FPOAU'BFH?2*TKOG)DR=%.3M:SL$\@-
M:V\M[EY*7N.A92DE>2[@]QDU0B+7J!./Q8T9I*(J.?5/2J=<?CK\;;[0/^X6
MJ^'@?(J:%'&<$P)XG\UG;0\?Q=G"\9!BS)[D\::9X16F=L@OTX`6ZM3I>^IC
MRZRN(E($I^KBES&+<$-W-ER,VV<PDPP9,^"!L6<T4HCK3YH0"T/LN3;A'E^,
M[S3,$;J^!$KL-E;SFPVJ^02IZY/^DS_&'\>MQ7R^:IW?C3YS;8QLO089<CF>
M3MK+X4Q;Z!#8/7[3G4,?)I@]]HIPB#H=Y]2O+')^!/J-B=$%FL$_O[E<W.C#
M)3&JBTW_$H32*6B4'V@[4%X%ILQ;>ZT#U'7VMK9:^P?J-@><]AHYP>8ICAFX
MB;`-M.#-/S(K&<W'Q#!Q%`T/6U!..5R0EA>!ST?,VG@<Z&YM.(J\0N8&LT#N
MC<$QZ;L?7H(:^?+'ES]___+-=_\>X+&4I#FY5_[8R.G#0Z,:A-"H329`AOHW
M#.!'4QV?+R:SR?+*4T+U\4IIFFN7W+N0.F9=5Q.'7"S(#O?'W*N:9MM>]K1(
MG@$5F9L)`(?X=^SAQ2X55.Z9ZW7A)-L/L(5`>Y.^/HH;B)W8DEZH>@2BDG2Y
MLD=AFE#L15;N?;I<TY,`ZIAQ..9,MLIU@@,3[Z;!"(XYE[+D$_F8;)LZ!7A]
M#3B,OTHW+Y'S]:*TUPY6YYF)=$KVR$L8!-ZVJKK^)_7U0O0UE^CLA3.HF?S(
M17I[47ECI:I60Y6YM;5WU"RE'RGV(C,W9TWA&56_<'^!LL]7;FNJ^U"X5N&7
M^[M*E=]<8]VO].,UH5'[@]H,O]D)>*#R3WW\:]1_7!HSM&H3`+Y,5&Y\E!G/
MPTT!^;9)J'$8\4Q8`\:AP\S<6Y89T-.09!I*,*4'EW0B]"H7,!5H#MCGM]_:
M9)M"_T#\B!53S;'`55LH=L`**`N&SJT0>S-9$7\$8<JE^Q86H7Z\>7,%W31G
M'R?F$E^PA,D3^I?KDUU^:ZU0,;(5VRNP6%G"#.^JKY[Y?;L=Y-[T2/@D16E?
M2I:3LF&&SVV]:::90C1:4TT\T=X4DRY,L-%PQ_'_M#=Y6\A242V^Q`Q29O`,
M7J5I4Y03)H*7&>$3#=T<34:$X4OG93C[1/)D"[I"5]$+1EDFGV(:W^.XJQ*E
M188'QA;^J&VA?4.J&/00040:NEC[Z$A),L4`/4>G8B[2;@/M/[_"K@ZFM\O5
M`$[=(Y.E2QG?L?"?.H@6C=,KTBV;`L^'&2R)#(P@1F)^?,^F0DQ&.35W7E3=
MY]#PK<EMG[;R^!B!C.G)9_[Q98JR*&56-=:.>*/^L9.]^8>_UN.]E98PTJQ-
M)O(`V?H>^;(DWY;%3)V.&B$SF##^.LE.U_JO6X.Z`91LK^R;6FU]]2(\JT@8
MTEKY`6@HG/_DA!.T$)GO4N['EYC+#Q-&E2:R0T?6D>(M]X0(5DO*N<^E67,<
MGUIYLF;NY<B&33:YG(&2[KF9C^A$V)H!]0QTC#!NB9&0')WY=IIK-^/4O-.L
MOC>M\P:R%Z=-`6$K^]Z0<>I!CBG-]1Q3FI%C2O,!CBG-U#&E^06.*6@JFJP&
M'N&E-+W5!63[`H.%G7[AVK<@.RS&L)K+">@)($>,[]HD&?_>[_0Z.]M/KH&4
M?WPRF9U?WX[&\M?%LG/EJEY\U08UYK[:Q8_`F-_"FKA]U^L=;F\==K=<[^!@
M[ZMFLUG9=/'NZI9J]7J@RD.5PYU=KL6Y:"B"&W\(PN/?0(#`.!I_NU]TXX?L
MRUGT\!P_ER.DM)*CF)@)HTG(UJ.S5_2QVHN8C^,*?D(T^GPK;6U%%.^BV`*R
M8UI&5])B"QM^SP"H4<L$L4D1CU$E]C8MML,P:-_@:&[F\^N6<<)6@U!%&X+Z
ML5/14@CL8E\XU!ZOAV<@8D;M^<'MXN%$BH627'R2*!W+DKAE^8BA8[581`OK
M](TV:9!GL.KJ*--V;*V0YCFZ"1D"`Q7E/O<XN+U1+`I_`GU+D/&I(W!5[1`F
M;$J$8/#BL8DS"\/R_KSIHX'&0F6&'YX%F8@?^2C`T8ILTU/@1)/E&*2Q$:].
M6JZNC43JXK=I<&-XDQ'4HC``TS('.69*L(FP_NUX9CYJ;Y[,O*=[H%"7D\\.
KC>VT;23]9+@N`\'>8#-1I).DM)P.%Q\&*4!;+0;:G"UR_P?.^6J]AKP``,\.
`
end