From a419adb9aba1d11ba9a231879dc048d4b983c91d Mon Sep 17 00:00:00 2001 From: fengyang Date: Sat, 17 Dec 2022 16:37:45 +0800 Subject: [PATCH 1/4] BloomFilter --- README.md | 13 ++++++++----- ...264\344\275\223\346\236\266\346\236\204.png" | Bin 0 -> 77097 bytes src/util/bloom_filter.rs | 4 ++++ src/util/const.rs | 2 +- src/util/hash.rs | 2 +- 5 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 "doc/images/LevelDB--\346\225\264\344\275\223\346\236\266\346\236\204.png" diff --git a/README.md b/README.md index cb49cd3..a2157d8 100644 --- a/README.md +++ b/README.md @@ -4,20 +4,23 @@ LevelDB for rust #### 软件架构 -软件架构说明 + +![LevelDB--整体架构](doc/images/LevelDB--整体架构.png) + +LevelDB是一款写性能十分优秀的可持久化的KV存储引擎,其实现原理是依据LSM-Tree(Log Structed-Merge Tree). + +LSM tree (log-structured merge-tree) 是一种对写操作非常友好的存储方案。 + +LSM tree 是许多 KV型或日志型数据库所依赖的核心实现,例如BigTable、HBase、Cassandra、LevelDB、SQLite、RocksDB 等 #### 安装教程 1. xxxx -2. xxxx -3. xxxx #### 使用说明 1. xxxx -2. xxxx -3. xxxx #### 参与贡献 diff --git "a/doc/images/LevelDB--\346\225\264\344\275\223\346\236\266\346\236\204.png" "b/doc/images/LevelDB--\346\225\264\344\275\223\346\236\266\346\236\204.png" new file mode 100644 index 0000000000000000000000000000000000000000..ddbbc5c89ef655f5ec7a22701368f0c32b3a0e59 GIT binary patch literal 77097 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

