From bd6a3f27c61b9fb02559d68c7deed5dbe7a5fc49 Mon Sep 17 00:00:00 2001 From: Randy Reddig Date: Fri, 12 Jan 2024 15:47:35 +1300 Subject: [PATCH] builder, src/runtime, targets, tests/wasm: prototype WebAssembly reactor mode The entrypoint for a WebAssembly reactor module is _initialize instead of _start. Assuming that the WebAssembly runtime is not reentrant (e.g. not threaded), then this works if the //go:wasmexport calls are detected and wrapped in a function that starts the Go scheduler. When the exported function ends, all other goroutines are paused. Goroutines started in a global init() function will run while the host has called into the guest. They are paused when the guest call returns and restarted on the next call. TODO: figure out how to enable reactor mode: 1. Should it be a flag to tinygo build? 2. Should it be a build tag (e.g. -tags reactor)? 3. Should the compiler detect the omission of main.main and automatically enable reactor mode? TODO: figure out where best to wrap //go:wasmexport calls. WIP --- builder/build.go | 31 ++++++++++++++++ reactor.wasm | Bin 0 -> 80335 bytes src/runtime/runtime_wasm_wasi.go | 10 ++++++ src/runtime/scheduler.go | 4 +++ src/runtime/scheduler_any_reactor.go | 15 ++++++++ src/runtime/scheduler_none_reactor.go | 11 ++++++ targets/wasi.json | 3 +- tests/wasm/reactor_test.go | 26 ++++++++++++++ tests/wasm/setup_test.go | 12 +++++-- tests/wasm/testdata/reactor.go | 49 ++++++++++++++++++++++++++ 10 files changed, 157 insertions(+), 4 deletions(-) create mode 100755 reactor.wasm create mode 100644 src/runtime/scheduler_any_reactor.go create mode 100644 src/runtime/scheduler_none_reactor.go create mode 100644 tests/wasm/reactor_test.go create mode 100644 tests/wasm/testdata/reactor.go diff --git a/builder/build.go b/builder/build.go index 7b7cc4728c..75b9240985 100644 --- a/builder/build.go +++ b/builder/build.go @@ -237,6 +237,24 @@ func Build(pkgName, outpath, tmpdir string, config *compileopts.Config) (BuildRe // program so it's pretty fast and doesn't need to be parallelized. program := lprogram.LoadSSA() + // Determine if the program declares the main.main function. + var hasMain bool + for _, pkg := range program.AllPackages() { + if pkg.Pkg.Name() != "main" { + continue + } + if pkg.Func("main") != nil { + hasMain = true + break + } else { + // sig := types.NewSignatureType(nil, nil, nil, nil, nil, false) + // fn := pkg.Prog.NewFunction("main", sig, "fake main function") + // fn.Pkg = pkg + // pkg.Members["main"] = fn + } + } + println("hasMain =", hasMain) + // Add jobs to compile each package. // Packages that have a cache hit will not be compiled again. var packageJobs []*compileJob @@ -523,6 +541,11 @@ func Build(pkgName, outpath, tmpdir string, config *compileopts.Config) (BuildRe } } + // Create empty main.main if not present + if !hasMain { + llvm.AddFunction(mod, "main.main", ctx.VoidType()) + } + // Create runtime.initAll function that calls the runtime // initializer of each package. llvmInitFn := mod.NamedFunction("runtime.initAll") @@ -598,6 +621,7 @@ func Build(pkgName, outpath, tmpdir string, config *compileopts.Config) (BuildRe if err != nil { return result, err } + // Generate output. switch outext { case ".o": @@ -645,6 +669,13 @@ func Build(pkgName, outpath, tmpdir string, config *compileopts.Config) (BuildRe result.Binary = result.Executable // final file ldflags := append(config.LDFlags(), "-o", result.Executable) + // Enable WebAssembly reactor mode if main.main is not declared. + // This sets the entrypoint to _initialize instead of _start. + if !hasMain { + ldflags = append(ldflags, "--entry=_initialize") + fmt.Println("☢️ REACTOR MODE ☢️") + } + // Add compiler-rt dependency if needed. Usually this is a simple load from // a cache. if config.Target.RTLib == "compiler-rt" { diff --git a/reactor.wasm b/reactor.wasm new file mode 100755 index 0000000000000000000000000000000000000000..f01c2d8f9ff9571bee8a37b8d80ad790f4b7933c GIT binary patch literal 80335 zcmdSCd0-sHu|M8D$L_3Fs~t;gc_mrat}NTamu&Ej4PL;OIgGh6Bw%D)K4r^DvatzZ z?vRUc1qcC5xB`K21_(#Ek`PG35sm~B2!ux<+yuz+IKQ7y^~~&QEikIi2u{`BS}tj);l0772jk}_ot*R@A=^sZdg zyS8Ip?~3leMeBMxH>~VDYNEGn>7t{0R`zu&%N{>Y$CR=xZR4MEY)8eEt+nkqwsMtn zU9GfMmK%2zpqS(8b=q-U&|0x-d$TSaf4q}KqRdD9E?pU0)48U*XOpF3YdX5Rx|gV| zv#h7HQ`N_onEbGKPp5&Jl8aWZUD>y?qif~Sohp~?Te)`A^6o`_oxOdkb#O=TrnO5} zF59%Ix38n8Z_)a-N3C4DRBe|j!FR6<(WA@Bdpd=DOc{BA9$Ou8S>D;l7NCxCiG)@K zowW0AtWsMQ-#mPrt#r~+!&S0b>&?SeUguP+RoSALIQ&q9l=4UCbc;$(vp5g~66LMJ z87DdgJwu^p!CU2z$yvpUyVdfHaj_MLGpa9a=LK#qi5Z6Ojpk8E&TM3k6!v(Z{7k+U2x{jab`nY)U{Rx zM9o&g-vG+IMS|7rS^+JoN}Wtvv&}!0=+#xWrInq`sc{Nb`oJM?Nlq8MFlVt;MXYrp zyCJ8+I+?SQOQ1Sy^Kf0T<~o~)Tf;4A4Gm7Qlz_;&u%Ch&t{Wg_;mi}9LbdNPU(i%U za<~RwCDX~gsgYAsH(<01ndFO_<0DPX4x8|zCYm)G$wNOFw7gD+!bFt)gb|@5X1UZbaswHdm&ahi+rsN1@!T)^z2iGW8;uPQhj^6`So zdxgtSlHt+$7_trwIH&P1)(%&Y*T!K61`T_LOa%?9U=S@3S6Q~Ql7-(1oBF~zGTQye z*|(6-CBl({y<>s(tHL3Q*JCUa#j#*%;hj@Rp^dAF)k7|0O%I*qU{0~WDvw!}$Drml zXPq^>aFxiA)AO5M5E$7hqMt6%n&|YEw&3)&?-%ZcT5v^bsdQxJIWiBwjlpr}q+nvc zUunaMqm@en-UVyJs%9=#SYa?|1+Fu?uMj)3uduoINSH1vz)t;Dc^fmiV1X6vS}LsESsw7qobh5x{5cDX|j?%XT1Cg^AG`lIZ9CXZX&%3aM zg3h^g--)8P21#}3uM>1P&gPu$25jMD0{aQt#u^#S4$AEhD(EBUq~MOE*`j`9Sn&$V z&BaXf^m8!?pA-x7*nej8Iv3A*oZQ}A8IK%HjM{|3$=rpN#aF{EXul>G16aTkjFE&Q zj7hemEAZGTEs6(SI(^h5Tt)$w{83WnG^cW+V23MI;W3y`3Tv%xj3;!n;mi-%L)Yl9 zO6I@B(uEZa{ur|}=S;CGk;JB0J`#6|l|d4pVr7wdQ>>w(FV4{yBM`VXbed&8!XL;- zM2k@1Dz>>6aoUD{6$)8^5n&Vui_58g?hT3o{f-S(m`IrK-^x1H;p`(q#(ZcV~ zYqqg~7OfCnOy#Z667Bk&Ra}GV1hZg?WGE60t7j6lM3IVW|tl zC9HVH*NCum!Kjm4h0fS!P84@@h!u<lqMNXSeycKy{Dv~?(!t`4wVJV#Kcc8WoL0dNg)Gwlvsf{l5wa=Aj5r&IaB?oT^=FwWjV*?T#giTn`w8THY#5Pb zxK^8eBNFZ#k>v6fOj_~?R9dapJRAo1n>Z?<>b4n6275|`DR6)mOwcN1SM8#>akQ8q z-Yp>P6-US+iHnor!H4$jV+5lQR`iIL=D4SBC*ODI#-@kb&wiB{>H z<^a#OXPfXc3cbY#+A!t<_GLm4&JL%5tp+_WXagCVD{@ZPDomAT3DrGJ0PG!-Sjf3& z3M;y-Q}{^SNOPqG^M&Khu?0f=tZWARZBgM?V!4W3WzHQ06<~51CmP53rfkI!=g~bM zIS2bRox=_ip#pYAp=KEIL6E}xro~uSs4=^56@@K;7&L`9PH=e9$7xzaWh@M~F@JGz zDrZGTJ!V1(qI3i3XTsTPMMsXtqGi~yW8naEZQz-YHbFa2RzkaVxI~+vU7MgCs>1NY ztzu!}3T4(L?ty&dpymt`*$Qdd3L#f9#mXT`PO(~$K*6mc`>_%MJfgP_R{A?e90Ps6 z=Y%H|+mY$~9HOjv|MN|5Rya&@zUjAwBZl<=^@{7^z^9v^s~6Eq*dI|>@*^E=Hp-^- zXRHpg&HDmJj^(QZhmcdylCi`%VD9B~7h{9sUQPK~7^pG^$^-b&r4{F`@%1@)d#wGR z+gI);*o=%iZ2+dw-;u+`UG08en3gTNwW3Q$=jqZJts$XzLz2O97?Lj#w8e}`m-?*I zpe=AwSkam#7?Pd35BEV2z<*RuPD}%HG}z-RKRQEnW$Iw#W2PFkIgjTra?TMMl}2P| zhi2u}=WxFzpqKLj9t>cL4CRU*ouB0#aaOXPTU^g^1{Et>BR4!)(d}>wyW|=e0Y;cB zIu5FMR)|RqMd6+ax{-7CY~Vf>4RWl=F*+LozoFr|2znI>h#AjQ4J2riab04MidY%ss*se(G`~XX6S?CF3h;d4-L#Q@|$vMTVmvJCU)pdiU%0~eC_S~zD7nC zmKDSTILxK8!58egzd;i0Z?I4lE)*BWe&uostEQB_P@2F$Sh>l`ictIq;2n;{pO+z4$b=WZnE5Hf7T9To16H^ zc>AxQR?>!_3ls*A(Hv|ohU=W}3H8WRLk^Z`954@KpnG%U1Xxo@4~=mOOcm>X(NM$V zf8GZ$ONAAR!W`JT2ygCooojc&MnY&TYw3W<#*-nIVSAzKF~+ z?8RZX>>cIH5t`qu)T#`{gz=p*fgij3tO+zPLdYZb59<02!ib z`9;j)_5pWE|8tWtUVx*{0p(h2=3KA_0@p8!`roMM@>sIJs||ByE_YJVJ+_k$#d6H6p5*aRWr?gz=(e2U40d=--~;Hra_5dj5UwTn%V z3u7{yAh*y8Z%vDHiNNNdfR&{(m<;)Z@jGzo+;M;?2Op2EPV^`MT$_!Jjs$2hNj?+d zsosG?FYPGm@d0+DJI3k#J5U zX~n??63%HPoYP1q<P84D}uW!DbQpmCjlc6`EIbrZx znqgD34V1@JiUd?yBx*aWaw`1O)8?$f zF2wtI29t~RHe;e~D8dQgNfnf_cfy(XUF1HlJws*0!kQCeZGoXRgIgawP);6f5tFnL zaLSz*IymfwTofAx3CDo(ZoB01X$YO4vlI> zGl71)Rf+asqgHshL>A*)RvZkp%F90#==iQzn^ z4~qeA=gEFC=sU2-0GDdd^N~5Dq9o1g-oMPu-t>va#qJ%V)N@xLXMVnaBSDO7aQUyEOSR_@n zn+01V)u=+Sqs3z^kcZKz5exGG-jJgUN0M{4vz)2ee+$GZO9ra5~d)%oGHkzVk(0JqHBYUc%U0_zQel(GB{$9 zm2hTILp)qYb2#aPt>Qe@s3Bf5^=#3Y7m+Fnc-(?#XmHodg&i9e$O`#WG#5oY(fM$i zGX+-#EiXqyu?i@#!W#Pb|23QE0`d|r{)AEU(V}kPBw7B{x0mHD`X+k z3(QvJd}bl(OByE53hhuyINKnwks-@z^G1*v+Kgc09i2;H+Hfoqk%Bq#QkW zXPE(^p5Z)j7){1}UIpDVF;_e^MY}xag2l*sHN|=#N({oWP(X%+QI`|mEPK$=N9-cf)A)b`(*H;vK@11?cp_y$=zyqT=Ng663ku=agrD5FMj5}?emSoW7y8d`fU~i zAGhs8*%h{sTiV&vxeV9ZC7pOL zpmSp`VAIpFc6n!S*UBZG{V+>AJC@>Ygw>r(!KORcxuJ7yU#_=%eb1841Mu2Gd$(dl zmz;Rti5e$xn)0hBkuuLe2UjI7lT*qf5`VUOBJQm1SktL5kB?V=An^F`9Sc2Z(IUKt zv1Sopeps}mue+z$Y7E|Uz?%oVuJ1t)`u3+r_c5xoQ$cZ8$NIHPRybkSyt&{;EkIqJ zN3QSaidBVeuIT7pvBUQ9nlRth-MxDKx_zinuQo&msbC9ziRut98WU_q#9&TKGQMspYJ_u_DV9?u1wf1#pA_lM?>EPgDp%@sH zCF{FDM81WkOM5zddpmn;Ghum?CtF7ZQHaIe)nQZZE z(Q*YV#+m<{&+G+&Jm*amzcdp0O6C&>pn{dY2B5VQKKh_{t4cXr09Ra&5BvQZjEi<| zAmVgR$p1rA~w0xg}ChLzzg2XGWF&w%y`FT*ulK=qbcpVh@3N#x3hWU}h6@ zru`0j=6XPzzpx{lA-^^F6|B6jNPZB-txb>^dA+3zLtqVg7v-^4s96O~SalFb#VN4- zdEX@upU6b?fgS{ZVM}+As=3(GvltL-cvaNWlgzg;A3F_IrKOS5QoT$v;JnAkqcLhk zn%laivprC?6>b}zPcMKkhy%#O4tE$=yu+Iullr?`Mn~xnD zvOiha?;K7z?=sdoCSt!e(|->K!FS4-o-Rx`hD^^8rsqUVD_T(Jv@)hNt5DJzoSNS+ zV|qbRQDP=PIG&Q98#Z#0H1gk3BMZpmoT!n{u#gdHP+eKp(vR3u#rIfr)t}kOPs2uj zER7rvvynecKq1dh5aK2()-GqzrWbLX!95EvAK7`=6)s3wWFr|c^Lk^74qyJfUh?>7u{lB#K1p#nhsWkX71wO4QlbHIzMf`V zMCdJ@fUJb(+DU}9Wg@jwp=*Foof@`YsipbH!{)2n$=DLCOzPst)TfS9I#9B4bx<#Z$K3!$t#8d-l8$!b-jTHAoK z7HxeiT`oj0Z0%Mq@SGBXf06;kTtTEh30t3MTHiI~SGAgab}nmuYg;=3c5Lli-rRmA z&B-j^U*Cz|r}xi;`T+gwKoho^@(1c$fk+L-@-EKtU?a<;kt}Dhk-bV}iTZCAI3c9o zLW7#dwf2Z|sX9!bXN2u6G3`v{ITZh@+F9)@#dfyt?$aFGu5!j}O1dj{xYqP&Vc60- z)6x&4mR=#B<;9jt`awy;ek8Gxu{M=AcXUZ}GLyenK9i3rpBTp)W7`l4wAl!>Jv_Ah zRW-1szA}M6&&fQ3MH4sH$~@gSN<=}6bkYkBgiiULE>+Q z5_#Mp+Eq^>pCAhr>@5AiA~Wb^d<6Txs@EyWNdt+#_4r*L1MRuxQlD2MwFE%t>n8#e zwT#35zI4M(XBpuOG((5fV`0B8H2r!j?AJwQ{kjm5i_!GYDZ-fpiTio#eq2Jfa>0L8 zF8EdDf?r)CxP%8k){F;?PnY=M8bPEbK)6;jLP%92o|MtL&h%0bx>Vcl8MzpGf~uBeK$Wg#hk zZY*#f`Y?{O?jF;pWyt54zt`kX4*PgtSsx?QT!iq*boM|Bd-G>^mP^U!4dxTv0RE<= zvl1ozHj-R#vDw+*m2_4n)5Fr0bR`QP(Juui>THov`cci;nFH&ZSo$$Rq-#k1d(DuZ zg>mC^AJ@;*=U$3l%SbdR_+M?K^ZkeWGrZfUL%``TYwLd*clVdDcYiaz`zY+)%VoWrfu+{;F2kXH zW*fa5I8@j~KlFBacit)Q&OeMj)?-s6nt#v8HVt{1WAB&A_J>F|?)t3P29j;-`Sdz> zS09%P^GS&?GJQTR(XC7$Z2tp8vCZ_+mN@W(Af8Mg+hUNI>O)?pk7M#@h2pywwG)qK zO$1zwfWqkb6Uz3Vf%;LLG@oHIchO|3tm3L8y-16Uv~Imcrjj4^!ZN)WWO{K!*ozt? z^&?>~GA92<*o(oR)r+MFo=h(uqbLcXD-*kz-FjTk&!N_^k`9QxO_9981|etUt-x9# zM$&BLYeim+WO$i;A4X!`zy|6D5^HN=u4m{vwnUg)IJd`HXCsO?+I$`BnKj;eCt3|J z=MKEh;%kbYdi|9WAz@w$xJ9 zGp(Buqs0Ff@~qiFk|~y95XOoTgMGOe%$2^SmWFceE)s05h$nfjw_k}O#Lw(+g}XFu z{LBH;@6?GQyMs(OH)0tv-F%sR=9hJI>*lV6AF>veG$%%Igcw0u0+0?X^w+`h;9^Vs z^(A4`OHI@7MNQvMo`;q-{TaGh#8F*S-u~JWBfNJcD7vlUe(O*!mFvU`)2DGoInsIz z!@=9S=A6ski{yeH4SKfoo zB|YHL5uV^EZgKZ!4^A*W*vuZBXg%A%2PYXTel`^N6eIA#SQ3oDPq5WZpD*y%vi^zt zt<%e8{jM49{iuU8tiMxJAA}8`Wg31gYWQuk_(oa7*i%BRZ^QDPF8|+Lw=B%c@raD| z5A4_BZ9VPNfPGF@i-Gjpq@Cz90JO&AV-xcQYdXN4S?$L*Lx{L%?TO@9*sM6aTL%H0 z$HFV@228lPBQ>96&FLB5zWD>`F0?X~;1IoU&W~)XmO%`gcdoU)S{?>U<|f-$!g>K&$L$RJygOSz&d#t8XR?KV zYX3igGY+bC6EVdZ%yhPsa%#T<6>mU+Gssc34?vSAGE?h#wT+=L4US)XE9~-gmgJml zEzj(D_Th|ha zHo_0tG9>2in13r89&{%@GQY;h2dsF#HJGXATyE9U9dRg~t1MN^kcUI+{KRsU&(p`u zNBB6LT-UmTnR?D@w{``P92BR^RkasF2|0AiS>rk?GZv60{VI2eq|OSrb_|^Gt|VEB zan39Nw3K>YGRNTKMGE~(YcNyKx!nkT2@0H_mkND9 zg}#C{DVyk~gEil_d@4M%2gWx6dvhK!CiOiQ{=v%7Bp;&4FWNps6w&0{M7&}9|D+Ha ztJVS{E^!7k%{kw6YOjYI*ck=R=@@(lu?!uYvoZL24E~-hIp3+M{RF_l%v_AGa1)`1 zQigU%Y;PuISm0!qfZ}87+HF5;?74upTCtxC<`N02)dz|8xd3ZFSytii7(eTIJw=O#1iP zY68CG6`aU9|8Ryd%{gy6wRfP~Gf?2X1^Q{jl{$l&w~?6zKr-)O1M<8|L_)M3NfU|0T#}eE-7wqg{bVQK|+5*AkxW%HT{RJj+#Ihv7JC zgoV%GR`p>c;JP4fzgyLylD{y}xD=MGD{P4~*3i#YoP=`c;DAiI5{djG9_u6~ek499 zrd8v5#{i~lw691Q*O)N3k<~RQaMX1rqEtbY=SoDmilIEHE@~;!MKFPRe~5WpN#Q857Hk$LGMww4=b%j^{av^HHIT zbyVWV*e>_7#7cYxQ|)Mgj-%XHP~FvTdn>qD6_*BqUwl9C`R;&x9)?6gFY!FU5da-O zaWTwp7Qsy7g;3&F<=#Y5z0`P={2s)f<0Q_7*$XSQHW&DfsOe>#L@(eCQl}#OXV!=MKE|pY)c4SB0im;B!0lSPiZ|r!^)wKz zibGPREGalN-HNg0W$&x~z0iMqZ}wab`WSPcmwl|RUWIAKOIPhgYpeMXEgHCH8LhvH zRWf^%B7GqS)~5oU3S#|1;HeFWFB1zuRoNaGa%vv{SHcakCnR7cXoA%QbX4^u7!@zO zjeXNKKZ7C-TtkJ~ZB$v!!*J&Y>r*Iu0;{X)gMsE{&upL$YWU2EfeoLTh z=3n)9VZ6NT zSQH_y+}q&|953j2b|H#I*gZXhMM_U)rvO1=^?@G2VwtP5+k?xuQD(j45iFL)RJH;L z>EwSrg7xQwv|4+F>$^gNg!Ty6$F~c(RcnuM{qrG3z4i##9~@E)*B;^eHhf4UW3)%O zz7=F5(f-;aT(3gJSMZDu5#J0Eo!TQ@zc@s!(H`OYk3+;!+9O>5REXHDJ;L?#Lpi>o zJ;L=PLd2QcBb*%;RIy+82xk8kXwiPpBbYrtEdR(OSicY->Ft(XpeCHeIep#?Gdh@9?EgD_6XMx3K8Gd9^vdYXzFGQ2KN<@V9`t}Rki>G zjnrA`5zLMb^F1EH>@a-1&AMOn2o~$6Rkj)kcE|a)M=%=;^XGU3vmXSr)w$3kn7t4m zJHpAho=33AE2py8LC}L)=6eK-WfdxW9}vAP8|)D*mL*m8+i?AqA$FKYFna;~zvP#D z1hZ=)$n~fj-`OKrtZS?6d>}Yr@!dRv*^>iWZ@Nb?yClr-hK~-?KChj847a10jVVTLVH$BnWSo&k= z+R}Bu!Ft9eMXS2`2s;GSh>~CfTf65WaX4;_hSG~HGi2kDal(bD{(7v*b4{^BxN-q9 z{7Wsw$Aj?u3{Jj<=9VLm0UUfV#uq5A>!%2+ZZYcF!%^y}VU&h{jpyP+A5qe#t?G}) z?2^WgupGjTcao^1gveF(XFysZ>aZNbM*788{S%06q+qe-5H?LLvFc9^`>@1v2sh#p zYo(W#u=P~^#*pn&%OTu2l|-E-L~%HIMAycE?ZGhhakW;#;FdX!j&Hd0MA2kZHR+}^%r1e2MG)RX9X)Z{cgLI_M)AHR>LE0MN#|8PeAisT( zpQQ0D7NQKl;crDvTV@7WW{Siw!n6v;BYp$mlVV0S|7Y{}NigiEnv{xXAk`bihW>AS z*DS1${RSIv;+&0D??B)=*yzzV8~W@y^8;|{H)m>8{Ah3wbSLvCX7sI(wwj@DeT*gU zxe3Bi!Yt*%21<~ct0#p50{mU2=!(0Xu7n8h9HJ%vP>+Kw;E-7wp#f+ zM}V}|GV#^uAV1y`2cjng`R$|Bgjkb;{3NSU>|~l{0;w4RepXq!bCBOP;5*kckBBWrzU0b%-k+PZD&G8dwVVY zw{4>bd_%3tXDm^&t*z-e2`{ZV#>ABNjh1ylSy78ow*9tl7-$oOa=`>ooNX0!~E{dP>$0ns_F?11Pf zTS8&G!&nbWxop~ZTfB2%mrVCe(7!EagzP76i+5^D1=~L8=he0hzHK|!qB4?E%A&EO zby}o-k==MADgIodi8?ey+}}%Z^(s_5XEubqt&DF?(DV^bFfc*OjdW4=rH&EkdyZJS z-Rm?;_wIKr#UsxW186gGyPb+#4P`}BmCQ!SP7}9(;>gsoPjigg54M6fWd_+FYEz7q zzS%xkTU})MbkT%UCI~`zXrM^GQ`X{mv{;6kfcamB8XBU4;SLj{s^%ITyE1gN-*p|r zjhs>Tf7~c#=w#20=o@5v0^s{E7Ri@F>y`M4|hKH z4}zL^#sY(r`G-Jpd;kNUe`Nv0BM^xfXr_08JPZoDlp2il3h~e*J&EXM=9_YLGZz1T{JqUx84Q3`Wb_n*4 z7+)uw*n;h!fH^rRz8D$^c=JAlfcSQX%dic*9V6f*Jc7vsQAYE@7h|~gQ1q4vw-zGA zo#ewUc#MLDc@#bi1rm|smmItcf578t-n%!gBsOC=Pfj>lNREWv-^7YdxaF4vS0aXR zLUK0RI5~7k9Vn9t1fD%2SC8(V73C$n$t8g)JlIuh;6; z@hJea)fSQl6p^F_>Fwl_^XhnemqvgCbKcw)hF%?S?F#7E@y4zKk(E^=51avgLu7s% zMP%Ob67vRJbt<@%h+j!zW+nTSRZY*}_JTLuBqNfGa6EqxNE1VyD*Jrs;B3dfP!g7; z9z;>;{iGL>5AG)k=%`9=WcZhQA3*6nKSNu`dwynI>v+#E=o;_&-P8>^7a>jp^+{dZ*4$V%?wX z{Hivj_vri~%-^T;J5mRAR^yfAnG4QY$a9FwU(T{omTCX+AYE-`XTmtx*NRGyVAFMZ z9$H$|b5b{vb7d+!6LXj5om%7&9KHr4_zehERpAgEu^F?H9ZXMxtzH5>6Op`rIL>wf zq$dM=Ij}^G;*{c}63GYfA;nWrd=-j`81Y*aQ<>?ho@?I#ED<9fz%&-@G+=*5S|CPT z5MrkTdoQp=jCcVRXqV|(u#*RYC8CKsOz&%w{Y`S9Ne(v2p-uNp0!eREVhWNInl7Ax z#BAzk*)21r8#Pl6aehT~=>j^j4~#u8xurTU;$5oqd$I99>HI!00;W%q`Y%EGU$qQ) z`X#;HOdHSFLIdgdHCR0aeGrrXEqkdg(`eqx|BU)U%7rnF$d~geJ>3%fOfRwWi`X1e z+GP4WCZbKB8Kh?i>Gv!n&Uu!I2da0e z;zX$4&9#@JsEQU`eX468jZ70ot^QUO)mMFnYoAF1$$ZbXFN+xcpy}<&Ah^^LMn95W zS@pFhxzYMr3}v?z2WJu%J4jZeg&YZ6tkF%JCP=7_%z815%tn)Z%^-heau1s1x6n$$1p}jWZ%FN zwE=5BzHE=+;F<8a!JXnQK*OsRPn7F;r&yLNPYvVT>sG$`S|bET?$_gYyv^NsKVb zSd;9~L|>oKO_wn_sA(9?6gfKU#NlEGiL*@Z`%Ro>i7T4u;1k!$saE1PL-I$NLWyS# z<+Dxn{fXDbdK3R_;;NGP)F3}_}vvL(AFm z90&g@j8=B+I51P=`0UJ*l4g!?QHodfckOZPN@>|0!1Jm;#~w7&QHqy4M~}Y-JYFo} zv2RK#Ue!Ch`!A{~j{$m9T1s zo$<<4+N?09 zmpjU4&^Kn!gi=cZxTBbzXd`hTS^HZMKvdrh zcgAaIinC4EoRtsZ%s%LjHIww2Y%{=FMutmZoxIX>Ej@WR=mYB+-OQwWvw-)o7)kh# z5S~I%?XV*{z$@KlX+yNOoM`f0&_#NUMLtH*E=wA|6ho1oPG_g8*P~Hh>6^$`*U-ug z?5`&J)>ia3^L3P^C(#x%79zv+Z9l>|s!_E02N4KXuSI8hrPq~k5jaCLN*^ihc7lsF zRlp)cRXrE(i&uJeNo9f6lpD}RUa8S+T(@!Z7`Tl$qEe$peN*Sc!;S~{&`5rWF7ryK zwM~j?M?n>=Km_vBU$6xx(;44G+4B^>Ny;YjQ0_KXo=kamd=uF-EM$jk=4Xt8_5Ysa zEkZtHH5VMTpB|ybC0vQ!L9u%?eu?ajY|E3dGaq&mhKbu%(o!NgRsVQn;tUj56CQx zVJc%3(^u-`PEU0j1ZJjc7(aODE;Mrl2yEsj4B6>`l6?JUG(3AY1iK0p(2Pp|NT+7@ z0PzAF_?1o-&W2Jp15tPpEqx1snt2&MxzS4hM%NU6i}D*-{wjdG2*g47YXV0Dcmlwz z*YPm{9#Vun!SZ*pVz9-+1e6aVur~lcZH&KJYmwdq;lYin%I!L_6w#G0oC;=pvDQrh z4whQ8zKP@^RKnn?^hTZB4G*(gTP~2oaeE_Kf`ZVb&S_DKSM@3Ol%1egUg_V{m~`6? z5u6zV(2|v-bkckehLirI4B$t!g{Q@Ar%bjmcDPba#=2`jX5h9Xz&HTK(3_;joPVQ( zdzDDF0ds?wwYNR?BlK(&xLf<&jL{rhj}FX1*Q|Y+otwj;`Dn{JxUzj3iY6dmI0(Rw z1o{BXCBQ?feF@wR;Hv<3U4f4sp=!vc(l2`Le64LGaMYIGauT5S4}dxy0RHCv1QNmr zMtb`;`~$D_IX0)y?()E}c$ssUADhKgDo&TNQ;-!G^F47f^G1R-d~?L^Ct$@ZePKDf z3q$sL%jH5q&o%ad{_J}~_7@5J@%*xtt4r8l(V`Tu>S?lawaKbCO#;q2H-UDC655;L z`+23`wZ~ozzQv&*`x|77^Kk6HkbRru{x6Q=*bFL_ba{JZe+`QC2Q1C}f`so8EOq#M zoR3lFmA+d%nsJ55uu8G15~EXlz5)I6N*^qKUr!fbY%%PMc$)G+ybajVGSI3)@8o{HA}HkKh^mKno(@ z8&Wpo801C9Hzhyo*KmSwgZV)if%IEC*?tuWUIMc40DyN0ybItX0JF{sXd#D6FSJr- zVqXEQnw>y*s$ruLL!}Sln?Lh@hwNx%Lzx>P7O(Ubk_qrNa#Pj!*zjGr(%)b{Sb_yE9nI<^AU?0ghR0zBy5`0R zmQ}H_fhuj=2{S$bH?bRnRimDnfMY9Em_G+InO<5Z@99|Kd8PlYMYO%ofoP)if1B0l zCge9Dgi3#?8LI90I`R^cd}>ywT@eh(pbZiWo6&)MA2nAa`5nK5{2v*$G>AdXcnbN_ z=!ShryB0e%Sqvj7^(Kp97^kA!z!|!Zi7_loYBP?nhI>?lWVHnGhSC3e&0Y9WT`c91G4WY7*gnF0a zva6`*G4DbOdS;Uy>w__a6T614+~?t?UCm(Ke}UNKbzrJS?}keIh77Y%6n?Tn*>$Wk zW@gAivSSZL_GXNY-N^W@AD5*-e*|{u7M3fNeurY2J;b@FwhS>`kll!^NGYXi%5baz zyoQY{t~dsk6(<0@G33L>i9LP42;PC-8f=F9qhW0%P*W8AH$(*Fa zc1X1Mpl9s#hLz#9NI0N9mb+lx>K=9NnSHql-Io>y?<memB8N3r3^NCxIlh_)BE~Jc4D1k3Z74k`5IDcq5mb0wO*5tBM>l4}vK#3lB@YMKq;Ql1DcR43p-D3PV*9-_X*{bVCe<`A`! za1#%FCN{w!xxY-@%Od}$tTBwW<%N#KPXxYPg*^SS^wA2TJ?6z=l~7?|LWnyW)8>5 zRX0=na)80v{lwpKfH5hqrv4l?ZZB!zEYR}GjL_1;bjE?mkkMp;N1E+<0CRB+@qE^B zQh@(W37%1Si064+2=j0vtji5#2=l};gn0lI!m{BD_|pVKKEE$%i?`uI{L{dP@be`! z3~EE3b4%!7Ce0Rheu4B?javxqEGf~>`7lskLtK0Qd9bgSOUlkjV7H9Re^%RE^Y(rc zV{;!aAejFuoW9z!2aWq#+0hcAxA29N0C89)??6B33HQ~E__!D-|13owbYt?DmnDZ{(Mq(3~-;WgYiw~PTSuo_{n=yrcF|Jax=v_ z!R)ws&(t3zZn?4vvHPWAlsjC_h^``94~t7P7xK#x$MjL7^b7fw~XBV^{~KUvD? z$s(gCi;SKWM$*eauy*DX@_b4jw>&%3ku zul(b6s{Lf}la*uEEucLQcvv+Det6+h6um+=QtR@t=tR`|3yOG1z((U+f|Y0f8Z1Xo zfj;z6hhh@&@*fKn_Ytaz;vOrX2#<;8N+yCq%&3R;h$^29Z2ubQk(dA7QrkC~MbB{v zzpD!{5i<|ID{QCB)G}~}PX+iA`ek+@I9{yiCYs+wnuISFH-Uzd`993Rml)4Xjq8P- znHskkScLnznPLpf{JX^~s>(gUi+?G8aUFwRK9*bZNCF#Y(|9C-%?Riv*tpD|$~uZf zf$-Gi;W6}>m)}y_Ym=G8NYo#xZ$o35;!Mr(7~S`!cYLJ5&yd;VKhm*`6USmyk*4ua z7W3V~bV;-|$-q2(_otffiMqy0RW+p^((v-n6B*m234zs=k?1Wi|6;bT+eAQt4cW!4 zlCfC(N>Zrwr$F%1H9C`l=5>}1Lrpn(JEeH(dggVTgE|IQ)#srny!<<^18Lwi1Xi`z zK%>0;drBR_JtS-s1GtC1HiF$FD*84#-Am9IznAl)ZlrgaY z7T-45xKz=1ttf5s30P75Awq9la5iwk7-_%3C|n%UP=QMZQ_Y);wf6cqYmhJO1K>6S{OXGP3Djfo9wsmi zz|#Z{0`L-n69K$U;5q=@Qy1_>^ztaf%=2?_lVmCGaAENdRWujozG(h#Pu9uXMh!3MKCVIpNZv1YQEBmN(v+ zFD4>>Q2zCL=xiQ~q*~1pu7870%%)G?5eWEA<=>+7LU9NXRYcsXE7Z)j;CeiJ(W)B? z{KEL7f!Os_e5jF1!D^Jw3~N6h1?Li{W>bu>q3D!nKK&G)phfMP17`UM5Te-sOFf-> zY|8{v&z*_SOUV5%g?4^T%3jD9{sdq#i+ANBbRN!)pi%UA6B-Xi*h+XofRLBvm%siVM$ESF8mZl^MEWo4uGfd zg?9k(bhuE3u#D&Q(kWJw)v#8#%wqdL215GOV3x<&meYXUNAY{Tcd5J>pGsD}8$pM2 zGvyD}O{Vj|7rJLjAu4|W6gVMMK3@Br#Zh_&2!tcbZ_-}-SV&>cex)ppKuF3eP_{={ zCPhQTq9lq|ghgr|_mfwGUAS`o2pZ<)KOhs_oEXate}FUm2#k>4B9r(5PGYl?{aPHE ztXU5doJ&*Wt2O>Z_3ihgu|FZ-eky>!aTG5H5ZUEZpqD{}U8?yTbFds#6lZfa91Sn* zT|}6@`LL77QV^dw?F>+hyD5m``bkBf~+Y!4h5}vpFNE$ z6xXwdxXu~Zp-lY80+at8^A-fzN7|Y38uH>n_LaOuL{~t3v4K5GBccVxXy_FX$b8#J zH_G&?f-b}e_tkkBqq9Q9LAtWt1GzCvZn+;t5!9mmMLN+w5=AER8GHw(c<|T;J>O?P zw!!mlS+6drb=*G)Bb>D?cpicywb3@Qc{5Pij-DK`1c&CC}J3PY3 z9Ub>`y0VV@JZ{eLEi^-z!pVRPakM9gFdcEF1J7?GG8GtF`Slcq6La`a>G3zz2q4)vDcV?5Y__-te(oaJab>e$yA) zNdu2wa0FxH!M8d#JA2+Pb%u0Q-R?CzW5UK=WeqVXQhSq>l`UoylfaIgSynMp7*fPi z84kqq@R>4vX1gxhEomr*c1y&Fe*;gIPOPCuyz#my@yt5PoNz^u3b#bKWO++&*u%=G zC6~QOMJ-9TDqt_H%8Wx$f&4Le&%*k&WOo(a>O=2iKq@$t1Li zOl=CX?_R?Uztd;Pkdm@;1tY#T4qHVUxg9VElVw$`ET62vch~M-!{U@tFruJP77GDVdc0m+6)K8q@=Isipz(M* zqqG#ZS48Yy!wPU8hJwAyM76Qp2gW8c*OpeC0wZD7Ay5VAvSor(>^kYAAM~-lgu(@m z6b*v&OEiSo5-NpZHwHZfI1JtQ+5INqd@};M8vM4PNRiZX@muqP_Cenk4I45O$}N6k33CkV_GQfBsK|VWXi$ORfKFn6=uc=1lcNk; zm=ck~Y3z>QL{(~PnP|e4qT!o)gX!opJ3VrR$jpcYld>I4vS@NbjvlqQXN2UcAt*e`TI$B;m$5hc1^c}tIvJ-0li=Z8x?qNKncm45A1GGem6e3k-^yv{w5*iE@>jJ08JhVC zNF4Q5fxmpq{eET-xAE~~dt3d^ULXVP7GEyLmbsg-(LL9~L2CeUi*Il+xIjW2DFirf zD@|!Gf)K+8bR#2(4`i6$aXbu!4J7-C*2WX}AcAq%no3ZR(<5kR1nopflr%fS?HWOI zB4`gnLbrE>+b4qdkDvo1=->!i7(vv%ji*&zYY`#gwg~a=mA0*1yQFLV($2QUEBks?*UH69#`Sft8@HmPYgyZx^}Sv4+m7b9QI*0kp7w28 z*V#LM1-Jgdc6F{DzeJ4vI%(>vFWJ=M?!Lb6HKsN5BelJ%OtA8N8-9{;Ww|Kw*fy8n|$9$B%Er{~(7) z$09j;r4!JII4swq;n-tcoPBA1p2$Kq{ZAZC*>pd0edqel@yol}`I+tAIoc8DPJcfT z5YRUS;PNHGZ0kFWW2ajZd|v0zfvIj zkj`?(2u?>RygPTfaDHU`_YZW&O%o7O84C83CHY7g5!E{48)cyw&=? zWz+CrIX;6%)Q^PE4+rM6?O(6$T-MdOqz~o@yBtU{_}TBse%ExY?p%f+tq$nmUY2yP z-4N!Ek{=)ravN6mu3X&Jxol-;*V3rV`--T04lL?c*3r9Z?UJ?*xXG39^rd3-n?~wI z9B?`6H<-r*=yBWqH$OoB1%53z{GHzo-S|Q2m0g`*ph`6VIIrpQmUs88>{}5UU`NlA z6{SBJY|OF@yJ(I4+;*T=SYbzB00#nX%^@t{Z}{@Z$yWvy`sodBC7d$-dT zI$*K^L*SQpbuaGd3VQ+s6oX%b-hkoX5R%Eyss~jfR}Z$4PR*~wV{zth!xwp*-=~gz zJ8Fc!A0WfgwfMAWxOGmdf?>}w%vx?E;gbk&CUm+$?l8h!ukeaPg@ zB|Oe;bF#wnHe}uU7)u^viRGpx^RQIGYv3q&oHVwe|14+$UoaHH<*!AG*N8qgU|ESZ zz>d2C*zff*fK$T^Vj5{8B9zQ-*&4HdL!HzIMv3a55so-qGWw}aWE+;kw$amYfQ!uHIP3g;2t?4~KlRe(kIYlyVnxMc1(85x!b2p?z0 z?dg!3zgvX%lS2JZlM!m15J%!?2yZm)V9Or}`7E(NKo6a?NcIZyZdMq*Mo`rAFA|v% zwXqL_Lb8-L2H0&A+7!{p1|vF%nYf!IO(S6k-+Bg^Z{FDN9*Y60WA+GUr$dP_HPNqmC zi?2m=trTI)#jnV_)^>zrF3jJx_`;3-^JCnR%FUq8;xk%%u;x)~wj3rzOyn_&m0o6j?Up57epftB-x3j2v;-4vO=$INw>u~)t#VSjLpk##UK!6?@f|DGMFVmNa# zGqij!4xJNEI*}D>M7{#iPA~?CGV}G#uJrU8Qz9mFEnp+!b;QCwjSNJ*9r?fp?;t2P zcqfT;pn>~|Hs<~i!FG1$H-v;WUo|tV9|dGzQDprm(irppGeKefEQvz%=G$rRcG8b` z2nxf0lEQeTe*rYS70yI(chDW`;5TVO=rFI%d`}Q|4f_<~LM`27{kSIBAxHNd_;gvfSDG^>MTpBl)*j z_%EA|L?l0(dCQd}ri%${GaarKJo|RDp%A10nW4blHP_Wc?88y`2LG+-0pmUhWFQqJf*ncpUphjQ05yWs#}PC7h@fm!M)7e zCX)LdV7DOsd6;M&%!x;cHwyv3iPt_R2+jV;Oi=eZ!VbQ65|l5HevzI)7N#xCl z|B;Yb&EE-SO$hWZ=>tbm7$mTa%r1Zp$GeHmMxy;2S!w@60F;kE!iX@#6Xf@JA}e9n zzlnaKD99(s8$mRV#f>15g%WiICBvENMkdfbAKA4ZJ|>8(&Svgr8LRUMVqK7>{aR+=k68Ix!a)=NMfeZL zx!X$#pX_ya67UUza|L|g&<~N!KbiS4CLcL{U`pzwqyo?L20>8+K+JgQ(O9C*vNe&Q zL`r>zz^t~LO-5oFK1yu=m|>il$tlcUquo7&f&UKj?!j#O3_=}*_=vGPTST~!;5-5O zQjI%_<$Og2-8Dk;p=0|=@zgB4k=bV~*K@>%Ze=B7h_?~+Nb_sbtalrQ?UT&-W>=h_ zB1?UaS<96`_HDp{zmDUMDb|2s5-}5OEcm{Uk>zD#M@NiC;6?(7BzWGHFk(6izZ`I2 zrhN1gQN3aM5Hg|yzP@E29YjX2FoOxsnm!&K5{iug;0{de^nGUHrk_dPvXF_yr(@w7 z202Y)B>c^72+(5OEMJNX0$To3w^8c7B)J)8>zLT>e&(^}f(09YklDL5SV-vpTV^rn zEP9M^Fc0|jto_TV)}Mn~h}}rZH=yhnBI|gU*_c~tHWAiPR_; zMAtDj8ksxNh~G+BLXw$;jy3E5UW9|Nmp|x*0g)Jik9b04nPf)-cE^cgdk6}0JqeBp z#_5~P>=nvz26HjPhd-VfL<|=at%DfzGU6+Q=k>&g`-)qck#PGyLV+}VCN<#l2+??G zOR7H2%yHOcN&Nhp$ysI$=keh`(GVZuv}+M&Wz<{V-i^V-O{jh{h+X@kQUpR9<8zSaV(>{ONJ-PVCC7$ONm;I|Szv`5!}VRvf#+TE6u8L8{i-i=Xd?Vt_)*& z6!f;k$%4 zyE)Mw-)MzS+DN2ZOaWoMr5)iN!kgS3iO17e${i(D@ibO3;NuIh0ZYE7YD^|S0u-ln z2V?@9eVKpsI1~Hw*>L;kn_bz=Z(s&zZo9FK&CJYm#ZmG-NXRD>?CXTzJkD)$#HW0V z*|TWEqMg&3ee2k;^ekr2hC?u=-(z;OaflZJ4(#^-wRa^@mKN2yrh7IvF-L+6M`?D3 zVS1*AVHQAi_8DMin&}=0qPDN!`(O8?U%&Tw%gi(gNH`i!6eQw;N*EPXBBI8`pc0pJ zA`sDt@hHZSxE+@$xFp6Ci3|C@TXpNN`u{gGuN^r_&awLZ{i^Q0wO8G`b?g51zms0! zwvPyq*+1@K|KVY@dhh?mHQ-Zor0)F)yCi6RixM6t@S{`sb3*uW479CI^?3S^bg@qs zgv4D$FXoCX@k$2!t!{S}{Eii#NANAzS+Qmd;nKk)1Vi?)Be6)h9a1fNWsuW6zyBtk zHv1U*g>h@a2T3KRxQ{+7lYN;a5L^ZR9Z&HDea8xL;c1}gvm^32`oATD^NH{}iD5CJ zbLO2S6L7MY6!!HHyUj*Qj*E)IR*$6qU<@4#4Rrf^tmM|8-k!4{M^qoK$joy)}T_ta10NQOL zUQZIc<$5E%0(`pwiN3?b-tA#`d)Nm(?86@RF%P5VyiM-`596E37RL96?IQZ9hyAOE zecQthKLdq*&vj0?dI3Ui{+&#(Y#SHRcPfj!fj$u-F7VhJ;6p>p3jbO{PnIU-D>VII zxz;Yk_cQR}Id+ae%)pF|@CEu8SonX_4;30Sdj4W0WcBoXxd9KBQ*{=ynF4YttLG2pMc8 zl3S7)f)}`+nU`-8aqt+0=Wggjs#b` zZ6{wm>c7t^-R@!F^KN|cRU>BnVs_l$BH-HgQ-o_Xewu*?T@1c@)PIAo-xnEtl^0d` z9#a3SJeGI2_Fvxzm67nD?=V=lT;NIi-QJ~diLU`a25M_CA3hYpGJU?o)c+=*?z0$t z0_O`hUB1TD|3;4;VDLv&%{~*-#5Is9=GreC&eHg=owV958c$6xrMFaQ7mSI|V_ELe zL1Z^~-U5-Ksth=#*t_9J0bVKvxJ3L}ld_(z50~nJGz=P?8G$02n)nv&L$ zzrlkX%?dmWLrW%Z$c5Ls@MibRAIACp^Ypht(Bu$$tmCh?z2bQ&dBp-_Zo>1tg$hmS z>C^c1^T1K*??4=NJmBEz1&=IVghw5o+7$B?ozlr;d28Xb=;3}i^W|N zw@B(H;JF9Sy?8bvqfK~dbZ~PYu1m&q5B#(!_!%Br0`T%yp7rydRvxEs!qYws*6BwX z!_x)cShybJfcFA^4i7K%ZS%GZ zDnWUF19k43*dBxSmLqNv_act$V$mMrzPs*lXHO0TA~c5d%3Sj!WA+81z9@tjR)1TZ z%T@R){c$?K$NKh1i~oOb4YJFpr+*J6C|N7TR@q8%tjky_wty$z7$DQ3wiR1nb=RVd)mV}Ob1j-o!XTVLC zg4z!@?xSqnIORXfq#XC)+g&!y8>==hfph>V)tg;_?M-Z)^1TiVae-K@>JA`rv)H&s z-vepBz8AQZ`u5Q`VnfK4zRMjhk{vSbl+80PFJ(2lm*Y87B$Qj_@{C&{t69gMpd?2( ziKjQJeq1vVRlVa9WJMQ<)-2W*Xfme7#XZo| z8t8hY@bL<{*U@6sbSeBb4vWo97c85T4qFtdO%1psqD!b+#Lk5gWDl*M+BOG7}qwAJaOY?5y&+VRmTtsO~=V=b;{ zHk6r2kC9KoxpYmu<+?1!A};BaF~lq6-mbJP3Y%f>K6VncJPaWn`l#cxIC#X7k$)ga zM^>{CNnI4(`|;#km-eD`+DLQuF|CX6kT$LwwOMpm;mN1;bBEP=5;rh4V06F2!?^Ki z$ztQU)SAU}>_8#O2LISF*_d&z55dNcu6v1j|2mzvOrLb*serKj@g9z*dvx9T@|PW! z!Up1IM3GNG7f7evCmzI#b&^0vqW%XLmlKnviu>!^zy>XqSuKdA)7r=RKEr8~KMRU{ znSbiylGkM=rVuyJJQJ6xM@v5w4ht1`iDs*Xim_CC(`lEOeXRIb@Z>AcTmI=jhiCuT zw{*pZ`B-u07%u@+oasO5n5a%C2X)Fe2Q3llw9E(EAgKy}o6yJ7?)@$u{$%r*4>dlW z=5e5%2+j5Ay0QUjw=&eH0~S4>dq;~-V&5B$DuwOWSUQyI&r#PcoyR0 zu|L8Z8}A8^WoZR#$7;+yXev&pjT6riYSiiE4rx>>j>~fox?f_%qGXwcpyjZdvSszF zL7yLRv>&GfD-&$YKW3BCm`h1{bX?*C=cDyeJ{8BMEjyjcW^?z!gv|`ux@R_b4|7F> zb9K*fp8s+wDNl=cLbOGv(;*mho_9H{lPfZ9-W!%%pnQKlLGc5Q8;U%Z?>5kBZ^q+< zCoOcJ0NVC$z{E1OSK9kf4ARC*glx#BYu77{`E{^+#*8PCVwbrdiF=Rceso9S$=8l2 zYIH0$v2n_ucUbL_Is5(&-UsklTKf1=aF!`<7oOnJJp!DCBE934wRvp~9-b`%iO#xsQmf^;#h3aN+3i_mG7R?B}>gr&V79VZw2={5Mh z5fAg6zwg)ZJ>^3s43eAO7>oD$SG!a&uwBi_?auWfc*L=uv=O8uD`3yWv;6SW1*ts1 zJR>UYE{An|${ZG9Y3xR)trCyOpT#L>_=n!(+C46%cN>#|F3(Y{(T(3I+~A;V*WK^B1xUKCdS_F(&bpo&b?l6 zQ)qsVlZ^L$6uUKqD+Gp|T9L`{mjOt0#Fgh1EGgfHeMW=lh^F11T z(OrSZj%EqsA4lPVvG>OLW@aBvw&=Q-iiTJF$I|d>|5(~F(6MjxbK}P+2~yYL46mUr z1f3g|nen}MK#&IS07z@ZZI#8wGly><&}lo{(a)mVc7-jkIm4wJ^94=!4-l2K*)J%w|r-S&czMJBcXqe zhqX-G)_iSL?JRJC53l_hI0K$ev3>P5atqKv98%=Aq&-M=+s(; zaxyqvm+N279Vjf%fl!QrGn)1;qQPci&nSu&=W)pCXn~@_o;z@1rB)iyoEeC-?U7m& zpHA9^fez}qI!-2pC$)BS#@L(N#u~T+3)fUl*LNplrAiZ5G1UcGndW^oNlEVS8Ee%F zjn*V?n`+>C>PoU_Xut7z-H$~UVdL2TEfUSe)7yUJs+;xo#*9%2F5M|2Sn5nq&zPxX z#m`OZ^=EQDO!i|-#ms_|I3B6n-;9xzQ(sm3k9BL~sZA z6xZ?ErA32fw4k6WwMGZ`;}vG=_~F$_{0*-W18K9>Hq*Rbu3f3kOw`9{AZto^Fl8$f zwFJ|B62s7ET^MIbrg06|%*mBSsC_`;?o1kqfVhsZVIk5~>v^MHOu_j<%UlbsS4)_8 z0U&I~La~@M+PyZUqvnl|z82Gk=G0CCI9$=jxB|>b5sQV|dI@m`r)|JMT<7(jW)suc zGz#+5Oj@04ntrRAB#qGuF2UMq5jxkK_2QV^T6pkL&`4={d17Wz^L8}{(*bQkIvm*F zyK1C?=c1(CHuZA3mDnm{s_jTam+*o&7jA;W&M)6sZq{z)%~zOp?fUj)&pMfc7+bBj z^J>11+Cg2t%O&zHbbWhl0vQ~<^0^2pS1aS@wOOPj>@^cd53;-$F>Pb)2OY=RmrRp2qQ=`xZJJMtk=du#KBsmTO3IYmxc$ON(`lv*` z4H+$qrIrL>MqjE=_t>lvaZm})pB|I2weS(LQ=(EUG-pOI{xb-I!2TdxbwRF^Sex^) z2r4&|#Brh><5%z&M@<^zu{b4c)*+OE;{M5Ev(ji+(A6FMaW+bAb%GM4sdSIzqu@^F zDPf-ZD7b{L*3KvHqxz|rLhPLIVcgz1iQ7eeSW;~6DOU@aDIQvGwKEXh(mB;>WPr_j z29OQ6I^)uN8M0O-188Oetx|@f>;YUu8trCUSZ!j6c`1;?1-&)hNI?*KYFLU7*bN89 zx{;`TE3FLrVdla83~Bodwbh%`m!7(-C$BD$s$5LIfp z&@_$1g^^dBrjR|8Nv#-!Ay8GqaG?~3rP`HJngGh{hf1*m5xa@Q-gdLFGl367QzkJ)Bytzy zrmz8X8MBbCt*5Ait&)@*(l&Qlv|P&AtXW7?J&=7Js5U+WdEC_2$q$*m^=UQGR>cnP zqD{6yyk2YD5%jLGvE;+<7FN?kZ|^^*tQ4$|3SqNJwtKv2Lt=&XorT&2>Y>$~D6&7L zW3ef~GKn6NTZP%_vNH^6x5;g}DI^nYIIe6if0_C?DWzqH+f9Sk=MO75R!S`At2cdF zoOsK<-bM97X_H*)n#FF#b-1{;xM?r}@!#K_JqQLQTf~h5Cx1+J9wLPY2%W@PxZl@u z&)kJR1*iFzD!VHsN1P62GJ6dD9tH$@PKmWxs2X#Eh*8^sH1gZfhE?{27%Pg5V3So# znu`Xxr`_6eN+Gwui8VzQn1QuyeBbC3#VB15=V)*G?GIS!r~q_S`TKc&1gqFW9IfM3 zNwYrQDVGVdw?q$OM~y3co9kj|t=_I+NS21H&<{*v2q8w;&KRfT0_uTPU_WW8EqmQ= z1LTsv5YZls^WI~|DR*yb)~6$=D|EV_Wfe>-xe}kk0K=}7XIc$Y#M5Z_lth3WtvAf+ zXT&?-i+P>>BIxo0+CA9r<_IT>8?a_B8f@WOaG$Izx(`o4(L(O!0Tt|7V?b+1O#nqu zwdjvW1Xx)rLm$A97Js|3o)?}w$s_&`wFxX>y?Rfl}cFnk5 zhA&0B4vz$Kl1ICiAFgA!4vE{t$2*m3>5`<`A`oI>5!-qA?23nb?I|cY`Q681JC3B_ za+;dUW&5R&+}a82XeD}T7V8ZG9BkkT%NJVA0({#-#1-77U4!Onk5wl!z_m$88Nk#K ziUw}QFJO~I7?v}Ul<3Eb=KY-Ol;)^gx`=eF2t7!IKRV?cTM?3Gkw4Rz$EL`CxOICv zOSrL`Oq=m~z3Q8(!K=e-Rc!>Yu69yo@L)}#lQko1y_eQedZaZo z?O+G1Xofr;E9CLBNh6?76PZl{VI|P~tt4Tc4px4p6lvcG%k%A))U2$>aguxCYQ&;){Ox11w7rFpfWn;{ndJHVu1f* z5JFhBsxvs+f!ynM24j^PF4za_0#FMe^UE%kkfEH%iZWrq`DOPr#rW-l6lC`pX1uad z@!NF{D=J%xKT%GVb_%G}%6`b>TLEMBS^}kJ4(2uKIBrI z5}$8X34xn+67hLGJ5xY|do?@5nkkCL^C0j*3G zp9h$E(v&ISL9&=y5GP$yBGdT7ajTKfSkzSZNjR8oyf z-B7P_9c{|@#tVpwpsKMlr!Ve&+Co)yQJ`qUxHpms3ayR!l}Z#y7UH%Pej~C0{4B>e zI0Y6B@)&749ZBg#S%-p-VkSWq3=zx^wGvmqO#<4GdPBJoYa=5Ze6gkugynA$?D6rEha#Xxj;~YD;6alOB)N0kenSzA=01%@WY1=8p2E^fs`_ z)=S1}H%u8PkR^jfvy>TjG){=eoIqT++I)#Fd9( zup{osLKO5s3ew^fCtf_1Ncjg>5 z#6}VmGOeV+0ZU!gf5?q zzGyk?B*PNB4_Pj?gNyA$ z>53nvtU;t44>X~rWL>jUxuUjm1wOge1%B3Yg%8Rn|0D#95Tj=?s%cOygCI6wC};L` zRttr(y>{o$wU>>JY<`Mb;%t2j{^z~KY6i~~a}2bT>F z4V*sNZZ}%zEL}Q*FB0ODmFUc+NsA&HPQ8~_tGlO{zy^s{1p_OS^756d*POMoP+nOo zuUfULJhbxc)yr2U#p0S(g;hhV#@C!(UQ;eEf|cnRN4q<`8l7=UhArIZ2_xN`VE%d( z>{n@iA88A2P=M1IdE?A4I#gOOGC)-$uxxg4#)7c^&{IlPD5Z$tIe5d2>HD* z4I#hnX$bj^r6J_kNJGf)`ZR?6-jIfn-<=v7vrE&bqVP`hNE9A1--yDa=9f`;mpKAM zNophMU1E-l!k3!G8upUG<_O|BV=)4I?s%PoVe3{iulFHZ8tn5SS)=a{gBP36Y0$3K zkA=aD&Ep!B_3C+Gb`hgHRRNCCJs0yt++?80KAy~@B>QzUq6@fbzv!)E5q<~owymw4!?&9xY=fL++7<#CrFMoB%0^P0wV?e^ z54YRZs}JSH1N4ZNEP4mR9I1%R>GpFJ-tC2glNISoMrH1R)aV*>pW?JOs*h@5SjP2K z%=;DdJE-U%>gd+&ZDYPh!K@CC0p6eh7rp~wje>DHVlDU|Qz~!mkecg%-{V}duQ5MU zkcYe!lS?YCX{Yfop0DlUsIA&%z!s?M`yf+3iY6zDmpuxOpx;zz&&hAa8;Vh3MRmSW zj6~k6INuThav|Psw_V#UuWQUPitmmdP_&kR)SHwv73H%{agQC9c3EH|A>WPzS1_01 z=`#{0Z@JAV_=(++}^lAfnwI(0v%5Dz8kPwSgIEXWM1i%87 zHZ8M~JjrQ*d9KCFfHj=88lb3=!CB45?Rf+a&}gsnK!DkgjY2^ghEC0C1-OoR2f~^y zey^nAhj|!0LxJ7QUVakb<70uR0!(E8a5PzfYYK8Ss+iD)5W7zaFsZ_8LjXqaUZHXy zFOM9tFij~%s(I&eA(ooYPBm%DiNWF!!xvBN>Dakl!T!A9@&Fwi#r+lLz4f-2md!mK0zvyX=TGyYR@lo`u8I<8>j- z8fckE16X>3|Kk9P453qb@sVjhp*?9chO6ntodLKdW>1d;vR`wKA+X9klA3=S!`8ZD z)o|`l$!7huu*Ocj_FG}XNDRJ>;2~aJIuHN@&HQ8lM!)jSy|)D*Z;N#vE=S6j8si>^ zd#~+|(^JSF0<8sfzjjO3u^+qDHwGjXwfcG}0J0zDwXMT&4~ixho4lPHV3fRN zegbH|LjEY{e7yCaM|%x^ZNKR4P{Nxx#puWwF>B=b7-+TNXisP2vk;fYC{&cD?ug*B zEL_f{c!^j+?qz&TAza@U7^}IX z##_lpELqa@8dE9_Wh>4|P?4VkX)sopx?_Kz$Z&jpBGj3-sCyab_0wG!x1NbQuUszTWTNPcHD0jLv@zlh2!f$piVM?0|PFavna zv6k9yz^qE;1C%q}`|atrl=<_fpmgU%$m@|ty4|@C5KYm|Df3d-Rc3~zaq@yY-PKo{ zzLH0UZ`9zWrC%I`f^P*xJlgC~csvJ}ae8hbcB^&fZV1ZWxbUM0 zWbzdo8)S81MvC3VH=aiUME)4}?F_mp<{9^7q2`%^!0TTSS(S=Q{h(BL2Z zCY_!w{S*A|2oH_*jWomqz3(BYDcSLkZ6zI6cnnEpk1t0EDPy?P*#WHVP(bgTa~O`1 zN}VE3pZXT^AgTjfo4)?_Lqn#2{hBrANWSR~aX2Y08K3E!CudccKaFQp^X=;ahc6pE zYiMxU5?<1<{b{VK6<)?v$Sfm#O>`DKdXkT7