P3-IYNu5KO0LP!k|~ zz%o_4J`aD=XqP|L1~r}NJja}}H0|5Y=NadG@M}c7G`NKEMw`r!$kaups-*GwG1rB%T42Uu06-#*qX1ATm*I3PtMdwwldm~j4(|vdoNKA} zC&%`A114Gs{!B#dPd3*@$uNGI_cOt;)@ZD8u1@L)gmAZA)C6`pfH5y70q_9^A{AKn z;X?!vhWh&ZJNUG$%BtaTP??nm;{9O3!w7o0;6NlH0(dddE~@~mc>ej?xB`MQbf#U`YXzye+mwrth7EKWcq`Zg(6F>_x}ELnHB{F-?3AW zI{*^2G1=gSp+sqL(%>M>9Hp4tJUTMc2CJRx!^LxqY11Av&n8T%azGnP+qyiHmX;h7AM2!CmKi$Sh0m}xidlT99Mj{ zLj=iwe?4d`sRP1}owIWhh?^i7{QdhEqzyqcB;dHmrS zF*!W~B!2^qb9;P3ndG>kF7_l(S5JfZm?*PP|5dllrYDI#2WW!Y+S;2_(6X(*du0M3 zVialQtLy7C0Bubc+_Vg&kM|!xzQnOr5V<{1e@?nF#|erjL@bEwL2BBce;n&u8)$W8VOW>JER$_6`rDahxK1a1{KaYFM_v(z;(9 zs1UdaT9oZJdnBjU44C~ z5?jz)FzIZ-$#Djc&I|C?m*=GUHRCbdN#8LJGX%;rC(x6af#OVW*>L7QJ9*XeXnScO zPbOQBr)JP?&Ub+V?9t(Xt*ktd0suuqXWHhO1BcSq(TNKB`WPY(()J_ZTy0Oda}@xS z0E^%4_vc+S&bvN+{`~6$+v#oa7>U`pS661dr=38r!qpfB;MR+A!b3R!VVt_?s=N*o zpGrdzkQrqBMPd}f0lC;J^=XbR&JS+DoB|pPI&v(6L9+CK`n6}sDzgJV;JptxX(pGC zq|~S#VAi1cA`Q|tpay`?2O6YR)nuvp?b-C0wXtF{BAE|oX~0Bzl9dT9$-$C|;F2VR>HD6s1xlkQM>|LBKCLQ%{kLr31opGNvJgS% znYvS1jRYJ5YZL(l_BQ09UC?bkz78IpwOJ<%{rlH}n2L2kw`DukDLm@b8f17UfXyyQ zp^hk*mX>g=v1z;S-gNZ}>z5Lv`pSEkR!RYv0AXZn&?Q)F=bCb&b)4VyiJ+9hbsVz? zN=nMpLNG0$-|4^%I={b@Z{)glfw@MvacpnA*2PpYp7C)|(CKtTOJiw2DEc6P>Gr(6 zqXjhO;=;m6(0sO*?&0I<3GiOO)|mwdi-6IsGqTDHD0PF}Ev9>c$GG9Gu4z!J3V(Ao zCc;8Rg$(djP;y9H87ubKXg+Xnzs!x}s*a9UAVK{*#NVtAR0X!P&FK2`Gi=2;ut|pd z4%g7RK67}N8F5U{UkL2%b^=%pRbW9N%LzOl%U}0zuB@#5ic|nllWyXF2dAW8c#WT* zL^q2MGvU_J!jV`F2a=|?hP7(nY5MbESh&bLKKU`nd$zzbKVYx#jv1oSCy z3NM`H$VXEywUMxKGRALLBnHL3laGERklzLvkMHRo634r6?B;MI1u9ng5YUN z;HRr_P`0b7x4D2(rDKo6|AwO!brJ2V`=CIxBAr*1d*yjf(EcPSvlZb_(0KC#baJ;F z6RN<$6uAET2Is}lm7G@>P4^G}9f7+?%cEC7wSb*$k0b*SWk_MwQHoo{|B_75;zKTA z7v`*orFY12_M1M2Icgd1OTBjl%yP|TwqZ}{|J3EYj6Hk5he4Vi1IyZ(0vVV0b~F&1 z|6~YSf?SiTvDyUWTowL%4meE1ewU|$88v#Z!4PYq4PC&(d+;v$BstN&Kz(M=0D5`= zXuLS82jVr0*Y1dtE=#~_MI5V4R!b1}IW8BCmwCN`#pU?GhXn)n9i@k%rqy;Mqkzdu zgANdxa?VwpWn2hLi{F>9Eo|Nt(ed*pn5ctb-tno{n%Y{_`QNW)lmUA`brYLGWK_o> z%S@Y0TZ5IzS*7b-K`4u(7Yqks5Kv_mU_!~toU08~b>rhYj7&`Wjo!Td>HKI=5V6|& z-FXJ^5(zVa|NRMS;l-gV2n>Sw>t!{tsEaqiqPzbwK>hgfwqksl!Lq${DGB-G$4ht( zJMIXnJ%I_H$yU(026VjSGl+3&t$_J}1`E*WrKGE^9e10TSLS^|L4k&~wY7Zq{prv-QlBH{arisX1Eu}ZLtrQKj*d7Ye` zpx{?&fORz!^FU098AI=fa`EGsuI63|s#?J+#NP{K3~S(%3W11gj&$z{SSd{Jv8n1U z$0QN7lZ+Eht000V9mj!p^5Fi0)5t9kcr~GMpNSkkjM$-0PEJ}z?5bTrdl1S_#K2fz zKU3G(SPeKZkaMRUN9=Z;5~p2&izJLPABsKV-%g;aHh>)X3$oO>$g?Ki( zIUpdPdd}3jnFfHA9~axeQkkcFDX-*&%onDc{0<{wwF8N;q$uc{y5?;>YN-&;%MZE` z??0q|PIQg-3Ws5lEDs?g<}fEJe;vox z`#xm+1`*aqRS&p)e{9l#m0a<{Y0cnV_x-L6m9Ru6%P0bCbEN01tuWA4AU$sYUHh7c z#;M|2-e?pwlIEWe|L^&gB=^6XxUsVHU9*mJzy0O}&5=A8vyss<0p~G#%wenHWPJ4d zo&3RDEKH!t^?A^o?%uyU(m|>E@(Z9B0UgCW9cXXhYRI?t5uonk`ar^t~fARe0 z#l0YB`Tw@>8VBLv@^8j9RbNSFVFHN@hzDJuLyh1Ra@AWcy29IXfChD7%bC*aWlmRB z)|JQx+EPEHz~Gi)S>+gs0XU;2E$AK%6v~{r<}HYucqUklWY!+9*{mk%0BnY!;V_d} zY2@F(&NG+VgV8}i#Tx@lq*Cagi;xcd|*!un?b`31DXU~{R0T~GbeOsZE}Ah%p_U^qDEE7U&D7tjqc@+vK25q<*G44zqm`xo z8q$`k)k!OWlemPUkrgK#D&tyFb_J4^KbCyC>oN404yIc-(hfmjlH_ZRSDzx8N{6;8ZS!xRS%g_5Zvx-vnpkp!wvLpbdEv-rTNq8PrJ? z>9rF&@&NFK7D4DZ4=7nGg|_9PXQ>sNK_>};66Ept6a{Fef67S{{lh=66q7(KOE&Yz zZ|+Mu2H*#{{I~%zmwCwGO1DX`**qH{AGU(nXdrUe3e%$U2AWI4H?LVAJSs>cz7GSg znJQT9l8k>L*iq1zik;Qt(HUJ^x)~}QI#rJOcMy7#g;e}warpx`Y7e?IvMgYQ*wDsiGiW&y~ns33v^9Zs4RlE6u~oYExFnO+>45^8l(69L|} zN=fl7IjD;|epeod*4JkWrIq#dP_c(RlP>L5! ziI`*Pj~A>8Wgnj+3&V%5MH?ZFsZQ=?4=yuVs*|jf7(_@i&(niW$eI!QogB0utgRwm z(1x*`Mh|pYrNc!XU_r8(s?OxtY?TY6!qKUZ+O4L$78gtnD_xY(A>c(mCW|`b`>yx3fVw92xu!e0lj`>ZGuC@>V#RL zF$lQ`6LN?il!T~RrF4~C>>|+@@VT`3C^QDNzB0b#VG6qm8p^Hx{Ejq=HS(Rqejzl# z|12>U?tKb=TnXPNc<7SUHa=wy&P9}fKI>a`MTYT$RKz>U)%Z$BEg>#EwAe>NnFGL% zSmzbZ)V?#>cyiJlb%B&Rq`B6ty;X6ynz1_2~VkRek4f*jVF19U{dxzv2? z11R<83FMHz{5!oCSqV7zk*~^?5*smRW=c4YcN26~BB(6~zJS(U16P)R5Kj^p^+{Qy z@-F?E+kTzf0)+39tXb_^R|_{0URQ5d#?>(Mu8b-?AcTBQQh@&tk=t6id52@|!QHUC^YOXYsS~^Jg=UAQhc1MIPJcEc@E>6Gr&TrHXSsAZ zK9vHV$LE0rQ_g_ZLgRgi7u@(;qaj#6Mep%Na9PB1AUaNv4ZzeRzR*mvK!J?xMUiT zu`;0l)0W7TA9Q6~e<#DU9C(aym|q7>hyywHTM3~X!7kuKh;0U^Pk57+tMNdcmL<1) zwFCl%k*PvtF@7c^P5|~GgSUT zR#LhVF`X9EraRV%h&*&NebYF7Vt0r&EQp$(+>_O(0qy4jDN@bcelD5oJhLwO4`eAX z?ae2#cGBsYFGt0&YlOb{~H z$9m|HbSO1Mm4l?-HZ-arD))(3h!8mGBr?Cz^{sI50j|9d;0>oM(`M^~8H2|A6R6An z`3m8zLIDE?(9qzv6UJFnQ>u@(jnT$H+g&2*@VWMJ|2YN4k%-9R#%A-rceLrb{|yW> zTDW!n^>w0mxrW{-Cbh>WTZ0Bdcjm3ERxf&EfwXEW^L;p2YAHlt_bw~gf zonijdhlKZ^K7A6oB&q}I^AYT~`yrrS98CS1XD0vP4sGlU!X3YpuOB|#WUFJy02x^^ zdLT0eEP63SH;Ifxl+n^4;<8%)OxrIWfJjp0(lGcqebpuLyP!d(*Q(Ov_vn?j;Csoe zYrWjq%^zB+E&TKmP%8P5wN24w56%}#l@wBlt zw@+o0ebrNg*Ora~yjsx6w4Ke@4#7S%+2$w{5CkXX0e*Iao^X5EX)%1C4ZD)$L%=51 z75LL@7Da+OK;rZ3L)lQd1ipFcpk;=5-Wj?^0gkNk{rM@_XMm-!9Jmi`Ot?$>av;)c z7Bu!UMffQsfWre&wla1$-&&yOM_7Bbk}JdshE$C!hCW1;IEosAk|1bQksXJT^o*N@ zkMK8^VqXg`TSM1E&EAhh!{A>dYDzH;9&v(dE$8DT5vp94JKNjA_Mn%6e&-p|D_^9G z9K>USLqkp)eNetUIBs7=FbTegVIqFH1PdoEB)YVF)zZWpJbk*qE!t805!d_;Y#AW0I^Y}iEcwvMksFZ-xAq~>qpoBCi2+|?lCEZG= zG?Ge5gLJ2o(m3goQb|R+_BDO}@B3kY-yX+W>sSbrImfuibzgCwzxx=y^$`LT6?2!L zp=JCYtW^?idxmIwxApG-J@UBG!0>|$U+B>iP8Agv8DjB1-Mo{me~fT(QiAH@{NYuB zvL~y7UKp3-TAW>Ca@&0^60|LZjCNDa+q5)j%+&4GOv%8-w5hm{*0`FOX!?n8x2>6K zX9q`MzA|WFU_M7`&v)<1z@UqvMRiENBIa}@wSuy82xOLZLcM2)&yqPf=p>dbzNTvC zJR_Sl*KQXdh^G(!yOjd1Y&WG*#SR^h!*4HjbZD?h##P$=_T~qrk5t-Lc^dZ!|44_0dwr9(G@SUfsH1lH>e{6zR%$y`Zg_gqB`6&bp6*n;zX zLdWixCCa!go%gIQdbbvZq4sh&J<{qwSZ-?Mghj6 ztoK4%nI>!lIlO#RmQI^v*_iL*tzE$N$Q_c6HrBem**hoO97?yi!Jw4t2+ztX z(Nok?j5-utj6q}#S>Pdh75u(De)%xOJ|V&nLCh02|2FY{=R8F(dM~oKJp;+^)iAM3 zHdldggKCNB$kxT*6|`%P!s_OOz@EzXPSef!el@@IIpK#7t88cRJDrwO+V!L#Ki-wK z-krzSEEPoU{lu!T(+Bm*W=O15z&q*KeLZ{*m@dSF#nLPyddYkkII@N|uF z$}O1e(bQB?;z~g}dX=Lwb$-6MV)DH|;i{$U87}-U*_5&k`pfDOYP#t;wR~OjjC{X4 zam&%5-Jp;vP?4zAQ~6Tn#?tAq^RKP+esk>hi}go@?5sHj49Zec;)ZAA4|`%AW_HeL zygzsX#kU84CS-r0-EzEq-N|alp66hk zwxJZ{5Np^rbY-U*)PgX}VFgnfRXPLWJeVyN!?Qz-&IM})iID8sRF z>xc96tWCBhKdO;~#raN8e)kYc5zF=)(;fEvq7`N@T&y8=aWfiIDX+cnVb;7_wu9x4 z0-{Aqw@UJ|8>L|QeRJQq4mlsB()zS8IQKU|9uoNB#>Z|?U(DfLk+sZU_Co@1_jGfX zV%s5*;?jNkXI0ZUPZaT3&vAQu6oiDL#O^OdvF5w;Y6VLDY}4u*Nh`lfQl1%PnQeS^ z_B-jO72GPd+mx&%v~O=s{vajNuw8{tgEv^=$M-grvUuYwkBgKVI?nv>i`KEi^)AdQ zc!3XKHrUBt(K7w^K;*uRa_?fx-qnX$YJwM2GH7~ECeHz;`@ z_yoqvZu%Y1q9`0x>4`eC;hAWUsddQLDvRtqc6y#o=tpd*pz%25sI*(=nqrV8J(5IY zv8Te2r0-c$nI3;rps0yezjRpY{IRPnVkIFL!P$`ahEel)rJUZk(eZ~@+JxuD)uFJT zkQtto;+*!ZULWozMQ2UZ&|kLa9Mn*^BcqiK=45W%RCw_^H)N1CZS`wg3$X{F6E>NCRqI=mKQt*mYpgbueLeEYr)Q!{M z?>366guXnlH4KfcQ7o+oOoq~YAZE{DwZ~oN(nt()d}O70$!atE=k%cKYW`&WL3viC z-9{rk3lOwb$`_O-KS^h@T42q8wsV+tp0NzQ=KZ^}{W$vhebd*g=5;gIAMSscxB7N5R>AU4Cy%*Px6e+j{Fcco zWC{vZbCdY70_s{G%Z$&($c3~9a!4RNnE8b$#@a61RLfSD`_7s9*j0YDIlj(nw4^z1 za-gnC$RZXG@lO7`-qIP3OrFc5*}A!sb06w>TB+Z*TDt4Hc;)MS9N*SbS)QR9tWKAo-PkysOdn%$fM94*6m7Y6M&MC2y*Kw5Lwss;L#4`?~&#wwIzl7=x;GqhYn~sb=yH z>1=$;@$lpD?erQ4kNhI&9)A?nDyTgu$7Qkk2hD5vJlHScq0X?YC1-YTIa zS=Y{TZ)2rmtBpE=U&NZT!-aqNeXy99Y}G$P2oC~BF7#?2lGZ9^&3`q#o{g2xi8^w# zNN?nOAV9v}yhQQ3HpFc3&dIXP4(Z8|1N#1`lt!K!4y|k*@|Cy$Gz|+`&{njl!Kjn_HMP_%1Qd{f=?Wg}v5|Q_ z;I*Kc=k(_!o{k^Lh23)`7N!k;A#K4{{I8_nwSI_NJ-1tlaAG+*EJ5>hv!mCYz&XVm z?3FG5!nGf_vgJ`$6m~6OL+2_(VY?mn=S!~UGrXbiMkIRkj~{>D9H*Uf9NcmxpZFMz zXSSo~^!1LtpB+kU*|yZP&s9xq1Lq;O4pWH zFW8vq2fsG(BWSdBc<}s$t$wptxXM{!T=O&q?hR3N_5E?{fQIeLfr;i`CB{Edj~=pv zi9-wKp@--=J|!ZTz2bGrXJ_U*x)e`h?Q=hI#pdM9hjtvdSkS^i)Js?x%VuiBH~DU~ z4!mf7i|CZbs)dB^*K`L$kdK6Xkebu3d>_;zN@eonmwpvwF8TS|F``w`a-aXi#g^vg zt(Befs)&9nvbm+?*S20HW#L6I0lk~0Z^f|hV54pz7K*dMam&PvC=*0IYxr@wM-Y71n-E)_-VwYx)S!-KjC$0)) z_N}k1$`8m18|nMQA4~>aDKRA3F0NaSwQfh07`FXXlSLiz+VlNbJle%OH$$*I&mS@^ zFp}Pc)^xp)rhCsC11p8-$xbf>4|Vke#AtwgLR$TdLr1_pFzJZ&c20jPn-d+m`EV|4 zua9=lt@cm#Hb&AZiOP?qnu%iyG=k!~%d8S+CH3lr+d{c9W_sCn?V%Ag;=RXnRm$n| zb7kY>j1mWRQz(BZ{L>Gpv_I_}OUd|!cpTOp9&#wy@qB#Z$=f{i37fN0@Jq+bp=KDP zj86!juMq#Q!A3*#;U81$-~au;X_xTi!=L|erX_zx5js^frMH`LW&)LZP)xhZO*l>w z-_QBCxlLuc{VJ{&VO(}Q6M3z(KGG&Rlai7hbd^iF8GS284fxl#ud6eqAxoP$Tl^KS zSxbn*3PQdA|7>7nVthJvQ|#JD2u8ciq z${ z(cphl!lYeo0luT8J`Q3pqdY-fQn&>4G-6p$CZvx**<3)uyLvurD?& z9ei`6@s6nb>Cl4<)pjN|hx{%M}U>#7CpnODnUU}W8o--?KfqN7-3Z5hLc%tbjG9Pu z-M|VkZ{TKS6JLBN5Ww+-)fI>K2&rRtm@yLU8j=O+K_!^TjJ^(kj7b%A`fgA0H(rsQ zxdw4%Z?Ok1%s(JYI0eDOwMAJg%XYeB10a&XbL~&wzqdwX{s^`LFX280)2d9)FoJgD?z?EWXi z;GEQDEG3AeWF?F=jtVEbe}CZsL=!I4AkwNHd~0F|7EZ@+8ZS;qB(5(&mSqU`8NPa{ zJ|F{OT%jeRap>B_sxl-fcY33zQeNC_6T!4a&%(F^^dVJJlUd}LFNN;>-BuIKZD@ew zfSQdSgUcYwwpd<-JD)aW-p&iUNSrCxUKG`v1aH}I#2kn^C{It(!aZJ@AP0Ta5`BWa z=!han1oSXgp`{!OsK^nOT2O<6Vy&UyiWM-jXU}ev<%D)bWxOf9O(ID<45Bd~8&z{t46shLcmYZ^}4i;q#D7Idq-DUf}*Uj)qksZ1AUzwFr zPy`udS0S=?JQsIhB=z4FDV7VG)=i&*<4Y=-NWH4e+llO$S-?s9U&PGhg*QU}G;5O{ z7Wr~C2r}#U&bx=jj`hebma4yjq7!VKXWKj@qAq|!xdxAFU5Ia4s0du$8|`!UVUGzL zfQ_@m_*##gHSoM7^Y7@iZB(NNsK^|^+*)-Ex0JW%bD$?s;iWdW0JwuA+V)02zGJI% zD#bJFShUgDfgYwU0Xwrx7`(y0nQ)KBc?#z$!pI%Lb6cWbH2D=IdRg-@=_#g-6?M+u zSo?t`0P4!CULZH|fmAujH#)T0Lv)eoM8c@c%^^Q<30%81=aC?uokSqoNPU1Pxgb8X z+`ZFnY?!j$=pjm3R8m5w4n~r2qmzD*DW ztYtP-dz8iIHy>gtI;hAke z*kwS@dH~B{&G^C7{QOj)iKoY-Bf8Txj$}CTwT51iZjLP={Ait9%g1XLm^i>Es*odgkPoef-1BLyU z*@bi}N07?-fMDeS`8GD;{%Hi0iM`=6zq?QJpsAXnqa$-?&ohh4htrSnq?Ky}kQI&n zI^HDvr2FSq69rcC2b4Xo3spM?11Krbz)qK=ql9KjI<)6nRTKQ1%5}}lE^l*s5DgV0 zKiR^YZV+epQ7cJ32j=FTkdjj1WpT8CMD*kF-cq|W7z>-p%aM9kjTids5+G*v$I(=r zAw6=H19Qd#q0P=tPijiQtPy_S?uzG)%EAvHR@y~GdfN-Hu%kJ=7;Zo;;@dZ|@zK#y70!Oj46-~d2jraVH zo85_>c?ASqhWMsVI@Kz(C)6s%reLy21JWZ)B=;>LaD2IJ4{(FIm0Jm7E--X`rlqBY zMSjzVSP)z5&ioD04Nrr)&SHAXShA&KM%Z-jwABy1UNSa-U=jrn96VL+P?ysA=rCx) z@Aq6JpK|4B+HKmp!od$CLmUM$j(8YeJ#P)XM2glq{@Pb`GsQh-&a{PJqH!xaa zQK?Xm217?YM0d4pWXVhj8Srmkez`(nVPzG)*+9yKadkuQho=G4;1T=$9oQESF&+!I%kO=IQG}^J>FCqN-G;UX^EO zXRr%gW9zMWE`A-JTK(-I^b~wdN1jpgqLdtUh{c<9fm^udxUZ!aAe3j=^4o}x47#-u zMt*rhY=TZ=0{cl$@8tyywR~)Lo*F$nZu+OHLuw}^i6Xyn_9zt<7B(DQU$$QhyhK`r zJXWJ;z`NP*KLBq6dF=sr@bQM>O>v|-AW&FUl(M20am7(7eoGy$<4&tKyp37}0%Ndg z5#C}(rOoW(=Wv4Dm{lxSa*KZGRo7S}Z3NrM69<0cfh(V@hg?@%`_vz_>ZC`Y;Jac@ zAM(>L$^YxqX?X2`mUSq)cZB9EKIJ+XNQKs2TARXzNlzF_@&IPD-|n}jK*msloQz*%GQ1Jh+8jb-M;E`D0b|#m z$~_rX;K$@5W*tyV0(#48ZM@G$;F?ubBCe*0UF2!vJeaq=;8pW1{;4~?*(hUEbZxG0 z`%FMs#yvVU0p14rM}$su&q2!@!t%eSPHk;d97PAm$~o1OkZyAy%1E>Yj3|d+27yCe6XZ* z{sm+f>Mt;6?0$QY1M%|hPs&-P48c#+PUJ33=t7_$`K+V6=4nuIy@w>SVT8h>!<#Vy zdznnzUbe>5r~4fs^YxlJ;i>hZ*#@aheNSxxj}98AMbS!T==$`=Vmg(>+u_ z1zB6Et|1vFVSmLDv+9A0fs~ET;hUZiJxc;Z14Q(vT)WGykmD8wU>>BXe7r_-;RI0| zNKal&|ATV;eU23A(|FUtaxwYZ+M%Ddc`3H-wfF%M#Bxle zz_+dA7P{$4=s~+JER4kNz*@jJ`TE>uM+QP}HIm7MibTyE)tI^C767FOvH2b7*jAg=WhyEsqRZes!sFq-SC^N!W`--3@m)w*Hr`zzH^oy9)i=pF7 z;|>YP0%4M2An|k)^h2m70c3$hP!r;upLyrV(Zyr<^y$oPwg1~1$aQ2OPU0x4e^hZr zqBd@d-}dP~Xt6k2_khK83NopirEq3|#^x3hmk{6yRl}sN2@#xCaHnBVM}+>Jl64W=*+09=)oLOew6OKU+oSJc5+TDuy+ z6Ii}(3N8$jX;Si{@fP%!)NS`Kdn)IKhe!N-8mo^qMg+^uO}%2 z>O*@|Z~35}pzS+P6TP|>hPs5li)w(`OpG^^U)Ga)9~9Z0;98k5CZeUO;yJrZj}Op9 z%s?t!Qr;h{xw5hBWu>KG-N~aV31(hYv|kA$C;bf#slQiyc`QfYS1QKaBTdm@u7#%o zX%ycxg6tQm<*#i8#|nVqpemI?Hcz(0U<7ja|EKD1Pf!&o`b1CaeW*=@>lt{~R*l%4(8G==XUl zCIpdjJUd)Q@*aqD!GfFJvRyT(q@j`2g&ikmT86a60AMm0#PfEG%|CJ?PXGbY1!MqR z%Z50WE%yttTH|hXq*(@3NJy``8<^Ja5fVDD1QT%s2rD6H>_=*)4L;sX9NO6?DBRa|~Bo}gvJRbX*lA(E*AKHrB>!VOQTN&r>k_LPA)8`#b; zYGdl^_>oKn_U3Kwo@lbE)jeI+F)-vHOBZ!bO+q(jnko#i_5;0!&3mVI3JCL&VSO>= zKdzdN3v8^g-Rz6A(Y`SEc;B!i@}9K8KL&>~A0M9>`}_~yS3jPXH*Sz35f&qUM?6UM2mK*jX*&RR_=8JM=-)9g zYj^X+Yv2&7#}(nBRDP*8@FVZD>RVeWMh=jcZR9-wCo>k+X`d{3plzq?O=Ayt=2D>P zk_LAFqv;0>N&q%AfoIz1q?-yP(GX#U{`-dpK@lCv1*8dxgDDdav~7?^sm6n0ks@%% zfd_8+Ap2U>7wC!K6d6(y6CDAo6r%qm)}(A5gq@o~1S&tiUHc*{<;{PM4;0ap(5$(>i2WM z>GdFhq6vWkCl!o7fa`}BCC@?DI?}Kf0PwzDziP%!f+*MjXFY?)ixkifkWW5hwvyxU z{ovr>YU`dahrqleS~|bocQ76ZvZloOLZRQd{2H_C-#HOD#-U3NTCl5jAhA{#2O|gY z%d6n2gT>uVpQ6_lbejO^l(@|;qexR4)x|P~9$>%VorB!N=QaGP92B+$V`J~1^+6|n zf&aU;NQ<8IQ92la%ERdxRkM_!#_eV=>LnKS;9NRiJU#))U{{6TAq#u^g)uIh!^#8zv!k&FzasnlEar;Vy<*?K=?_8L$jH5!mn2qPFdzUUr}xX+^1;7C0*G~{zWx3n?0 zbj435V85nlc!qy@c8J;B(mf82!qc%>zt3b2Eu9?xr;2Im>D}yB*)?T_RGei4i<$+P+mXu=8?#aAdHiWL0+rYNw7P+3e5K{ZQ7dp zE+xp_SM3&VHT^S0iusLDshoC65yj0A*K1i&caCX4nd@Y!eG`)?tD~2rk+^r}SS74& z@1R#=q4RoCA|dJ9$I)lPHzm~W?S4r{RX6%_ru{e57nh~?Nlw$<#dS?p#!C;T!wq#3fqL2&&vIL zO?NEjc3oI#4k$@s>e28rYi?$X!E1xxo>{6Ef$Hk z{ac3HF{Jd;Wrz8~Zo~cE*>-h?+pN{OPdRj@{SKSwem^mgvRQv-Y|9mt>0NfE||WhQsDbj?BWWy{vel1PthPt93NUC zkFQ_Db4)*Spf$DkJeUmQS+NJo)_^{kNGlCv>Ww;45lOw?dJQ*>l!KyWGp4q>uuD}> zn~0{zkEiXrqE+5q+(8^>J^_~#$4A{353a!~G|Lh}?rjzcTP?gzzq2`HrA^zP>9NpMr2tLq2a`DCHaCt4#h2^s)^nWL z+$K`Ni{@(OR`Kioo(7$Qt5$sETxUR8{k04$}NWHz3sV>XrFOS@CtWQie2OqxsAO* z-wMf$($uX;z*l%!&~j1DuB{J_?dX_oyK>c6tww4R4+-6dHY>peU0hH|7g=8&#+dHP z7ai2S;t@&{bXWh$_?qOc-Z>#j@%;AXmb`z0!V%y96?ut`b zct0KvB$w|Zzb%aF|GrCZ^4;fOpNPg&g|evgQ{uGR1sADn2enUy-`On2x)US6_eZW< zAx-XW7R|SZ8|ifHI?{9^>BUkwA3o*%7j?4XgipjqlaV4zCnmPoEO(3gGtMJ2dqj+2 zW*B2+C*po7xjTLIOj|>bsq`Du5FH9mz>KhIJ zF1KWuxOMN3&JTQ-yA5xe7TiBxv>c2M*9{e4T<(1$AaK&qj91fqGURuDW7*P{&b0@N z)NLl%QVrkA&{yUlmCFNB+F9$ycG!N3&73R)xY{^ge{oCY?mYQIxuD5+JX|_DmXspN zPaoev>94jR=pT?2$)p=elPRoxTi|5J=mB2#gi2?6c(q`gZglGcl`krCC-=!%;Dg%c z6*AA_=I1)aNF_9G_*!Eg&2DTn|GQTUR-tl^4aLQBSt2RWdHn9DPf?Cd zR!KncY|JA&=ni$z^w?)_FJ;pu&06TC%u|MEM( zD9ekgA8qHODvZNtUgU>|(z4Mn*T22U%~bi5?G<5Z{g9=+8K>-?_FlW{V)aOs&nz!W z)YCBf`lT4RMkb&A$K2vqscDzT7TuqE_Q=qJxB^e)GH?`DU#MsP{-9a`f5-n;hQt(n7q1h*_vyZU>pF7k6do^?#nYEOL} zXrm=`RUs{^z0fwCkyN3^x4iG+&;+ZL`mBM1rgKc#@qwEpDzll{vQ%f+Vig%?Sgv z`V_Jv!CeptzFWQ(+U*0Sh|hi}hGm)1asZkj{NpJ2T|`mZaOIZ3+fPR(#b?*$6YHmu z*>t}Y@|~CCe&cA^2IJY$`|emwZtf^dCMoD&QA*FhLp}{n7Yp)+=OoPEs|~#9b`%Gr^GX+N zD{XCZ<_vLPzbY?I37g8b9LM}Hh8$S{S}5yH9=&4|Ex&unL?M17L7+_eNKnfy^f%;w z9!qRSh1+*$N*3v=FKDCWcn&?AD~w4WC=EpU?knB9CK;Ae@&~ zJnK8c{8;eSiPs|P2@A&XQ@*T%`}$S-Sv~iI;v-kZm3NNf_0GjS6|*`gYSIvifwpjp zuJXH86uDAExvO{!IZG`CrlPRJH?jFbCah?K<@BG7`w8v%%(g$nrt98DLqYHGv-&xX zV9UgRp?Fr*MfQ(d++{1)taRkzr{#;&Wv4SAufNYN99%*}aUazAlPoUfJmfB&$^0B! zFlx5zk}1s{_vcpobWT~ANTf{jeD${#?RV>Yu$>DlJ2Ht#t1b8>#`JinAa`7|UIoWn zV~VK-LZxs=3_ChJddCxhIrkf=JWfE*gB>Xb&35H4 zg%T!Y_S^_R1@qHTTjE#u-mO#V?8Qu@pah`EOFw=d*S@AbAba_)kR=J$TED>|I$6j? zAbr9v>I3&ve@B4|d3{Ser*fB57o{OQXZMM?Q zY7e_n?eN}bE&CP&E?r|&R7R5BVDg#$6Dwuwb*w)rqF=se?%jCsOW|~e%ko?8^|}bn z5Z1}=6V1enH&0*swYWRgyVO7DZ20Spz>!FDl~ScEvZoYcG0f$2z4at7xD%oA{7@q5 zP%4J;lOG;@-OTmZQ_a{`Vp`IkiI#ZCY`Fc8Ek*}|ciyJa&!yAqjdWD`k0$a3Casot zOz5c`4NO_7P)SX``x-DKfUoqc_t&SC?|1AU*nHFFwb=gL^ua&RdHI=OS1ndu`OBdn zn6SbEHPL4sT_2l5kZ+2Bd~8|;s(el?S_(m;29!SZqnqL}?zUv#CMP+8WC{}xBv}ej zJ~GTQfbf9xAU44h*!A;b#RgEhB&GVz$=x_2SOG?yeE?-01o{dIrxA*Jfl}xC*-u7) zmKWuDO-*U~ZZkLUr~6t0UkT2@qcrY(eG|$uhQ($kb~P3YwHK8{hmFlBqp2F>;?^Ry z#fc&F{gdl^l)C&k^6hGz?<(1onG?C@8;e-aQW20v#MfQ1WPBh^t5UF3q59UQWU?H_ z8~1GN=%aQ@{ha1UQVn4R1vBRG=t0W?;t98pYCCriOPZf6xCSKG;7#7!!Tm&e->$d+ zL8BL8XWq-=NLdfFqJW}!0 zEhs7?)(O4Ds&66K=nw8;c4AC?^F{mQy|%Az8I#UtJt%UctfP$^2$V&M*ofkKj(sAgBP3Uxi8gEA-H}_FDbM>cwxH?cy>h&Q zLg*;*e+g%`hWA(~=ppBpcRjdGPxv(DI30)R>z!Z*xI#f8`MhRPxk4tBnl}6%X_^Uj ze!_U}=&m=tjYUL%FPe$PG@DVB8{H>Er+my*L^VWWQph%sS(eeD`*5GP%yj6-fu+37 z))(EBcJFhpD31;j1xXg751(6bvSpNCUec%)qe|;D!#!y0e@jqyFZ>WwzUa?Hns8#z zcKDAnA6a23KGV|6du16A?GYB@x{wtot+752v)?#4RNRA`fo5BF7oK4;h4J`mUQ!{E(VL-c{_~S%Bpv=CvMt(1V3l9$wz4zf9 zah&-UUsV!(opchd6-Hdz%J%EaWeHrT;*Tt4ZoQ_7s$Hok59u5ZA?)sgQ8)p33oUCu+2Vm3;Vw3K=0q50IwIZxhTI_b^VG-`XRsdS8n;DJ8#=h zrUhvg>~7yy*;rN#yhL_+X#T0sHV%3N-VjN4xN&J~z?Yn&WD) zm)<@Xh>e?2rEWAoVi=@|dlE7vn4NQa%x!dZNIa(L{GvtadhhC#plQg4dr%^W-M>QI z1*2KW1S`f7?Td?j??M$}elAFPA&My2oQ*WzS3O9ZuCikcPptbXaBP2vP%MT=OX@0z z@drpA9$j;m`7Xv=^lATocsqKKMEHQF>P72(yEu2OFa3D!ew}Bz*e;U!jN^kbb9cLVIxJc`epd4z^_#9|tx#gT zoXf)qy}Qu2b=XvcXh!izJNo(dc}?Kl%j+I};HQCHq+JkNdVEAW^^n#(m0ed zg_D4;`czNvD>TAjA>2lReh0{L|FwsJ*8>t4c4ud2Bos?tMWvvvEeqNG1GHTzv<-hT zei@sd4jWwWT0LDE&Yj!oS$7^Ag|cnoo3hI`T8Cbery<4vF-0 z*)wh2%Z8v83H!7M0=m z@NgzUOX6>AO&&J=cE54|nh2BD2`6nq_7juj6j!NhIhURvWk(I81Mht%vnwfXGuf$U ziy${RViT!PpTi-v86j}3L<)v}=Jx9!iNfa>u<9i#&NUiaEuH2Ym$8Dt~Z=44+`K6?JO~Y}1ieE7{7@u(bFy`i~J{F}Fq;4WJ;fPtmX& zo9%0RZ$5JU{TMPA@==epDb80t!F0T3?}dDMQIttcw4XV%y@z@>w)3i_5bo;i33Yf; zjq=#*^BK;4riU1{m;Txf%QvbJErYWwAHR6l-=>zXpt+4h-4r;osjjp2ti!Bh?9m@{ zj(0ddGwNQ?d|?Oz(nN017#?Nev!_JX)bIkFvm2;|$di4jeD-gA%yc6S4-bcfb}}Eo zLFaN@euPZAf!Nsy&0rV|S~|D`2oQ{{k+iY%&OOl)5qAK3HA@A`HmcC>Km=*)%tBdo ztK8YcGIC^+kmlD;@7gVJkKHHr^O+3m@fBJbIc#UDcAblPny1WKC%5`*U9`DRhwZWw zz0)+~+jcQCI!Pg-;kkai9zBpOIw~KVb)3i$e;w4r<~^GC9K$i>7ju@k?A%;UG>cYv z6|GYmRUw9Y#952JRbQqOWOZvCei0vdIE+`yag9arEx+<>$MXf|&3dk}`6fedQe`>d zD?P7Uk@6i&BjM8@f_XL@r&{|Cl42>>hI6W;3r-3zmmaNgexGU?GGkR7CXCDW=J3A} zs<1i)-z4p{2G%jyUB1#855b4RlKn566|I)=PkwmE3C$NWA&CY9@tJ#he4Y==nBQpG zFFul7b#~Tl`TBNz5WWqe9O7>`99HwTaYGEBEP3_T)atEob%*3(zDus;IivCXST7vW z6lD3Wy1z9Mx*w1_YqmW>q#dI;*4uY1G*K@$m&o3sC#-V5Fm$Sa{z?Cn~45b|p;?b*@$BhYNY!>Uk zufqC>OeN!kb=PeQ^KTP)P{g3f6+5s{ZrQW%)pV3XootuzU+7)^ue?J(WrsgIgdQ0) za*TB>B%9Ty6}-E*=WzoDHL@^hMw0EHgfhn_#K+Hit3wxD97%FShCVnnb69IgA zpwL%Uogsps%aS#B&4o1k4vfG}T)~>cbIt#dgl5+OWqq)b8eXo%wM0fId={b1x)i+w z3fOQ=hEg#h*^+{MQ?6`w){;3IwwKAq_3UDPy&wYTBGUctD3&C&*bcX&Fo`WnvsJFi z0eOfE%O`$OSKET~Z1?|5!1$ajWH~S&t|6k|Q^=u8_rXahT04_bP;|(K*i^r}>BF_` zw}5W>Lc`DRt8D6pMf*rfJKg9Ue*4UEeKq-}lJboA+5px{m2=n9tj*n5J$P0OCOZ~z zm&W-MEJf1lOe|3%l5182` z90Fu1g&Ted1&!~{M+knj&to;&|89s$CZg@^KhdTCMKOh)o*akA=LEsg;AR>lM*z1rm)*gg)Y->Q z27|@ot^(^L79#j!KC=rdq~!0D-axK$SD}ygyULPvIQ+$*>Qin_2>9O^@UWF9A@+k!$Z=~BvwCo)I+YGE66fu`1|YP z^>?*?qM%eOX0?^YH&*4p8A(a|ODU(o(jPX)e!l8a;voDwaUOZeZtlbd1*u^=l<|ia zw!hP$`4fbX>4DFL1@IzO|-$k<}ibqQs7Fc+LntW+`ES?oz>T@NC2v8R*t-q(e)m$xasTabcCC_QL zMPMc*c}R!gcsW$)QkmJGr{NQAj3MBu{IdJyukPlY?OTv!+Oc^3lncB6=Nl6Red=Uv z^5h3P1lxOR3kzFW)ZLA5YVWHEtdf?H*(5)fa0pbD&=Y{{t7z~VyPt0AKyR_x$GUuOF|Lt@HwUw4&YUAVOikmcO)ArVQXg zC>EFDghkGF`N|jJJXLStz;kEVMYzTth+Yw`0Lz-P zx65!K6s#8{YxM#o-S&I6a1ev6j*c!HM*SQTPvZ${kWn4vxDGf*D1F1jJ-o^Wey3)j z#Fle&)15jA2|WWt5@rhd^Y5=f3? z?fy&K#WrM=q*aV@_1i*sh{VG*acHt^HKUtR=ibRl9nm?bv=cXTy54oougY25n`6Du zdQr&;Wjy!yl8M`l8w3hW9SeV?xSF576o*dC`v!Zw0i0(-KjcWO=e)i{`{RRS=NqW} zv4*T@3yGc3gE6Tjf8K%;YxY8HhVzHzJNbOHGAvSOcLx7{^|kU74jq!|VN>|^uc0S! zHm^VX%c0Z@GoX+s{Lk1Xz5?sCbvh&pVII!JSBKf*bfy!j>kD}ZDM*ABTuI=DcjH;* zQG3&9K*1(rtxO@=l_M)(mLV^-JB)0OLh_zK=8IQG4s}st^519EPc|n~(bdr_oiD!4 zl^#^lTK8qit#pMF3m>44lFr5Tol#%Qy7XAm?DE0}IS8e~)7c(3kHTNqB5=j*Yg@w@ zSv1{Op|v~1YpOb*=N9ee;fP*B^1U5ZwlEoy__&n9Nmz&EKLX6LkjRYnYqRcU6K%00 znuv|1-b#nrf_NOpwJPfijX9;~hcawMQgYCOdxJXl{?&hW4ahYJ`Il1=S$M+)iQpEM zU3U-`QS>_k{+}NZ@1QmG!DHA?dR`kUOzMoc_5IFs@A^8lr&g@XXub~{9Zp9=wJM$X z2AWIvSiOQYR@ouJonX>)q>{2Q2;$F>*87%~^6-m^qPJ$@lq{4_lIx-1ciDJ9|DdJ!NC&xQ{ke+PU5Xl+7$7cNY1p`_V7%`5t zIz`hp6?VOOb&gcOT--bHtWfSfd-03#ruY=DxP5}tIWjTfUH605Tu%AD8fRnaG!z-m zB8f;h->@(i3X8(JOKESDuAHW&$GmIX^KR~1B$M})^Tplo#K`f~tyq_=Q};&?F+q1> zEKvwYwt+IA@7W85^Dh?a8-mHF_AzYL;lc^wP4NQqTCjPT|7Jg~k%;lA()xAI2+hYj z+Q34V=;H5hX7P=7m6BDOGQ(J~EgC3Cq3^mQW|PL?~VVyYNp z_(TUsULSn#7|g|W6lbz`k`&)uf3Q8A2i=OgcFcS&@f96g3+^X1BxbTqmOK>*gWKx@qUB;o5D*UFqVc5)0L0g~n?Xq_w@cg^n8lJfk!@Otm zUBr&Us>;AVx+~xumWKzFk;{7*~#npWFV)P>bm5l0=@%Zr8Tw-ahB$zA!ln z1=?~zS)2R88F}V21unSwuz%q1Ezn74Z(8XM2h2<$%V(Ffup^o%=urmU6^nx|wu(4FfKLkBl^0R_{rMWfxm_?A>BC<(c-sX%m{QpteJf zh-!3XX}trThF;_eV6>#s3@Eo1im=|x*<|A6p;~>)o}7+-K24~ff724>mx%Nm@bumBRQ_+=W>hj$c8NkpLPloD9-)k5h3vgo zR)iF?Ga{QfWXp)Ml8`-)y|c-l&vk!)&+~j=efuZQxzD*j_vdq6@9RC}R8?=pzJJfn zDkSvv=DmB}asYG*33h15B*3h7UntrVTI1=hQIwMz!E@+jP zmluMcGRin<0SCS7u8@ykX=~5Q&i>Zz5n+82vtZ5p%>0Y)oaUVVS=WNJG9 z0SG$x|1YHoAqqj_7-w-_-UrL11=+?S)XIE-#3#myt=2%j2j>bAM_$p3zZrKi_VRE! zTZIOqlRbYn@i!U2pxB<7V%(lta}U>{6L|r<&LqDn>Nx)^C5V!}RO9rlN2s`N8}sB* zK(Q-4!B=8fglX=mWSI_g%e(E|%(0|Ft(f@#3vlM>DCPGHH`Vz*JQ)acSOqBQxHBHb ztJJ;Dz$bbCR5;gX`8iMzY?bbkM1LDPxM~I6COpkyx%d8kx+l4V z#}F9;F84jfh7HQ8;OKq&3C=`fI0lO&i1Bb-A($x1JZa%_qatc$TjD0^K8-)-tsdLC zWYO+Q`^lzM>4aylkkLr#Um5NLvd#NnhD!@a(=ZbtmU-}m_E?ALrFGJR#`^a5OLx!1 zgZ_IBV**K0juL$bTeIwug0F(xV@#l@H2dC19KD#6RGjxDT+0`%ly@vASd+qjOZ!{v`C^^IMx_S#wM5xxPT z-*135%A%vA!?P;A`XpBUg_&6?Z1PAfmI?TZHyHvm+4>xkK0cZzEzCBe<4p&eg}c_7 zFGi&Og!r>*T$1;P(;+J$kBl_Is9K;Cv;!nwco$A??Bn)BQr)zUto4dD@GUl?LB{;` zP*ucns)j;!2Vo10&WG*WE%Pe%op3tPI_Q}OxMu2dfdfV}-ue=>0qnkzLv=Nk? zRW)Ojg~so9wP0u!3YaC#^Mq*_7oo^RD_@$L7ouuk}yc_7AbUyttPCeq8y`hR@ zJr%u~7XsFE9l5LO{aifgy1cKxUgArICL zt%%+yB`gegx6yB3TG(r9pY)3i+spXtQPHYzpmLsUZ#L|?*s03KE-e2&U6k`{kD8^W zB|Np}?<`z~#;zMw3$2X1`?*DFl-Po)y@GZ9bq6MgB2%5oR^dBjey}Z8zZ%#g&g^!C z26!oBRO;{Fzk*UuM1JVOenyVOm)EIR#4;@=M5%h>ZNE)Wf4(CsTCX_xF*;iE)i~j3 z#J=5;+-!n1~`QE#(iHRy@Vjk*5>M8x+2>@2*iarMR*3Vdflf8UCEklyvmmXoWK1l|Qi|(qR>{F0 zCT+V=$N45Hme)8MuVJzn&CgRHdwtk4_ham!*Y&A8Q#U|8aQ@a^DPvLa`S~gJjkEaQ z+awObR!^drmiT`W&svR3O!S%`C^u}jdI>fpbuXF>y)uJwdt`wt?l0mtZw+rE^Slf0 ziY?tV|gEQjZ9Os&{nLUzfACm0hzI;hdr``WGe= zbMngvnKnJR>}Z7d4z9@F_^95nQUuk@Z0%MQp}g~A^f4q{?0}2J@18#nxSL;1br}2j z#IcH^(g}UEV7L=(bl~r2jkb5H9k=&^L@E7;OT&DfSt%(gIs21-;uFd2zUi=sIi5E~ z^13TCJyTZ8h@M@#W|wcYrOAKw1%dFc>ijCNiYX*C=wGvjcm@*D6Yd+n!fCtV z{AeSg;PFRnKb4%gS^K66HO?YIBU08eYG-RZ4^eni^ZN~1bzM34Sq*c>B_AcVeG+V% zs&2}00#?oJQDWJqzR&JJ9UM3zsQ6vYI)PlKK0Y5fjc$OEg+8@O>(4?J$&;t)PePFp zOUQ)z%ZA>~hbrg#K*DgZ8=7P8-=Q9jTLlGqmkl`jOnsIjQ7#_w^ShHW4{~DcJCqKN`OJu zW+^vu%PA=_GcjfAu2W$um4R-G{O~QFxjbRkY&ki(o1C2Cv9YmS_J-EVFxZ2-HK@s` zJYM>lmWIMKY)Hz=w>df2u2UYby}1}M{Pc_cIRpe@P9cL)zpjZaV+hHEEbmjf%!Mjn zdeKpOMzP`H8@`5eY}?om3Fv+)HmUUnDkpY>>dn}?#Z=*vqp84upGicX;Jv{?` zVQ<5U`XZ>3xGlfGa)0Xl?^Ge*o-VjY5PVP8zOqY`K%K=sr8D&~x9?C!Yk!PXIKH`A znw)}SmOl7^QjhDpr>A&B?vIG&mEwjRWKaCSovui(P-$Cc(UZYd@UfS=iTh_~=XjU5 zg3ImftBHw;`teUGe15gSJ>DoHpm%vvH%pqKrJ$m+5XN4#nF7^^Kw{1zl#v~?^nLdz z6QX~VNVkc=A^6&S;Ir;!2Ct={y4<2R?l12T2QH{({?UIjFjCeZJYAV>8PIr_m3-vdU7rjbq9 zjfY6#Ik<=^7(^{j1(HPU-?_x-1_kbVTuhAfcc|Z1mLeE@C3h&n)_(DWNd)x)FvBL6 zp>MuNO1SeYL(}miZ~MkRrqOF^4}@})Q6lDDn{z_W#2hc@qL_YodQJqtp@?|}(a*11 zTJYY!y?Bk%h~>8HXndHoL$Ur_^G=$v0UpJyFm{BE@q^sJL%VOcVALPzQg9T{q|3=^iE!a>^QRY`WE%9NqT%o%N^8 zynC?m$8fiPj^$pr*W$;I0gSYMkF89lK00g>>@gF}p5L!uzh>y8fidfD=zDk@6#vWH(+r@7Ln7?;{7!cfT?TT` z$JN^&5%#!Sp#6A_n?uKIN~h4IJ~~cLJdm{IG6UK2n=Hjc$7=SgEj=dWbjf8L)|6j9 z&pL~xbvtNknpvT%LNN}4pHJg&|2uwT$Q(cBf#;#Xw)+CIYnWStNPSdTuOgHVDmh1|-q^omtCXK))fYKQt`i&!?4z7=>E?Jz#7TAXQl zn~Rm!Dx8{D&~``gAq8!(I^~97b3_YY=X9e~qhG~fq;~vm4OUoI%zzq$4yhO2B&)8j zUJdE8o6^!}t)~w!J4YVME{ykd}i;K~CAxmX1#SG82JHxB|{SxBi zf042PM^`09g=J)9WQ$meut(U`{Kbpaib>z&^w{NB3qhpx;L^n7xjjepyuqVw+ZjeQ zJMz$WX4(l!LS33#@^dJOn>N$SX8W^zLKd;S`Z# zzGc_}nd#dmq`HW$zDdi@JHZ(VTxHnOqb zftF;HPJ_gyCgF{`Cd6N)x@F4c;a3P(`wD!B5B#&-|V7h^UY6t$(h6q<=C;$1+*_6|^fW9dT{;pH$LY24csn zyg*R{ty`ou9b7k3kix?h0!L7>9!Sz5(7M@spODem1_MSJ!xAF3I`beqQl-0ZEUmXM z1w&QPf*Ao62O-hirLbWyKuoQ`Xr<^4ZM;G}O%e-h^=rAm&E*W`nzxf#;!Sz!7q z6Bir%9)JuH@4IWTnZ5-7Ck+;*51XwJi{{l_(H9v73zGs0PFerr@3@e$eSCcEz@{Y>gi=wBMZjF}23=w0B!uRX=PD&45u26AzfFJ& zc$=5E54=qhvC5mh)6T8}v??sp$9Fk^z#q#&>L%&Zef-B2gVQ-VIjTtWmyTejD!DJ2 zUz1{nfVq`lTns*?Tgbxen4f8;P-SLe2|=Qwb?v@B4lW=hGe=p&hN}JL`FC~nZnQ^B zdMr&v{oA*L{r#KMAvd;RK2X7-Te+%;-nCZ9SB+D@eCpe9^$K|d%4YcFXt+C}F*C=~ zEH*w~g@cpxbPX|_>PK>jHz7jT1p0r>S`wqUcv?_U&?5!5NCaBMh9?t}Qx>ey#jx*) z-Yu}xiMLH!*o9!Z-$C2k+i%3uB2!Z661SBIOUCPfRfGsXVQqVal)kR36CsAS5U3wa zlW!%P)gVy%@^!8`h-^gx*6EUMs`Fqg)C95}e{sKy0;~jM>Judw6e)i80lt<}Q`kq+ zq%(WG{Ufszf`=J6IzESAL7)HR>#UuGiCRnpfI%92fE+){O>w#e&(X#nRdh@YY@@6Y zSJ#bYHCwOhdr96Qls?`vX{1rAge!0eKyI3i4-ZXr1~2vTk@x~nB@zkzYr{U|X^J8> z7M90zBM<}OEXfT0Thffh&(9P%`%w*MI)f)3_@J`<2rzb2rELADC#=mHs-i9M|1N9= zeUtwCoE^)Q?q6CW+DZ%Kax4uD4GqtCKqlxo0FaX^GFBX?xTCbR=L!Ut$q$eZN%-8e zZof&D@gi}F)Lk| zpL3jg1+|NME^53mFu9D$tc(WHx+^Kl+*68A;d{KcQ z(pwWa0TQl)biT}V>-1k=fo1zc{{}0xy?`<=+r$>s9`~}JS{WM~Hxw2Y+UbVaVnj9@ zaqHj&JHPx|vQ0PscKel{Oy~r4C?%^kq22iHT>gwul;M!ea z;3hJWt}`K*bg3<0S8{+EjIaedZR_~7b8F%WqwifzrD5uQ6Pahq%KN`3#u&f%u*<>W zZv{Ave5I`+0kbvw9{jNKRs~CTFGMBcTA)R_4NHQHCViW(y?@@qWNg;bDo`H@>xp1ihfry8&zoJ$eVD*3;0Tgng zA1#yqHrh4f`!*Q138xl4*U{X_i@qClP=UNKq(lEf6^H)!%7Ah?fo6BSw~|PW%vd;7 znbL!vTY}Bi7dGHjF&%iW0((%${tvVJdx2E1UuR%n3g3T@Fq(9RMNwX1`CF80$>rvO ztqD0sUoK3gmZqkrnf%{4x0$;|oRwUUr8IZ-&2O~}y|asq9=(*$xAtBo(NQTEIx=KRIs!r8l^0=WFR#w~5YKOGGHPAe`X&C<8+ zz0ety&9O|y60xF^q4E$#KyGHq}udLBaH_+gL}F+Ch*s z)SUwvZ!L-S21@N{=U6@r_~##3K9~y!w&{P%OnL)em{{Lk8X1BiKlB6|0jw@;-{RPZ z(7JQH`ET#gP0SIRSlKlo-4OI5PwQUXK72{N6(RMXbV?RJzHBcl?aB$Z;K0WIy$E*^ z*llzH^Y<6Oo4tyNEru&aA6cK~SSC>*#{r@V2!{I~X_B-+-I&~Ybfi?4G$QtW8SBLo&MeA)6=4(0k!NCr?F*m=aN*DcW`yI%Ds zCXrfD<3!HTuSERjQ^rrZkOG(g6AD%jOPGko#j0xryl&h^E(J+)S5#0qv!!Zvn%c@% zOfZ0kAUWRjuSeUR|K31`oX+-$Et}y29evtUh48h_KO{=;+&>B5EgrJQ%57e@J5h2>4?*?MPRR*rB{gryInDUTK7QI6eROh0|1n^U7T{ zPLEi|M!cX=S%7g!k77v5Na_~%kCSKU z6;;i31|_rmjT&Ehv_W41U!hEJ-pQ1Bqp9u)OF_WKEd5kO>&h-oNz6uBfVgh_1NMpg zEpNLQS8^-Fh^a{C6t~p~dmi7xqJ?3?&53}W3#h8NN$9F(;N_%AG-wOv|EU{_8B$2@ zyo{a-y-#HF%@%|GT%F~uI1Y4OjFJIq=ojLWIu)X(x>t5QN z`TJHN_vVQvIo$>--n31)k-i0{ekHcY?v0cR`F*E8)!VSg1vgDs?`6fPjQ#~zkH%>S zmq!K2+LHuus4qu(_8hzyHj$G^Hne&a!Nef9^84fK`h1;yo%c99KL2-YmI!@Srqe*7 zE^S`>aws@2Gu7eIR>cJGRMmK;(b7lg>m!VkXc6!~#&cCZ-fh1E&zcd`w*RGcFN&YH z17<%e7W6pun;csUP?sS8dk!nR|Gh^WJoq1@80eBw7nKP1Ha5qG{9okN`dcQ!_zQo1 z5Osr+5YMblILD(8C7hyS?g$aGby8%Ks}f+VA_HAF!17SsYVi^Uf{X9_xHt%^G*otV zeIQHcC|%b?e#=gTfdm>PHq=VWfA<}EFM6QIyt|_Dcge40v89;XaYh<{wIH_UvY<>f zt@sm#uPG|+4=yp*$UtEEpsqcHf+TJcn}*y6s@8h_zQKg=vF#a{M^F%l%mNPKm>&D% zuM3U8i!i0+j$HKA@H_QolTWwyxN%-mZG7;my-0C~6;rv7V>gIOGt$x2L5{^x`T=M| zEi5g+FaB#0j-^+Cc^=p|Tn7Qq9Mm(>%pr*K8CU+532&vX7FJp_Ll=HLV7wE*7yq$^ zG?fTD1gbBqH*tT9_-~yvC5!nyoNWzfg8wGcR~-<50H%RJo4BNq?-BCf2HzoiwR#`!uG zB(RUn&uV)HQ_tBt1X9^-ZAEQN4g=#&eaIr|0eK{xVtbC_qwz6;9@R}`1~!6kSwP!O zN}@p~5FR1Dxm3a5K{nM62$2LVBnUZtStmsf7kyN?&LH7+P?~Iaw~~TZE zgWFC9K5+=7PB^@N5suH0W~&b;`fR(upa-3EiwB^JpuN3a4?yVZ@pX9p#dmZ<(a?Uq zE-0!A1Hu(D{2-Eg*p7U;7~LwZpPwgf1v1*(w2mT}$78arIa_}*w(}0P;RRAa5B@a4}pWN?q zaRU5_6v?1S_*t3VuckV^Nkf~3@4yATo$y-W%u)Fm)-)aJ z&T33M@$#QCfcdxOUEpm<$K~MH%>Q}SpZc5o!;(L*Or~#7XM#$82=siEdrH1>nn{ z(NTztjoR8BZ{{WfpbdI7Dw(0h1xVaJzQ4+;Q52t$zzaD^h_{dxVEXi3k?IQ5E)Ri9 z+W2?%sE-8w0PY_+Q84%sLHDhM7y%(RLg0ZlYQT#LQ@;elh_>19Yi{nI$0+Mp-*3Y6 z8@%O`8Q%5>S$S6(k2s(P>PO|e8-)aBt&zG#SSF=&S+P?QhpfOBP|HQ44&S=%D1gj@irWleTa_k zwf%k#h%_lFbw@+xYKDfYK0fsqe)(GmR0VK}JH|r;nxpMB%Q!`w-LDK?U=FVzW6iV2 zkMXY?xQZIG(8;ZZHjr-3eTqwAbt7mZ=E*e`HO(&mVm!cS*D#-^@3db65MaT%uc*Bp zmCC@BWsuBbdU#O-FQ>#`!lJ>uzXo6a{?VW^dnRnh3~8ZSRn{1Oh0{VG}=o2IlJ&-qr2AFPYQSa?w?Uiem-TWe^5+p@3V-R%zqK@8?`4?)3U0o zawEtFrs{`hRsN+IhB0?QKA|^KsN%Wp4EwI~F9d9690tWEdiq6c-W1UEM z1@o}fqn3>;uO(js{DD}7J%fSkz7=|d2#WZ@-KSO#p=ciEGSccBgjfQAN=!H_Duu31 z0XE%K+NL42Dfi>zVf5INOyxA=hq1KnDD!{QudYEf=fLeXRD8>MymUU5=N(Xx%G7!cQttpV7=U&mdrK*IO_;QhUu@$8_M0{UyhsFG=L)MDjo`C{|w_jy`<#NT`M4Rw`^3w6>UU_Vd5u zjwhTtI8_Z{_veHO%lg)CR%Ld2dH~|jbeXIA`83QmeasXUJMPDu#vPuX*%?+r6RQio z9yMx(AmDMMYk-7=`mv--Movz!oTN%!(~>i&QNX%uDY_CwR2RMHGOWDcdX$3o_Ih+B zh?FfKsP`zWkJzXhsj4JUR>4j0uNochT2o_EwYln=t&SPi)YBm(Gc2JAxvbnLa@ujP z;ba3`o6mfQjY2$C1*h=<&zqs2P&LEw1I#_Y?G~JU*FW)uJ@@nHFxaJ3{lI!*64-ot z#4p$OkE^^dJhO8TbrVaw2gnBA7n*7%q|br97&;0co%m|dpY|7PeT zk^T=}bmv*T=}61{eUCr*-m(YM;7XM#oguJQ+;E^#f_Z3DU;eBKghfl(BsJF8CR8!Ll z;4cjLDGsJUeV*wrz7sTe0UBO_%C4e!J8h*h1|GvQiZ}Y7`3#(Xf!guUfSl8Pe0IEH zh~Rx^jv$L#b%JO9A$UtZ!Q`iEb5qR$-4?RQ81nV%Jhr47*Wyi|wRlgu0Eh`G;=9=gR|l*+6I| z6|GO*KWVeM7ENvx|5s%H@0EQY0?#xt$8#A5eaACkc507ob!{mgGjE{vIa#jE>|q6{ z;sJE(79BvCIFGf(2x!Mw+?~Ljm}LF5xM7l%18puY)x{KOOTGI)u>HR)7KiclBf!Oq z(dh9N@$@3W?Njprw(IhAgfkG`%jCHgU!(~`W&iLnGO#o_}COr9Lxnw$N;k7-g4w%+9v8Ma;Fj?%0Jnd@(^9D0&(Vi{VXC$$tf zaV1L*3jjlf#XW2UOZ7i+)vt_WB`uk=V*u5SKL{QBUT(RTp<&u(kxNhE!H@!=*}AT( zL;%Lx{Lht>`2JRhVg>jh{9`tY%Ff-3|xBcA9s@=;_|^vx^Z9D#R-)B2oXjKAD=9 z6Vv_t%wBZxc9I8x372pcrCwDPK|ZQPZrvPE*tk}z0w516fqj|MrL2Jk<2RVR@FFn}mjS*lhV#0(S@_H_bBILElHozvZxV4lG`7RwKveaM zi|KWB$^zxt_&{r3-*$TUB=6Ky)=kSE_>@2Re|+!X)B7qn z1IJiY_-Wx4SrewzfdVkts%#)>w6L|+ogA&mbD#nTp`dIl+MW-7F57i9E>d!y%DC|c1Dz}1rDuqDCBN1ixS^A6vG6mTuHUG|=V(Gv4RT~#{yk5F} z4V%sX>(<4z?p*&&|6)HCDVP;};p{m2Q(9<0TdyWe4m`Yx(n8(@4jrdW*lGm-wbI&` zC)_iP7)%-*)ckMU_;97L29S}X%IDmI*;On8OKYNnSdxz)duSHlF`8FE5fC$5cF|?z z=SvF{>B#Gqhh`kFH-T}{r3;qeGd6HtKL{+0_H^x|sx8Pyr*Aq=OVWjh$EG9;_ww=%>#b+nQXlqY^VXQirjTB!L4QHFS{S5j8@kJ)E@>b#Po zqsj3FiJBZ(v*{{rfw&r>-Re0TsbRe~yz05wI$1HuaMOpj;J$xPNm`8mCv_|0FCqpQ zTMR$+9~S7^PZeoZDwqj3mUyI$`*Hc+CV)6SkTU{DimI8JS)JRnNF!-o2LY{5E3;a1h_EQsE9#b)l(K*BZyYlS?Nb+av6}=e4bHCEbR!4=h$2k~dqo~(9 z5M6fga_B=1!rPP?YRr6GZK0JmJ<)4QIS)*qiEoMyrBSmu=L{ zdGTBS%+Mwz1X>e|ttWlf4-x@LRUn?QF zs46ycmSmxD$y!x791aa|C%Zp4^Hv_L?=GZ~_+RZXK7_`41(arD`*dILeUn>*5q)WD zYc%=b=`=}}-{Eb=^*Rc3eR|xYhSXn75f+NUPc?Z~$DH%icwWO!vsI}5JtKrclKpi- zP118UGHYwApPr|#*Ti=I>(++|r^7y&xzbrA8z(#m? zYI`;udD)@O%Fx3<2z~Mm-BuK?MTJ^HchQbdA9jfykUc->9^Se3i7S4@0Edoj!=xt$ zO3U}LvC?4ut5a^FR@d~G3`E$hXJ^+^roH~~k2-+RSrrs#%>y;5GeT9r%tTG%9HoN4cRqF)jGx%GK`rz@XsUB`LYe z^NpGL%YNK4d~yw*?om&931V?wVwcZCo@kVdKmNA?D{+Q!VA|3^%DI&a%PMTor0G*v z%v>=2ov#bR@A7sw*AzfB3`P@wS8_A2TpuP|{^xE!{w3zmFL@xx{^U3(#W=v@6Fwp~ zcttp|&a^w`Pc;t6!i>jXCY9a+r=6XsLI!WgMfSd=<{Esy?8rC!W*ge&%6rRIV28qk z5&}Q3!Ez(`88S66&k$4#vbX{M^xo^* z&m~uDo>!_XoZ+rY-z3dTE_q)_!D_DGzTvjxNNMFX6Q#I|nFXAtIa{-j*uaAE=D$D^ z?pNP!i};PUjK@|6({GXWil5W@TR8DtRE!7zM#42GwVe$=4WFNke31E>4598Z#Cp%Y8XVPB7_pu7UTd&F z>7n=CSS`5{6mato&9OlB$n23V2j+lcZIj|Jz%umD6l_5~cK35d#Aqcwn7Bl!0F@;< z=TMKMw(f!2bL`Cvn_+`qD)71al{LCv^7C5tv&w|iw17ACt&0&K>ax3G(*-H@!*Zwh z!<$XM?K)dD3K))$F0_?RQs5&2UO;d!%PbUh>(gF6js%(Y_e&eQSW9c?KK+ZPPftix zXD`Jo*S*f;#drU=yk~UFlJ?u3>|e&P#lETTb*w79ooz$B8hqyy;E5My zQeA(0po`IafR-a^`{r~IogO-ld7#sJCA;U#2SlSg((Koh#6xKQB`G#ZXE*{6#K`3S zL9N;E4z{0O+c>c=pEe7rRvzpCSweKfoTX+YBt6^Qi*TTTw@1w0o?ij`RTFTN$?L#e zku87SKU`YTq+&GwMZ+QZGxgbkP9cpuekZl9D}~?Eccw~$j#35!hDdk1jF0St&P{(% z$1lYu6HqHm0lEIZ$@Ol;4uW6CN(=LbR+KdrI-e=fU)HON+q1`~iB%^!Iz7AF$2Z>i zpmA3rpG0^knBjs*W^7I8#{T*CSG8k*aC*0z@}7!ChRa@lub4E6_@3%1O*nV=h*(|i zDKA%!&-FRx^n`SPPJ2JawN&ruqqV9$xsXJ=hbgPpxfI#EcXs(6&RW>DTG-w;YPqyJ zT*&I`z4|Dx`UChHa(rFm=Mg&$@^v47yyA~tShHHXRBVEZ-5y_c&pv`)&bZAq}}7fR-59roDV(JCUAJSXWrg( z0`j>%kKP=RiPC{02fg-%(bmH)_?J?rc?F0GYXr}27*aS9Y!5jFS(SWj2MaBW`A_#d zFyDSt7fI2o+$wrnKApif8)7^!p5nnSQ6a7gZh{XsVxFCe!M(lmHAYAHgfF9OZus~= z8TpuLcVO`6fQDRfMkpUG)%=iac^g#jjOmWlh^3A2$f`6hK+kdcMg8861h+-7Kx$SAsoZf5rf&|d zBzMhzE=*oR{|4-Et{S%uh4PcR-Z2r50Xh29>ot!UJnKHJeO0S!w`}*>Mdb8|~36FwxHQJ{lRXd({<1ck@ z%Sq!3Jp~bJMYD+;R{ExyDASHvJ@Y6GD^?=vIp~N(22q%L+h3pTDi6p0U{A4S_gkY@ z9?-KZ?n_tN{sW=M7A$EeAnV2?CnM{<6ZG`$fO~?3`J%wM3q`zX$;P*1oIm~j%>*}I zHp;Vn3{nrX|8^LROor)zI7|oLpm;dgT=hHZ>ka3=u=YtelvfA%iNqp6R7G^UcMox$ z1k=pQv>i?21JS@!E$)+K=V9&xDyx6{6114qu+cA4%=}!L#s`0gyQD$IqY9>uEy0i4 zDmf!BfV0{cuiuXm`=-e{Z$g&2-uI%8F>Wd8s0;D>vaSudY&TqqM+yvbC+lj#*a@8y zYo7y;2+z>V#?a!f7fqi`@;S$9Mbn>xu^{}IdGk&mg3Us8!L+P!9Chshn3f<$3$NN+ zu5x<#!wN5P`Y}MN=%0l?j&^NQk@?GtYo^@fcBjnfk6LnhMtSF_#tQJgGWnZ@k;~uK z5Lwhj1fO~A4<>5SvX;M7<(!WQWqdtv(O#gJg3Ej3QHllLgHk5(?QlI=PJh&%Qr;L# zwHdv81)c%RpNYR~j98+;a|oQ<;=m&FhHjC(uE58NCRL-rV+(L_kedEMpz~lanv>?P z_736tLInqJ?(`*1-sgk6924_ml5Y;TCTv9&!1L?D>tpb(a{?E`45!8oOw3d05WpFQ z$6?SF@rIiBZ?aUTA2VPvw28i|(G%BqYR?I~ZY<*c#MfS1qXR(&azwCZ!xJS6e9T4QCoTf@ zuZi%L;()ZyCt9;;5lWRAlb?$xe_gt*z_ z^!u1GD{rVkt!2{QmS$G#4)rEId^fkeF-k!<>QL(S`|uMHY?|OaMB6*$Tlx4^=9-=3 zooBed1PUcaQ)=%HmUk+Jvr68&_uPrqZp_fX!R*|5JjZoR0>{Pk-4AcU{4p7P5n5`; z6lGe@f9jv{fagxS@!SY3Od{RCXGL*=(3xkJgRRqJ=OZex2kc2#dY@z53{Db{z`rKx zT^LD~oCC8K!6sj^+27{mN7Vh4tB(hltK=UBzw04>v#Z2I{2um!W?zSpCS0%9DTjkc9eL{!G%r`bYvWC_J+?}Gp`74&* z%1;%snC-?~@dtk;<3@J@qjwWKGH<}JamTe!XQB4Z6LqrmtXni?%7}mH!1?&TYh}hwt@rS{z?P(_$(95w-0JWo3|L}W{$Vj@SG|F2=W3B87>uFtbLdH_qh*b2&?@ zj%MDrAM9w*UAay=*Y+E(@^&lP}ABerac4MeIUBQ5C*lv{dpV)#iWZx#w~{C*IWDD_+-D z&zNB>2WB*<@6Sz|re=Q{p5O)IXz{vlXo0!h$I9$g(nG~mFfZnUa)>*Flge!+=Yfkb zk^M#QQb&OV`<{qe&j;X0O(k?%zPFgsbyXVvdU2P4;n9HqWK{jO>xJK`GA5cAVPFS_ zLd!E!d4JtW!AJCuUzaVPX#}Q~gO(qj;5$BREO;6h(&GY31Cv$QM;V34w_eO%veS7o z0S=v79S>zx#C>8Gvk6od%cl_+8LP|tcWj%gkg8{4rw3YWX?6lQCe_ob*ufO)J~&r! zS~kJqWp0g*s+`s>)vA+hj*()$e~G{fM zWiwpM-+L|I?z?g*YCf}M_ya4JXBE@%r^c9+_QH+JzdnKJIf=*p$GG12_q}i14Uae| znYxCpyf0qqV1+YgRL){$D?O8nK6i9|Q>Z@zuiWXmbdrFw!}D27J$Y~fg{o_I(kq`jRV1$bhYQjO$9K98%D4kXHyfCk zmqhRcmHJ*9MAMA}^=@aG!-@6k4{jpRDsFj*taYb3{J01TK5SzRSL)zL;A#x^EU=!P z!TxH-K@fI#&@6%?(c6TabQlJKU}!9nTh<3u>OEJs?BP20%+MYhcSZc^AieTwNm?$e zBYFw5LjtO(YbiZeU~pyA6s}1OE}?Q~Gb|vStxTE%6IkEEym@+yrpMsMDVIO-a^dO~ z)>!&GCBBZwtMv4*qr)uaZ+xF=cegv`s=#U-D2>RgMY{!R5-(rc%d$B05p3FJrGFEC ztSZAE7(B)%O)vjZMe(Z|;?T(HoeC9%V)I9Ng=cJFo@IBGLELmdW_h6}sm`>N8Jt}E zKX(1lzcIQz`PQP$arsZ>v{YDY;YFBNI|hGt3?6mD(B>Z7sN4XXyeX9!1=_Euf+c}{ zVlc4&2urj&dFaWPgEz_snGc!iDQM!!_vUQwo5+H}J9ytwQWRx-nw%2%u*qg!Wa^a^ zWTbrpK7W6}%t&kH!aIx05l=*?n?)qZ6z*o-$AlEPp7LYpu2u(EFsbBLKDUP^oJY%^ z-_<^(JH5bE^j8GwxD84>{1F%-KoJHNomHKC3~58?;L&8TQ5}v=&of`xZPfbs((u-? z#oj98Jh>8UR{-KuI{;6pHb1Ld>2rKngRuid)0b;aJiR(zti>YO99hQEv9ar=s-Yl? zB?vAQ3c&@To#9mXanKLo##^ac*l;m1AzZyp;Az0H7sRiiRmFOutt|)AJP=(V$zuod zD@Y_C?MCN1C0*2o3tcs-PmCF0n2*i>wZkBb%Z~&)yYoW7=d=t~M{8gtSgQ3+(&x;c zu+0kBMP`I7W%^H!qXO7UUEt;00$0(2)6tx=a{7zl&-}#g zL(&hQpB#ROA+VYT-viC8;tF&}`h* z(j#PGFBPS8MmEB32>$-6p1OSq zYMo~u>SDAVcNt5*Ev;T)7Ol2LR>>Q8(h{kmRZa4J?hHIOEKH}s-y6)fkU9naC6I^k z&Mp(c-(Y=s;=y^Hab|H=yYq@g?MRhT*<34aqdV=5{-L1;ppx+uP~krnqKioEv2ekA zub^Af8_q(!HpB+x0W|O)gRD+bQnv$2zrkvYX~IaU&itg zA=ryxjLncN>|Vqybi@tJCiO7al|i+qPn#jy4R$|1@bX~sJM1uA8Y;d4f@zXd?LJRn{;2DL3FE*1<4INN>i8_db8r^=pV#Z->xG_1eHG zal}5?ievfo3ve7o77chJ7+-G@hDnD=`E(9g3%9eLhwfCQfrSCkPmDd=#rfH`sU36s zQnsY*n;;jV@Wx9KsL`xz{|WCfgI&T9e_z;i26(Q46(zX%5%96I=qa1HVOE8&jEMCP zs)F%8WB3S#j?kGE;t>m*HXt{Efqebza2vbv=)2!daCd|^oF)?Z6a6rDeqk31#e6yk zs`MZ_aJ!al9aXhZrfzonccdIlH4=dbw)CUo$zXSDEpz_5aA1SfHCIh&%0UlJJ4&vo z&|gL>7Vf_(*F&rjWDmX!Bx;Qx@#xEL}jg%YytqAHVDj)WZkho^%Da3m;x)kn_VElf$>%+-PO)H~$!2p$Nl zw@9lD4iW@ZJ$I7&+T^+gdoqEklik>h=7gaP1GoL`EX1K$KQ~%6&)g6=Lp*5)Q7o-y z(w6(MMn_6!P6N=*C7#I{kt>6`HaV6>NxO%OEj=&T_^U)IC%xD`yT$#WFH7EW1(iTk zta>DFcSzGTfw3Xgtq2ft|7vfy^a5H))ruE8JG&5A-+;9wl#q0}eew`?1ysm;KnZF6 z>oVi?l?oCH5T?NT@YA0VLWh`JngM|cG9*M@IBpJrTLI*;w!^Slj*q5g%}oOW=;jj) zRU94fLy8Fmtwce-MT(5j$*=i}phpO6q@M1?ebM6`otIYlDi zdgS@b*&w$`KzhGj|BT!(xjF*gYG13$wT<50Vb(n`kIuoPPM|;)8toRgJ*Jam$bKEL zt%t|-}Tuq#HzGKpF`JK`AArLsCM(Aw;Q>?ovQfBqh(9 zy}$4Kb^e|oXRht#zJz(>iS?|w?|XsL&14ErZhk(Xx9TuhPSB(hbr9m_j;iXDjLC_Y zO$7x|z{>(JfStWMc1=%DZ~4>lX3octA5TB_af6_3IN$$DmeP+t4FO44Us> zy1RdQ`P;2cot(b>g284e8v!uaHv;882pwE~Er3+2SUwt{!c6WbG~*s63Nb##T%2E5 z!S+qiuEnS6dd&jOGC18;E?(OrOm zd4k|2u&*1v{2PadhnxP|_VH60Q^lgK^n97HD@@Mbm2F8*Y>`iApe2PWE%?o!;>on%Li0kd^%Us_1+XvucecoG( z3v}tug>`n`>tzk1-sHb=PPLu4)jMaZzbF`FRh13=oQSd4Kg1copiO6g?fiY&@Xq94 ztW!g*L#hjqWpy<){=!JbpB+PK?RDTvR>Z=#U*PxS3|&rO8gTL|FrphiiilPzR6*#4>n>+<3<&2-JjS&|&x4T2>IbmqXPc@Pr|PU zX7|CdBmA)aAKspL z#qVrP(^ec(ncZ8U*4LQ30TSdMgF0dovS){jsH;zR(bLG|Bz<2%0fMU1fxtr=)u6e$ zR*~d~r4xruvs?IM4;rmehJ6T91m*8c{Z*@$+51=S$r9HaaeEhy9NEtiSn|15jXciM zU)7$od}qe(ZKJ68c?!f$7I*$0Ih0;SoRO|G2I!Fc0RUb47_w_?u_AYnHo@FTBER9< zjeu`ozbZ0XGmxZT)W%*7=0uVq@q?dYp@emajIq;c0;YxM{Jwn{@fzzJw3&23Z1LnV zP1I+=#vKp0k_LpHx}yw}I7h8qCMcu#_h!ljM3fDGp9G4F)U6i;o8D_~J=C<7`UvOz}DrR48UjRG5?F4jN};dBu3#<1Hi6Dp0I$q z@*2Dt0SM3FHJ||UWH+{;BkiXpc$xENhg75S+Ea)?Oz|&1F)YZlg((0Yd(<`;LPCr z;GKarOu@O|e*7-FG!a*g+Mrek@Q1m^R8d;V34op294@|Lde89=`vcOHwW)>(ey8BJuy&@lxR`IF>odp~0Cx?0PPB9n1u;B}VMN&2ODh_Pdwpr1 z#(k$C&T&*VmSiBU2w434Xe)o+e)7{6cDU8M1gN@lH?GM>XmT?U4v2Em$}~4~F?I;v zN#P`Dc;=95(t01CjOpY(w2$F(`17M%JY(9IHYbS{C@Mq(O#_txn|w6|pw#ldRFO3~ zV5oZA2p}!kiR@uNk7-A7VkcIQ97En>9BmK4R;kt$IF)dxKDr+ut^$@^n3yfQCX=X% zR2p~6(d2HsaPOE#!fL#9)6U%dM}RuF?ou9R1*&PC}B4 zi=7*ERH&OFA+$14VO92F<6z+NC;dlJ&XZcmM|pSN4+<8#8LOnFrf-Ia2WCb`TR~Gu z5oMl-kLm)>lV7kAt@)037=m_}a6Chl&qqtC6E(`UZuj7kBhfkcL1Dd^D{NO3+d=qt z!Q!^A!O|gyw^X0T!^O)m#o>H~l5)<0dn+Wly?@??`@N;HLP|Bj{8T)uFXZLe4~uAA z-d+Us6nxu9LCe{eu#6wJZv>%*2H9?p?-f0ht5cxdLe7oQApi_xTRa%3~f;2uUmhJVt zrB}(xij!yeDc9WHEhBL8BuKsYCmU>!6> z0d_EEnQGgtUj#x8%}DpkH+rHo8+^D=T7h7&_X-g9w%ZFG2)U27su3HzJb6oCfjTO4 zJ6xr%i6`klq;~`bptL0YpYo$8%Nz|l{imvH^LMzEzn}d50pbQ|Aa0d=2@CfiW-iEn z;C1X4u)leUo@eCDVo=x|G$m6&_30_#$H;U@sHo$MC3gpgR-chwOMe@`nJvY6Z}H&x z9xO8z)3qRPb&oq8HbF$_%dzxgaqDm1f~qxVt<7er!kgAEr=n+>< zwO1wuv20mQ;3p9pGdbVQDSq>mhbHr5ejnceWL5H@$j~MRmRUa_z5M((h6?{0MlfWX zhLb`IO!JD`K8TS8%4V4 zVyd$_L3TJzBL;zpUP^Tu)Nse&GpKE_1=*O)qpNdCSyoq5L!Mb1XsWr_l(5;Hrf6^X z%;zRE8!k&CrMcXm(pJ7pKEEm_M!8DeFYsuTexMmWlCZmfWMo#B zxpxlR%_Q9F!~u@6luRgf(ZXwN+_(YQYY!BOSOJhIJPz=g{N}146g-EbU?ZsaRGMSG z(&woexsP}cfStQtX`mHyjXN(Lyv-Tm-jA)Wz?r40*cK^l)ioDq&pB0+0jj1oN@fHH z_`!=vRB$uzH&coj*ICl7(%8KVZ*E$B4qdkEO|8+e=DrkV|9;THm8TGR-8q#TQ$n>F z^yLov))$%IX!_tYW8_)w9awfyWZh4l|>?i#fUu;a*d`sou`TV2L>Ns}{^w;#o zl9DFA0|2!vjZC^;ofUNW9tqt;=j`dk$|fIsfp|=!AraAy10e|j={N3{ZBwW*v>~x@{I;48jGK>~Q;Pzf3O*ik5Tk&> zmvS5b`9eX?CNl`@eVfRHvLxB`kr;+Wn9LWDG~qq@bGNAfwkF8*bq|<_|7o1nv4NEO zHff=`lla#&*q5U)HNlB`(%Z_QVza)Za(>>4J#lTWC?*>^R8RQ15|?zyS6b2_$0hBlRB zB)~1QcHXj0U2=P;;n-Z8D9D6MYM^;KEZiGlGwJW+w9;*}Eo-qbnuyyKf2&pplr$;f zE!g+cTxDTKH^Qx+m^?CZ|BIa_;+PyqV)GG{C}fhhx4YEd8;{&CB9(YB7A|+95EeLp zGAox43L?h(`W_ipG%4J9nIbwnNtx-TRMr8Yw6XvKck}Qk%9m?_8ctbERt@t9L%Srr z%&GeTlx9IH?1T^%LADHS>!N*WSV_UWT9)pKK$Am>%^?Fl9bRtkUmuixd;uJf=~-t9 zfh5f_2pdTQg7j@Ogj_Z7y!TB_ixwI0tAX$!sAuB@;aJ3x$Y32__i2mQe^fhi)L*HX zsn(usgkzVRm)EUBM31W1McSvIZ@t z7#cP6?<7br$bk4n{6XM9)CcnB_6qs-?{qOsrs7e&;x~tEx_Jklp?BC8@=qr_%9E z6>73OGD7P178w$1+8VgjB2kXRDY8d4I)m7dRA|wse0T-vgg9*|+nV_BP>Tiu5!BP> z=H~kv&pTK2w22#-TEE9%lhWDUkuWqAyS79{p|o3t)A}pw(^GchIaUNqRX-==ROHN5 zLD8dW{C;Tz2JY)O8{fW-xfI2`*g^f`e6(d>Vs&jRtZX)mOB1Cgv=OHY!c*0B;q$LZ zyS&4PAHU?Fk-k4zZAGhFTaHIWWz0wQtpm}QtbYb^;<>fZDft~koxZ+4(oeuDv`tY| zR#x6Eyjx}#MScItwy@4%rc{#89YdLGu(pptFHOLt(mJfBqQXs^*CaqNBO}AO$~N{1 zWE{lspS3xP=ma>>q%!VYV)HstjNCeU@@cuZ%&y76aBmw!9J0F#?R8NzK6ZAT&@kB| z&%v~C{8T#O1ykF0YY))XJ~(tlC-oWVg)ww|yM=`#q}h0#=eA$JjJuIahnA-B<7RTj z9fyg6mcmaMxve=y5J@DVh0c%)EIRsaXPo>i!D;-1%3HahGn~7{BCMf@#a)XMS6lG|TV~gl z4K=+^mHUbN7A5?sI3EfL~UWw;|8rk-BkbW z4l$ohkFO`mp8Yk-G11I?RGt9>9K6lVU!MHp_)%^#{m9X^1+TR^HGl8Ty|FB`Fi8|` zu-cu65A$$;R}>Ywv$UfS{JcCoJ4Sczynaf68CZKSZXM}O;0Cq96F(`~$N&W)pC9UY z43NR{B|^#(8zjC_Bp^fjBAyprR42oS69I3o&URGcGRlgU3=AyZi)F0>4G~%1Hv1( z4Gl>UWP~htVa9tIx)m^^d3F2mlgaScUVn&S>G>hl;w-xvQ}d@i{NhL{NK#ObQE8x_ zg5#Dpy7p9X=Z&4NM$q0c(J`njtn3T*Ym@e+;ZJWcp-*|xTnsfeU!I)(_3NCdF|5tc zZy{n~s^R)t)|)1#S1;@>?vT0)pQV<2m`|=En~mYIKJU^a=NV{J=*2>WP172Q5S- zoERCyImqpej*ioKgXMEBk&bd+`{Qq*`B81>n9cUU6WbpP$)DFW4R_jrJBc(h|L0D# zsw%D98X$*-Kak)j-Duf{9m7H8Y1-KE5>fxMsOS&Yx)@I(c{Z)Q05XvKp*RhpN}cPh zi;wR$cAddom}e7BT6lxDwY{^U<(=jSKIWKpqO2?&7~6ofxqlCMFj%;k;(ZV`wxh~# zA&;qHXgG>hudVr))6g(1-$5YNe3Xlw1hoR&u#i9H+qx-co=Lfw;@Kz(Rj@*P%EBV; zxgum^IMG=4sn^2DT@m#(t))dpnfXOUf{kTpWr8fV9Q5jh>5>oTwhdv5EKsuBzox2t znIcw_SlnJ2-jd^W-G%ybxfc9nt zmBvG;C-4^+6^(RSS2Dt5D+?#x4vHa+B?AGU#G)cnpYd}`a2hYcX;QCPHk z>e{?__pC2N>f9IF$TBcGAd zL&Y54hHNg7JFmHXk=KN1{S}>UwzTa><3aw< zra)77BA;n*gBHuX@^V*SYxXXqFmj^+X{NMs?|-)qdaNCOqsntx7jo1W5X*=|0hV^n z_%0iyRJ$S1~f} zf45$4Lq1a_(HWe;N+)`Ehrqq6YtcRRzq>V-1g7~8TDX*r!Xt@*#bwV=n*V>-M90H5 zB~$agaq7wClgSq_!nUIS+h^18&IP#+rqsx*2z5BS(QAA8um5*l3%Kr(W+;Okw&g4R zvnV!+{|ux&=3B}2=0Eij`kMZ5!Jp|2{|;jH)e8*5s}89noS}zU$ahH|HAO{D=3)PS zZy)Bn6Bi7%KDR@;d2{EWO(E;3ITlP4VTO;3L(f znfkT=`_pU`W?cPK^Jx*Acy4dW7v3_(+tqe0-e~0gcQPfPm)KIv3p1PqwrFdM7lD0G z)DPsW{7(2E3yXlUHA4$;uoxOHDn_cwF!f7-lN>WH@{|hL@6@7ceCC>OF0^9F|2rMG z6}1V_)G-|sP^~1XieX`uB!}19v`^iSgzhyg?f2mVge|k@W#b}@&x?xgB9_6;H_yz- zFbBxd_b_r|ahL=9JCPmMZJC*w`4C}u85*88=R3&!v%x9hViqzNTFDisHlQQ{EJv}| z<^#7tjE0P*U2Lg0t!@=Gy(@ImL`nElhUakGk+hR&8uSXt=j7y!S3iy#HERKvkOp4Uh2yS~KVhr4 zVx&})#a2phnZtd3%^1}DYY?O0t60wj-Sq;DPOcVrOivk}ysID$!;5fdQF_Re zn<+**RY_^=W}Gu6ArQRL8p;ZHBqRWOZ1L#PYNT+cU+-S(boVo>R)s}V)*pUUtpa&T zzOkPZl)&h|VcWZgS?$7RPNMWvF20u#b>lV9AGBK4O}>B+_Pf?~-AhlI^fl`Se=+<* z=Jc-zG7-btJ`mPPL|9qwMMbtLdm8BmNiYqaq3w3b=-+L5uDRHxfZPD6 zuqbV-ShGd>_$m95c9VrbC^=_;ri>J)kdUYHej5dYa!zQzgZ^N(H-bM|e+JL;FKBZ2 z^2cEI=%?2d^lexO&@)ze{P>7g|LdhHDa~CIb#8M|{t7YBm3Y{`50=P22`%g_gCxS5 zq9Y8`1xe4Gd3plOvOjwA7$>+jQpDoU9l$h+TU|oN+%f$5HBq>zu!xYQ-2u}<=JN{% z?I^uY6R{~$hEvAJ5VzGM2dNc&gA{FvN8(CsYf*nP%|{RrkDAI1L^87 z%@oM3nv+a!?c(FJpJ8O-pVtBXti}Q_m4Ec9It~zQs>r$6y}V;cz|yDJ^UXc3sEF#{ z-J0EBQU=0ua&)nAW2E`oZ$dzZ>g$^qFWei+7aqiSp&U8syde~sc~odU5*%4TcWl63hgI+g2Kfn46n>%gD$Ok#(KH1Uv^8$Mg|o zo-*n|p~eO@QpCXdPqCs|gB(>uuPl@B86T)$YmDx7AOekzjq6V)XU}TaAbX*rs@iEa z9>ji0K}$<3t;714;IT0SENWH+Bb|S~po});RR#a4HpPHX$PK~jT8(UC{3@a*{ zTw7fgbe(BJeb9S97zHvRS72$nW2AsNWuaQyh0!rFFDg32Z*9S9VhvppCRVy0js3RY zZr>{V2DE)w)VxUC6EIJu$a}#ppM2p5^uJnyc&;Z9S~;@F$S^80eER6Rwzg(P)4BiW zkB7tl4M{K&$`|3$bPb2A5Ykw!0N8W+q5jWw-*(i3h(-Emk^$)&At#_6KvhM^t&`Ty zcye;mQ`C9FYXtJEeUBm6HZV9?#Yq)o*lt~^X=uoE`SQ&X90Ke}Ep9+~vgCzoN2=z4 z7T$~LX$FFuOeUpwq367zI0GqHH0vdVJXf^!6-DFRBn?C~mi7z%z8cd~A~1E>Dc?kF z_SeV1!hWsv+qMP`^0bk7aF-Bc*8AHh!eHWM6$Yzq4Gmi^&fQ=Mg%FNjSSRMqe}+`8 zxTM5sV`HONOGif}54pbX^kl>FK5F#Sz6e6zz`&pzd^ath^|9?e5NEHhtIMgX8U(Cr zM!1zQOp~hls8YC9yO(+VS_2cPXht_qZ`PlzI0n%9@>0bNTUU-75(2{o;$o*r#2kSxTAlzsoM59Bo*fJBC5KaX<|n)O>GVQh7@9o=@IaU{xq?ziuasF`;gi&m5NwcTpVPX3^qn)P zRGIa~`pnGC`lnBy{?5D60A#KOe6U zrjfq{vI1akLAM(ye6P(3(aW_CgV*3mNPhnOX;tO;S2)L}i3rUF&J{h92%$}_IQ3)O z@8y3S8rf@kPi#O|DN8-{nRArt*PyeVtH2gdANPJj1@lO%2%~|R#lOWKTK|RxA9e(~ z;KReoTIX0mb3lwM%wJPm3y@-PhSqw@epXqwD(rHDSBd9#5oyNKeib~Gl}{RRFn0DK z(9z1g(ijRMSA)_$y)MNfmoo!Mr>Cd;HMtL7n}4$dd%hwxAY97W+JOK^!58ds#JI>m zUJ7FF3;=`PUA2v8u1`(%cw|zT7N7{qCIM4!AJ=8siERUaN(J)udkUtB_05S#1|sj1VQfD>VAXZrKoq= z+1Mf?A}gDlqK%DUX>ym?Iqnt$g$hY=ZpySbCNi~Eq~0+VUgg`mI3 zG4?up%&BI$g=0PZj%NA`r*61nmYVCbC##%ttwDUC)-x~dGV?+z zF)G#8$G3~as(p^YMZv|AgkNS^I6a`xH(~?(FZ7h?f`!H>8>y=x{*ca#zJESa&}$4O zqW;T|Vb(n~9XtA;E zWb9h`=@kH>_m-_D{5=gUD0;jMP|bjOiRJV~x+vy!`|OLj*ccSgVnf;NuY=>Ro;o>< z(clCP@cqZlaxe8~tZ6zQLH6q@IOz|4%)JgVn6mn{sMy0>r)=4M*j3-&kWVzuc98_t zV|gz3saUvdveb6&U!?uz5Lg9P25feK`kAO;J;-Ir{GJZFz3Ha19hzfr%{!%x1 z&J{Ab*_n%fcd>}49NA%gqcK-0-@&v7LhnPUH5{LbjG77YA1ObeLJ9r`z*0_8(W)V0 zt+#A>XO4kE`96SCV<67LzQvQ*q-QuRUFDdKaz%xc6!f27N5!JJUdvK9Zm22l{0+}* zh9h7|a!F`P{5fm4O2Ib^u;!w~S^nUF2NIyy>)DQCdm@o%AeduG*shN)m@D+LLLvZ~U_LbySR!@EDk) zmFJ}rYD}`Sp;5iZe(B??UeJ+2L1AGxW*_8&S1<+Yx9I)-{aO0($`07k0&x6Ayn{4o zHrLl!#Yo>vEL|2xjnKv@xTxr)T~s#=Wwnz0pz7OeH)6+|pXYy9R9_*DurmJmXJP48frh*pDa<`cb5K1M;^a}CRx~!&R-yg5uxk+(g{7s<$1sI3 z5+aT4**7`_iJ{BjWymTBApBrsTlX|82+lD}DuY42ji|%+!)e7SDk2SJTz38TIUSeAF$Sn323!R3(ru5#B0hFllAu!v18(VYFKo&w! zdm2zvf{4$D`zI0NtgL7?3EX--#Yj5@0}j$L8DsevFF+8knuGR)zDD!0#1fIRX`op{ z2g;#ZI$V@T$@vbGu)t!hTNQ-0;n-kkWz_!~gz(e9o#c(Ud3iCv-@tI#(I*z;>t7BA zJ*}7yYdg8!0VUUR(;C8Uzp3??k*cMjc69;Ru!EWE>>fq%OTvwrN*L#w2KFwb$<7g6 z*a>@4Iwpuf@IhYol)b>bDl3@t*oLwoo4wUxdY6_{pYhRAJILPTXo@p*LNAICkms)y zWr`O#I6l4CTlVV~#?MwQDoWPiJ||(ei|pkjV)^vwKaUm$#kges%)jwLCyVnK{7Tcq zZ&WJ{EfAicCzo5WuRZ^Dh!F;!hh?$N| zSZ58AE=GhbBiP0-2yQwlNe>gw5hD7r3Pc)RFfMmgHfDMHJeJNpuY==HU;|!c0iz=I z*XYxqS4n{NrS0hGAP<>UKp%denTe}$99@7yTrB7>?UedS2MQpK;2t*`YhOUZ%KkN^ zf=Cf$;Hgt07ZFdcwss>Jj-|aJwR_3XFv!ZM_n$=)JG-@o|2w*C(Z4D`U)8+k(Xa}p z5k>zULlJMldi?g2=Hh~chjz9=Nn;~DAX|)E0%gGCq;zm`2~-)~lhfkHNK7Kf_hQ*$ z2cxtHt7Q=a0nIa`c}Xx$=qf$SV7V166}9^=q&Z~ z+_cVR8l0rUuAWp8o@FR8wuj&m-7+(K{^JMic@D{U_QKJfovOgj#>YHBt<(7T;pyp9 zU1)A$NKi@I>Z3FG*>==l9JVbT3&;r)T6#k3;IQcIsRSByCAK_hMngw}!ywyHOukY0 zg+nS8&MmxmUjcqMFh2eZx`NhGV~(6}jHF$xF&#H~goLUrp}9$RZZ0l3j*31$q5uzu z|E63H=31mObh!xMOXMnX<|&Ias0z}6e2F}S>QB6Ue6q{RTz-R~(nQwUQLQ@r!l?Ht z2lvlwEXw7>k7Au?n#R}581BM4Ry9^p2_t$%SJRdL4Faa#ZZ4TWOn zwnwNxbaF$M_t?qVxnrWnaeKHt@XDJvX6oUvAyqN5Y4`&;md@~^rsksnw#>T447GqvxR5S$@5Ri?g%Y#{?uV}f87;WAZc>CkQ&JBCHWFK+qGc{DaEDNSYeAs0Op)mJCOp67d4giTUtzkRkDavtKMg~vQkFv60v zZ8&y(Z{V%uW%ICa%vYqMWt$kIna0a&W~LSgOuYUi1bk2p5Om(ryY+PFDus{UxNCsE zCAI!Nv72*;*iQ4J4@O!LY6VPIMi(21T0#nh$PkvXUaVEy4>3b7{E^%|?7o69H~wG4 z;&}p*_0hXyG9__666 zDe)a`xN8_XZGd0f@l4$@kg=@nAZv1J<+^d)*^vH^Az3UVqo0A!ziKIm`afRMr#)Kq zve=`eNq!*QbA}F_O!6Zz+3U}G*y%5b$)4NSyB$)#_;@`cE7l#Dix@0&C-ek+_KL@7 z0rC&3E-w6_DQDy3kgw@@My7e)6$VM6UF70;K&GXr)};PGqA%;?Kf0lU))f(S_(5^ke!c+@rEC0Nn8T;H3TV`dUPjzdt#88pJ@QcD zIRX*uqoud4bQ`KctJ?JqGfHjyh6vM~`Vca~`tpv@a9dzI! zuDC~##~7SD$3*Ged^y>VJlXha{@=jxADg8FdA;F$Q{f9_X9z7`q?^-?{V)H<#1kY1GiixApxm>)#t;OS((g5t)@*JuN6JQw75V zJcmC!J1n8{(3}ZWbLY1G_EW`+Yip?>fAU%`Xzp1<*&6s<3PwiMH*ek)^j^JV%$wZb zbPjQ(H5?kxqfhCJTXav)#TQQ!{A}D1-a$EViw#iw`tlMQN9;*`&utopK z+(6(S8RRqi5!47LP)_08%f+Fv!^-Z)LtI<(mwa8FyhqS@jq_9Y75ld*I>y#mu(9(t z7{QAyca z#CK$sFFrW-pEnC5CkM%l-!`|<##zc($7w5188G{!Yp)uOQW-C>4D}xWZQXtW`M0ISbX2Rm854c9`#a&C;-CfUw7PSB`DddO6`a;m;Lj>SzGYLKtAT*{-Y{FeTFOHCPp zG;j2ohZLOZy?gXPT_Puqa7U|914vF+5jve>U=RRnLx6lD;*yXQ=A>5(43vdzd%Qd| z5_*-9$i5|WsiOy0KjgdG$bt@)#++&e%!~wSLZREV#JF zDhZ=0!Y*w^a4^ZoK4xPrdwDvc>1YyvQglr2P1Obi@48uO|0a4!ID{sd#0Dqn;Sf}8u4OcU(~CZKJFHdWQ?9J zLjZ#Oi<2ML8xjFUbw+rRq5fvVr{gjEjyxaj=)tt(z@~|2QsCvruh|J|L*pF}I6DYZ z(tlXZR9PE3SD1Pc{F=?tGEIcm{T|`XwM?a+7h%TweeW}s5bCa`5mTu_%r07CeBXo5 zhG+}Y0>BdDBkCJ#TgMx5$O&P=RqLF(!iMP#+yL9c<-c`J{%c!;V}Ho2w?`IG3=Obp zRZw2p+Uhz#ojtb#&jy-8(}PrAC{$MFp|wOr*CGU3>RMW;&RBYUoVbPtNvG+CE7WFg zSj4DSXyzE2A?3SJJL#eXrW$a@ZoML-mcRir26blYA|6UYD@ZEcKiuky8Tqv=f8+D( z)nnSv+(HAAdrrGc3}U~XgSu&9bOk>yNGiXKL5u!OTj@S8e-?=2YMh7`Jie)%NW>C` zmpIdM#bi(5U0|PlD^_8S^Ph2oyjP#;)=<^GMl3n*d=vTUHAYh1GLs30=M0aU#Ml;i zLmM552M$j>@$uS+tWV^@@jl3JEit;Jll3}W%1r!dV0|uPYX*u$>}47 z|8Trz|H=LJ;W*g1VDJThmwK=AiXYM67!TrW*hwJ{MCsrh8N9dYZ@T~P-Ky-5%_Dlr z=$7z4jr(d-nc9N@ojE% zmo4F^$Zlo#Bf;k)PSz z|E1tG?E7+d=dlzRTsPdc8>J_Y*zpeD$vvDqf7LJ?Ht}IrzOEr*q=6~y-g#(dQ%8Up zE6ER|>G-pxU(a&3uQdnp+@!ldZzch@=W@l4waulz>yUhUjCg z-kmKs>3%^OCI*Hx4U_inkyXzB?#ykU{*<;>Adoz`=ce|I2ODACED8JP==|?7m8XaJ z=)?mK${;`d=-KmAg~`Ov;2T|a;5%19k2KD$Ph$lXTzsY^8H(5T{9{5i;|(<`Y?FuT zn}01^e89JoS5z?FS^HA@mwqZEkR8uQiRN|{*?0ll6)DsAPpK!V%T1@L)kZ6#x;Ib1sImlaettOSe)34T z_el18+WE6zTNW4Y~9Ln=XOf?HSuu8dHkJcfOHoMxf?K_NVwRTh*os zIG4;1oZJGqys5xWg)hk8@4F2rXYhyqwQm%Ul=Wx%#X|xT40gCaIKD+9vFv7btH{O* zD8KANcX8h=pSBuU6}KAZ6~&K>un<|*<73`K&IPw!Lq#THzmrh64WFJVOvXs=SVrx$ z`i|y&DYn3I%)Oj!zcsh-_SFj(6`TcayZ#9F_4$$J3G$n9)yZO6?Mh$9PsKfa6j_oUw%MKZb%V4@W0`? zNGP0ACO%i!6=%tq|ENWNGN}qJy@UNgxG6G;bQbG?Z+Faczw%%!2Nse0aTlt7E&in2 zqHbV-^J4o3t-XN6<)J=ZTIXF3uID4k=y=bZkeBU+!c*TYRb=*TOW-rf zk$IhciXF@=06U*(|CY=(*N;rtN)b^wS&0k_2RGy++e@i%%1@WxP!oSVA|x3o<@Z_^ zP+&Ib=&5TV^Nk2E`&^D_m4BTSAdUTosmE_wKexsO^RN+4YByN90?+Tt8xKhSoP^nM zD5b~pf9FXv%hO87?oHqzUzbPHbQOVl)T~_z+p9&l*K%GMV78P%3*nnRfozsa*4V5u zik{aImPeq0=pplAUpmb4XbPwHRh=ivRK^wiOn(;1XuYs1JAB;dEN^+iiaCU+jFmeTuODsbZsFyJLx{%oTwoJ zIx3^CVk zgQ{RxsB0h{vsE251)m0e^ZG%s(%&zH!uy;slWP1oJXC~leLOhNGjT&1vuBiyDDUdB-Q#ts0gvW0{R#~lbM6LWaXPF zfmQo}VLgL>r2?Ami2w)d5jIrcbS$sNmKfK&u|O+ley6E=3QV(vIj-mS!i2@%bI#E1 z%Nn}*V&W6a8q?eQ`XLJo!LBI)oWTS$O~6PH2gc@$q$J_P1N>A=VLm?RFSABQMmEr@ z19Pr?*g)+z z?#*urhR5u%1+f(4KW85(1+pr`X~R``!UrZ)$qzQnK7 zGzy)s5mq|kYXek$c1IDT7p6x!E+RUFjG6Y{_T zgpVNC`ueQOmHK6)oHEx_Qo1Fx@a`+4tVyEy`dqNXNj%Huq^}?Amv9~a*8MRg9bV6O zCGJdh_o0BIpeL5u^cIWjDBG99Q)=rt;(v1wHs>FyWEJZ2SYDb%E*u2L`|0~wdv$g# z-@1M`SFDB9Xc@vLoXcmM{Kq7@6|75N!V_-fiZzFChUD45K4qhP>WBZ`R16#it5~mh zBc6<2#gpqfqN@)?n~)_9Alda5Tvn{)gh?(l5Rj0uq5R(0TCbKt?-N_~PvG%mMVb zC4)RKAt)@U1_Vg0uCD%GyMIpSbKL6m8`y1~fME#-g*@Wrbk9D^1VG2QL$|6$v6jCi zfk%UH7Xan2BFz*ryVV8o>Tm!A0n~|wDrO!i_3a@3A7Liz(-p^f2r>)n#6XED zbAl%nSoX=|5t|i4yt3uUXPC%?PL=^FroxKWjXEdB}dn(CyVhZsVfS!QB;6F~!2XXS3|J zdVjCM5HjEMF-CTw;!*b$*Gxj6v(cU!p~vlVM>J%G^=O9$?-05 zb9hDX4XNFhF5*&F`x6HB=S_v?zl+`->8S?S9Txrwa3|Psd#Mp7+XJ$G ze{7Oj87ER`%Uyz`gQanLf}(=KFO^7ky^x$13Qg(Av!U;86fC#xWQ(Y$FQ9G;QaCef zsqCSHLaXWs6E4jU{UR0%C)bq1mWpS3?fV6?KU0~(kY;JOzb;l3-@w>6bA61JF>>x_b6r3{o=W99w$&x#7aQ2_u4yJA=|me*;9T1umB7L zz;I9-eFn$`DA^YKEyju^ynP!FE%=_6GiMhR5MYAu&FMz>&lfq@hnKQdVtxZWhywcF zNsGEn5!6k_LK9I|sen1fCg{VwoZ-uqnwCaE8Zqy&5k%B6QhM)2Vj>O#TB)NfCP72u z+5<>=L>3<+4{X#j@W2+49@gR1l|OkY57P-N=0ea8x}(g+o20A>;_O{W>fIfknbjo1 zvpN`J*;hD@=6FbU!QeQ0QV8-uL(4~#1wujPg2iIX#>_V&!MqYOZ}Zj;oi)*6M>kY{Vze#Buy2@h|@N zDMyId@lQgz31Gk0F$amfPa`9S;bGBIWm+l@DP6ZIpkDsoD!I#3R=*I5ClHW zpxU71QaA2&yy1Bt!U{=fyy8_wMh1l*m@5SaHEm3Z0zNiO02TW8L$?Dr_~#cW(677x z!2&}9KC)993LgJ{gqI*~{_ihm-vE5(zrRco>ko7P@5jCe6M+Bw`RCG5dHw0pc4h0Y? z@kFOvloq7q=)*Q&Vb*Mc0$2upt^Ank=u7NIsGCUhI$xotW-E+e{_W!VpInvxLO>dNe@8Vu#nUVa$slce#*~aw4|buw_(`m`Gl2+eS`R^^Got zR~46g`!2)$W~V^;sRXc+BJ!qto)b?U78h?f-gD{NKk6E=>kTXWJ=yc(-4}7QZPFwz zlKS=UTUG#VLVYjmwMAjd<6qXw)jrlzHSc4$Q@$UcW=w&+@lfN7%i~cyEl&xd6RIfh z#`Wls7=Z?Yr_FT>SI)`M58sAHa&)Y3#_8#^cCRSeJ`mHD3KZ>=Iba}Q=_!kjv>*G; z82d%JsOXxVogF^ZyB=0)Who7y(ZP_c%W7_BZ0LKzz}5y(At@<(;AEqGX3sIi%sYmL zSx{w1+YiCDwE(Ar37Db%C?G8&noo^+L6oI7tET1(B!vG1Qvqru#*qdlW<>K-^U+Gj zQGUSCu#ywVdsw`(;tZ94^yoU&LD0{I4LBD%R{Q2u5xiNmCLUeuAnW0GnWEdffty1N6&PlR{40j>0~mwDQ4HzML_-W)7oK zvk#EaZ?X`HBxGceupEA8$ABcWpzu3c=h{_dSbPM;1^!WC=T{gE6G@oSZRH%~=voF} zUK4if6NEp5xeDAPM_mlbs2GV4OiL|WYNh`eg#VBKLam u32; } -/// 所有基本类型 u8, i8, u16, u32 ... 的数组都可以实现 hash 值计算 +/// 所有基本类型 u8, i8, u16, u32 ... 的Vec都可以实现 hash 值计算 /// Sample: /// ``` /// let hash = vec!['a','b','c'].to_hash(); -- Gitee From 953e773409c934d599912480f9a82156cebce859 Mon Sep 17 00:00:00 2001 From: fengyang Date: Sat, 17 Dec 2022 17:10:16 +0800 Subject: [PATCH 2/4] BloomFilter new --- src/traits/filter_policy_trait.rs | 7 ------- src/util/filter_policy.rs | 27 +++++++++++++++++++++++++++ src/util/filter_policy_test.rs | 8 ++++++++ src/util/mod.rs | 1 + 4 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 src/util/filter_policy_test.rs diff --git a/src/traits/filter_policy_trait.rs b/src/traits/filter_policy_trait.rs index 2ec339d..ea17aea 100644 --- a/src/traits/filter_policy_trait.rs +++ b/src/traits/filter_policy_trait.rs @@ -14,13 +14,6 @@ pub trait FilterPolicy { /// 参数keys[0,n-1]包含依据用户提供的comparator排序的key列表--可重复, /// 并把根据这些key创建的filter追加到 dst中。 /// - /// keys[0,n-1] contains a list of keys (potentially with duplicates) - /// that are ordered according to the user supplied comparator. - /// Append a filter that summarizes keys[0,n-1] to *dst. - /// - /// Warning: do not change the initial contents of dst. Instead, - /// append the newly constructed filter to dst. - /// /// # Arguments /// /// * `keys`: diff --git a/src/util/filter_policy.rs b/src/util/filter_policy.rs index b40e0dd..78253d5 100644 --- a/src/util/filter_policy.rs +++ b/src/util/filter_policy.rs @@ -1,3 +1,4 @@ +use std::ops::Mul; use crate::traits::filter_policy_trait::{FilterPolicy}; use crate::util::slice::Slice; @@ -6,6 +7,28 @@ pub struct BloomFilterPolicy { k: usize } +impl BloomFilterPolicy { + pub fn new(bits_per_key: usize) -> Self { + // We intentionally round down to reduce probing cost a little bit + // bits_per_key * 0.69 as usize + // 0.69 =~ ln(2) + let factor: f64 = 0.69; + let mut k_k: usize = factor.mul(bits_per_key as f64).round() as usize; + + if k_k < 1 { + k_k = 1; + } + if k_k > 30{ + k_k = 30; + } + + Self { + bits_per_key, + k : k_k + } + } +} + impl FilterPolicy for BloomFilterPolicy { fn name() -> String { @@ -13,6 +36,10 @@ impl FilterPolicy for BloomFilterPolicy { } fn create_filter(&self, keys: Slice, n: u32, dst: String) -> String { + // 根据指定的参数创建过滤器,并返回结果, 结果为dst的原始内容 + append结果。 + // 参数keys[0,n-1]包含依据用户提供的comparator排序的key列表--可重复, + // 并把根据这些key创建的filter追加到 dst中。 + // todo!() } diff --git a/src/util/filter_policy_test.rs b/src/util/filter_policy_test.rs new file mode 100644 index 0000000..0f19104 --- /dev/null +++ b/src/util/filter_policy_test.rs @@ -0,0 +1,8 @@ +use crate::util::bloom_filter; +use crate::util::filter_policy::BloomFilterPolicy; + +#[test] +fn test_new() { + let bloom_filter = BloomFilterPolicy::new(8); + println!("hash:{}", "a"); +} \ No newline at end of file diff --git a/src/util/mod.rs b/src/util/mod.rs index d2f931c..3d2299f 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -21,6 +21,7 @@ mod crc_test; pub mod bloom_filter; mod bloom_filter_test; pub mod filter_policy; +mod filter_policy_test; /// 定义别名 pub type ResultT = result::Result; -- Gitee From 85a5679ef268092ed20a527d377a868c6f477945 Mon Sep 17 00:00:00 2001 From: fengyang Date: Sat, 17 Dec 2022 17:10:33 +0800 Subject: [PATCH 3/4] BloomFilter new --- src/util/filter_policy.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/util/filter_policy.rs b/src/util/filter_policy.rs index 78253d5..03f1da3 100644 --- a/src/util/filter_policy.rs +++ b/src/util/filter_policy.rs @@ -10,7 +10,6 @@ pub struct BloomFilterPolicy { impl BloomFilterPolicy { pub fn new(bits_per_key: usize) -> Self { // We intentionally round down to reduce probing cost a little bit - // bits_per_key * 0.69 as usize // 0.69 =~ ln(2) let factor: f64 = 0.69; let mut k_k: usize = factor.mul(bits_per_key as f64).round() as usize; -- Gitee From 865390462048a09988640d4cf214ef6e4de3bb01 Mon Sep 17 00:00:00 2001 From: fengyang Date: Sat, 17 Dec 2022 22:45:57 +0800 Subject: [PATCH 4/4] =?UTF-8?q?hash=E5=AE=9E=E7=8E=B0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89seed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/util/filter_policy.rs | 9 +++++++++ src/util/filter_policy_test.rs | 6 ++++++ src/util/hash.rs | 30 ++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/src/util/filter_policy.rs b/src/util/filter_policy.rs index 03f1da3..5a87f2e 100644 --- a/src/util/filter_policy.rs +++ b/src/util/filter_policy.rs @@ -1,5 +1,6 @@ use std::ops::Mul; use crate::traits::filter_policy_trait::{FilterPolicy}; +use crate::util::hash::{Hash, ToHash}; use crate::util::slice::Slice; pub struct BloomFilterPolicy { @@ -7,6 +8,14 @@ pub struct BloomFilterPolicy { k: usize } +impl<'a> BloomFilterPolicy { + + pub fn bloom_hash(key: Slice) -> u32 { + key.to_hash() + // Hash::hash_code(key., 0xbc9f1d34) + } +} + impl BloomFilterPolicy { pub fn new(bits_per_key: usize) -> Self { // We intentionally round down to reduce probing cost a little bit diff --git a/src/util/filter_policy_test.rs b/src/util/filter_policy_test.rs index 0f19104..b49448f 100644 --- a/src/util/filter_policy_test.rs +++ b/src/util/filter_policy_test.rs @@ -1,3 +1,4 @@ +use std::ptr::null; use crate::util::bloom_filter; use crate::util::filter_policy::BloomFilterPolicy; @@ -5,4 +6,9 @@ use crate::util::filter_policy::BloomFilterPolicy; fn test_new() { let bloom_filter = BloomFilterPolicy::new(8); println!("hash:{}", "a"); + // assert_eq!(bloom_filter, null()); + + let bloom_filter = BloomFilterPolicy::new(800); + println!("hash:{}", "a"); + } \ No newline at end of file diff --git a/src/util/hash.rs b/src/util/hash.rs index 4ad7f45..945d7f6 100644 --- a/src/util/hash.rs +++ b/src/util/hash.rs @@ -12,6 +12,8 @@ use crate::util::slice::Slice; /// 一种可以计算 hash 的特质 pub trait ToHash { fn to_hash(&self) -> u32; + + fn to_hash_seed(&self, seed: u32) -> u32; } /// 所有基本类型 u8, i8, u16, u32 ... 的Vec都可以实现 hash 值计算 @@ -25,6 +27,12 @@ impl ToHash for Vec { v_v.to_hash() } + + fn to_hash_seed(&self, seed: u32) -> u32 { + let v_v = self.as_slice(); + + v_v.to_hash_seed(seed) + } } /// 所有基本类型 u8, i8, u16, u32 ... 的slice都可以实现 hash 值计算 @@ -44,6 +52,16 @@ impl ToHash for &[T] { Hash::hash_code(data, HASH_DEFAULT_SEED) } + + fn to_hash_seed(&self, seed: u32) -> u32 { + let ptr_u8 = self.as_ptr() as *const _ as *const u8; + + let data = unsafe { + stds::from_raw_parts(ptr_u8, size_of::() * self.len()) + }; + + Hash::hash_code(data, seed) + } } /// 实现了 &str 转 ToHash 的特质 @@ -55,6 +73,10 @@ impl ToHash for &str { fn to_hash(&self) -> u32 { Hash::hash_code(self.as_bytes(), HASH_DEFAULT_SEED) } + + fn to_hash_seed(&self, seed: u32) -> u32 { + Hash::hash_code(self.as_bytes(), seed) + } } /// 实现了 Slice 转 ToHash 的特质 @@ -68,6 +90,10 @@ impl ToHash for Slice { fn to_hash(&self) -> u32 { Hash::hash_code(self.to_vec().as_slice(), HASH_DEFAULT_SEED) } + + fn to_hash_seed(&self, seed: u32) -> u32 { + Hash::hash_code(self.to_vec().as_slice(), seed) + } } /// 实现了 String 转 ToHash 的特质 @@ -81,6 +107,10 @@ impl ToHash for String { fn to_hash(&self) -> u32 { Hash::hash_code(self.as_bytes(), HASH_DEFAULT_SEED) } + + fn to_hash_seed(&self, seed: u32) -> u32 { + Hash::hash_code(self.as_bytes(), seed) + } } /// 本方案中,采用的是MurMurHash的一种变体,是一种高效低碰撞的非加密型哈希函数。具有较高的平衡性与低碰撞率 -- Gitee