From ccf019821f107d9e64662dd643ad55ed287f2cd0 Mon Sep 17 00:00:00 2001 From: Volodymyr Shymanskyy Date: Wed, 4 Dec 2019 17:13:16 +0200 Subject: [PATCH] Update wasi test --- test/wasi/README.md | 2 + test/wasi/wasi_printf.c | 86 ++++++++++++++++++++++++++++++++----- test/wasi/wasi_printf.wasm | Bin 31375 -> 25958 bytes 3 files changed, 78 insertions(+), 10 deletions(-) diff --git a/test/wasi/README.md b/test/wasi/README.md index 8f37d45..deb9237 100644 --- a/test/wasi/README.md +++ b/test/wasi/README.md @@ -2,6 +2,8 @@ ```sh wasicc -O3 wasi_printf.c -o wasi_printf.wasm +wasm-opt -O3 wasi_printf.wasm -o wasi_printf.wasm +wasm-strip wasi_printf.wasm ``` ## Run diff --git a/test/wasi/wasi_printf.c b/test/wasi/wasi_printf.c index fccd1cc..5bc173b 100644 --- a/test/wasi/wasi_printf.c +++ b/test/wasi/wasi_printf.c @@ -1,9 +1,15 @@ #include #include +#include #include +/* + * Helpers + */ + #define WASM_EXPORT __attribute__((used)) __attribute__((visibility ("default"))) +static inline struct timespec timespec_diff(struct timespec start, struct timespec end) { struct timespec temp; @@ -17,6 +23,11 @@ struct timespec timespec_diff(struct timespec start, struct timespec end) return temp; } +static inline +int rand_range(int min, int max){ + return min + rand() / (RAND_MAX / (max - min + 1) + 1); +} + WASM_EXPORT uint32_t fib(uint32_t n) { @@ -26,25 +37,80 @@ uint32_t fib(uint32_t n) return fib(n-1) + fib(n-2); } -int main() -{ - struct timespec start, finish; +/* + * Tests + */ - // Chew up some CPU time - volatile int n=38, result; +static char gString[16]; - printf("Calculating fib(%d)...\n", n); +__attribute__((constructor)) +void test_init_some_global() { + static const char data[] = "Constructor OK\n"; + memcpy(gString, data, sizeof(data)); +} +void test_constructor() { + fwrite(gString, 1, sizeof(gString), stdout); +} + +void test_write() { + fwrite("Hello world\n", 1, 12, stdout); +} + +void test_printf() { + printf("Hello %s!\n", "printf"); +} + +void test_random() { + unsigned entropy; + getentropy(&entropy, sizeof(entropy)); + srand(entropy); + int x = rand_range(0, 10); + int y = rand_range(0, 10); + printf("%d + %d = %d\n", x, y, x+y); +} + +void test_gettime() { + struct timespec now; + clock_gettime(CLOCK_REALTIME, &now); + printf("Now: %lld sec, %ld ns\n", now.tv_sec, now.tv_nsec); +} + +void test_fib10() { + volatile uint32_t n = 10, result; + result = fib(n); + printf("fib(%d) = %d\n", n, result); +} + +void test_perf_fib38() { + struct timespec start, finish; + volatile uint32_t n = 38, result; + + printf("fib(%d) = ", n); + fflush(stdout); + + // Chew up some CPU time clock_gettime(CLOCK_REALTIME, &start); result = fib(n); clock_gettime(CLOCK_REALTIME, &finish); struct timespec delta = timespec_diff(start, finish); + unsigned ms = (delta.tv_sec*1000) + (delta.tv_nsec/1000000); + printf("%d [%u ms]\n", result, ms); +} - printf("Finished in: %lu ms\n", (delta.tv_sec*1000) + (delta.tv_nsec/1000000)); - - // TODO: this fails for some reason - //printf("Finished in: %lf ms\n", delta.tv_sec*1000.0 + delta.tv_nsec/1000000.0); +/* + * Main + */ +int main() +{ + test_write(); + test_constructor(); + test_printf(); + test_gettime(); + //test_random(); + test_fib10(); + test_perf_fib38(); return 0; } diff --git a/test/wasi/wasi_printf.wasm b/test/wasi/wasi_printf.wasm index df44dfe9b32b6c571bb5b3b5ee6641c366fca40c..2cde244ed8d904dafafb94cf2ac91e8645d86fad 100755 GIT binary patch literal 25958 zcmd6wdyHJyec#W$cV0VphC9pWa+ea%TrDj!5@kAZB!#x4J(NU>lJ#h8q$!F(TJ0{S zon7vd`=F>s(rywVQIP;O8l#DWHdPD*c2lP{kN|Ot1`&!jF$xD!fE0CKs0z4=f$9$x zDFUNSqJF-=bLX+-Qc_%}2r16od(Z3l`2HT}aYt@$<8tDhOV$rOlWlKrC)<3zvYov0 zOgg;TekR#={G+f!Vf>DjoqNXdxXN8wf19f5OWVmyv4L9Bl^gbM6;wI>Pid?D!raEv z(_5<>n{&^uEbhCs@bs1SMQ%2qer|EorMrs{j1(^{tv|gwcX`pd-E}4wSFbItudP14 zvGjKqH}>i!@7LI4gne`C&u!egX~T;5YB#^KHoyGz=F;Uw8#3EX)Yz5vwfUzPuP<%7 z%I=ajEL~c-6~hfm>3L((Rd+Y5Q?RkPxa?}XpR2(O>r0!9uAbfbp+>baR;{%6RVt0N zI$o`gH}h(eR9&O$I?h$AZeoABzg4LwSCVSAnk6o+HPCW+>z`Ee`q8X*dGYev`irTn zJq>~Do352zT6)&C$C`-?NnSaANB30oU;J9~p+8NN%Jv;Dbe4-`#&r&dtn1R*Y}PxU zbX<{!#$)XyolR$b8j|IGjV%62T<(+8&OKb2^~uS!5|Uo0Q=|{KGa9D$sFP5Zb|zYt zynNCN?yPgF&^e-#c9wgn=@qGW7k%1w54V#%*I*2n_$0J?owV)3myWAL7t+m8VVHYU zXgis<7?2h!rch&-Bda1qQ7smE*U2bTckonc(=)9L2YG`&yVj-abh^;;a69#M$CdSB z1XtT>9=Wp_?XU03)C85)sapQUTUDrA2`d`p7yg7y( zLi(i9u-)slxqF4L-Z&!3e=?Do_6j$nsvo*HJq97}WP0r0v=jcY!Lv@Ub2R+I zG~9Qlrno=T>l`TSblUf(lRWbF=v3ytJC&Vzxtpci>f>aQ=eFO@!bK5U&=d&+{Z`D`e?~PYKak+OddjGEw(mBdVv&%Cs|M?_I zg{DY$_)H_TB7sHHxpPV~>!5-=MeLUv_ohDlBk=)|>fvNb{;BNbeOV`tdj>YbKkqY3 zrRKfq$yjt!Jbt{qj^sh;$3@id7*U;l)E8O7<-d7Pl9w>gXIzBXji1zhJ9)e^8@?iu z7FB3<;Xp53xypBbak{95>{{Wj6-mghBDN$Xl&ptj12f4si%NKFx~G;&X!N=aB3v|z z%vZuUrh7%@ymjrX;T500a21M?a(F{yP5Fw??oAt>y7#6nlf8PR+jaPnDtc&)?l3ex zX;G&ZzG`$f9v7l3v*~OAv1)`JEU(kZZC)*4-n-?iVH+U9M(bMW@K8KduZ70df+nh( z!dOVJh04_;Sx2Uc?vraFz2QC?++(#OF&i)~UO|ZQn(gMbsP5)A^H?W364T<=akafe?wVK;G6zKKkmemC{tV1?JEIn-ooj;{fK} zci*kk9FIcD&R;yx3mwBXh5(OY=dI)RM7YK@d>VFk#_b8nM%d%mB%*bnt}hGln_dJR z>RrRM*Tb=1Uerfak_t_(E4yW67mmV8a&4K<zmLG?-)GR zj9gHg-TzgX{7@EM^k~q_W=FvXw-+IjFP}`qD0J!qnxy@-vhC9<^cmB6;f$9|fx8l& z8OoNlz{(^@%5>2xk|9XB$H|O<6ktbBBJ*vHfm&e?`IjJ#sFPF-hN(cBcA)_WIH<^o z24OTX0BJRXw2_xy7WYH2E?taEXHf~BDGeP9;qpxwUGz=z8aNdvFM@+ZIX=OY#jDcA z2|^k*`a4w+TnGN0rZzrZ**BHVN6Kjar8y#oe++uQW;Ym#k|-mIs3adsHMulLjT?p@ z>B@C!Ns@wDr`zE*+xOAM&mKRwv-9fC&dwW7x33-dIk^<38ou!> z|L#|+8ye;x9*+dSeS7@g*{S3OQ42W|jf%P=O-;e|_2Yq{?%*Vy4d1#wY6`n}%PtXO zuOJRSMl%A$DR)qx!fSu}cXL3qeIelDcSMfwRrOe8@Nee#h zIq5FCd|O%x6$MYS_O z97+%v5~lFyy>4pe zRmS02eIqSXg)@9bl_W4R;6k&xT}BBrGRmk+i3r{l25Cz`bh%=RDTyzsJF>8+q~#>~ z*c>e{Wl{tdd{uFhd&OJvO;Se`?~`&2T*gGUApSZ@0XS04SKA56 zUCi%>(;%3uhfX-?>vZdr^B7#LEd=2)>zd2LqB4kC?qR2cIH)seQaD&JTNiByOG_P; z`7!1N-swvwt4=E673N+_O-h~NJ4?m$9aZF{8-jD3SU6&1oDve?J!xdppH|=pZCYU& zp9oFjN6wo)@>t8qq?!4uuq#1s7()PG$wrkb&a-AMYCK0lPV z#0WSc|3x6=ziG^WEq!v`1n4AEyv<0Q9Ck`#iyo-G33z~LndKHW;87&P5i>gh#OA@} zaFUy(D93m!Z;OwRx5cFlysd;0-5Mb{3-|e~^bJ|KXkNM(f?D8>05jA2G~A(t=>|_J zSofU;ly`dJ+qa)el>l+~PP}aJjJpP&_U1rS1{KO@Kp#SJ0U%5H6+Dj5E{bi4P`HPh zAu^4$<-$@&aS$iGS&2>NyWc4`@%KU_;Y8RZKha%1%9wPZ9uZP!-eV}uMp4S}w?OH4 zI@2OT?n0>q&ZFo!2Ji$kTGXhN@RS4rE&{Wh1QkxQsHc|oK3C#V*-d5$#k4`FiwMOq z09=XC{v<7v0$fBWwKuycc!*G&?;1i)dJ4sih((nnN`MllY(ldWTH7LyRySlT%xqvx zh~`TUAuf3|01YvZWD7FX2q383bVHvEVvaRxNy=hKRv`w-KgmIvED_)Y=f7O?Z#myE ztxgpbN*4|n$BMolEG&2}=SV2xIx!c{+RH26y>PW)70<~)M;v%22OjI111IoG0`$vz zfjJpOq4hm^mN;XR8_=8{x#Pnl5@IoQRl>NU8DbTu_-5r)G|yy4$`i`4O{~CcG3B5| zX)}WyLAgZfVM;ryeCKv#;YD^t1ZohEptlvnQbTdMYSvR3wVuj%-Fg(XM%O8z;h3*R z3+^kgo1i8$pR_a|h1F<24fF2IMx+|%G?5d&EVTf%c=x?*r)G&?t*}VS@>C_}{rGo$ zaI_vd`nZZQNGjy$G&Um*2b9b-Zkfx-3P?4h6^IaAJ6wr6z9eUwvRa5+lId6;Ggf9D zyC5r*C5r$uW^Di^Lbe$pTLN~>GLEr9#$oQ3wFpDen8vk?Lx9CSM8Hx<83!0009NY_ zeZX2VfK4M{k;87llCa+hSgckPM!cMXn%ffI_=D2T+`Q7Ml?C}RB@;{^loM3@DG8UR z*^!jQ{E^_QU>Y5fLMzm=xXKMu4*BOwbu@YNP2|y$tAPWaPsnr{?yvK|YNCjckcY z;nUrE#%3`+(cVsf&c-0S=4`T>GNv<0FXwDbPUI?VBqXPyZ4wuU)|m9DupWa=lys~Z zlUoa{gI&+S(%hR0Y_?fxPKYG;+qZW!oG#v*6j8B>MmShi);eCEe=^}X%B=Ra!{kbl z=xZHm6K&WPVqubhldImHpU&BYjzqpIgN<&A7%G2)y8`~50TD> zw;POnPF}Rp>(sOY!D6&c08FSpIhC=;d(QUFcZv!}1H>oOZF};{%RfkzrLlr(UZ<>6 zclkWK-2JTrbNRWc+E4XS7sixbXw3|tVR9I!z z3(-IqVtLfY2pzGEZ>B|Oe}Vf)lWNnM$io-nnmtj4$*~s#DW6z8kVGNdSg)@Y_Z4;CfJ+ZgcPM( zvNoRUqlNN1cTd@UX9C`V76sOx27Y zwu_?16xB35syUT)?#m2zr?N>MH4x$a!_U^lcua&UoJ$}9s^#}OX^IR!Q+{JY*H`D- ztPr`afKhHwgl!xLC7a`DpbIV|kW#vdSq9KZI>)drgTpVSNd|1SWc`hk$h806nd-7~ z`sS(l$i6#3d0kJx9Cs=zvk?sk1&K)s7{Ld~I+^+j=cdRE?V!g&w8P%0;0tI(;GcR|#Ol##I*|EjR3vam^Na5C=aWEofwLD+3iK4Gj(6 z4A*gJe9H$L`qhN9N#Se8vF*Kn?RfagarDS%S5sE=TSERj4Vg3Dhu>o>g9oJA3D??m z(TX(dQPA_on9UpXon#=FCb25wF8CUrQt?T6|4=g5gcJcGB=Vr>AZU?g{As)}3g*n}sh3 z5V!_=1X)k(z(^k5M)<4>1)I;Fqz4IP=cIYm@a;Q|qVO5j=vMgdyDEx!q$T-n2I-t= zCsR2Wd()zGKNV#EtviLP@S1uPtTdpFN569QBjd*Be`e&fqe4TKJ2K0BO8ppPFygN& zP$6CfDxdhf4`;XGa?_U(@jGm(j$tfg;Z2tC8tdKLxxBB}Js$qq%YJOR>&ud{_3kv6 zpJ8938y|I#@_m1=dnh$fq-eLxlu^^}ckBMZ@}uat>JRj~2ULOL2Ffq0G9$aCCP!Op z*ikKM3^V78 z+B8EZe#&!Uh1}Gpdv`n6)!bv7n;d86x-CY{!!t66;|eQ@EntVg`v3uoBa>%8Pwr`%xxO&hK09 z?(?m%^M->DdQ(d{FGXm|YsSY(HcRZ9ZaN^5Q-nkr!>U zJ>=Dd+is%9nh)PBt0vgf7zQgsry`_d7?Y7UQ;-klz7dXJ>qau9ZP?P#9aIIcNw*F0 z0xn-op9l=%#5YIf(F`V!PS1Bn<-tZe?R_2Y=u|$Jsd0{qt$&k{Cd^fyf@q!e(Sd*; zc&sg0l%$+pVQDVx9PS}E3b(O)lWdhk8!}CyD@+44EK})@Hqin0BOsIYK!Gc+ER7M_ zwVl?p^O^UXN+g&u$={r%>mJZCCiw|0Dec^zgO_*T{W0v`w<2_|PIt%4L6uI)6sovh zs#mqs%M_f;`gAc-vT`3LW%Vtci{5$U-pDrwI68aZM0&lgeDnqZ#F8%)#9FuY?>?5e*0KH#2X4Jajx=OQJix> zgu_wSc&yAidy4OgP}!pUUbhp{Zc{#j?)pO!8+Y|wzZ%YzU1ozWM<|S)r=CvaxRGCv z>l!AXYegwCaBll=!ot`&2z$9G?#u26{Nhjm8xK1jj*ZxpKh~4*twR*?933_B#T{T! zaExYWr}JrgDY|!lP4~N zLlcS)U-m`PL?qVo77HIXv@0|H6#8t zN_Qd{L0(bq+{1EcV>y~xot4E1A>7y}36XT`>k!s1`vZC8G4xe6H7Vz4m83E6(iL-n zd(->Pqv<-1T=fmjU67w`K(g_XAb~L)r>}QDj0bg(6ip<7Gvl-jHjYK%iX{N-4j;yu zc*`rBZ9)RFdZcX;5fr?^NkcUyyl7fC#sTEub+?Si-AVDEJL$!uKHWL3oLG@oroiZR zFw1HogLEt)gF&4`vJPnHNE56@7Z;{RMN4(-VdoVk3GXIQi9aKA!9yokyB*2Arqyiq z;7RC}XE2U{gTQJ6kA(}(!-lMDJ(?&CgWh3@3?#Z@dF%t7Aq$RQ_^KSW#XR^X*WQzB zLUJnSx{K?^&0M$Mn`@)w*kmq zxYZdL1Uhf)=t1s&AR@$dmSl2jNkT zBq$xh5;@ewy>r z(|*R!JUbn-0o0;746*Uol4Ud@Z5TGN7D3_dwAcAa0XMG~Go?D6dsb#3FZOmyz!F$2 zj;*7&|7J`1lVPlf#1z}`_+{dqBlpnq`LY~q9yW1kWshfOyC<;0K3>kue!hDGS3(kn zVLgebljrs=+2CnqKPUXmFZvU|{5r4{9%uZC*SYP^7~0y4^oqm6KUtElySZ9~(W z($Z_3fC;~!D(|sCQ6C8uq*XSXQM{tF!DAtCMFbeGG_?Nxjz`vbtQeguTt!X z-SM7cwW@^E;V#Ccds^QOV zhS>H;{r=@*0ydX@uH+KmPb0is9I9w?>B$Nnnf6VePZtM=7LCi#_qJ&)AeGVM{NB^1 z$3K`&clNO94$hB|j`JHAE{4u;ymWpeZoK8&1LKs?E74~U?edIFVOOMjPqI57jBFy+ zO|IzuBGvBb0~V2bKZG6R?F-BO6<>61x~si=g|#aVTh| z1byzUndsjkHdcg(KcKN}9RedF3qj|7AaT*sf7T!T`-RKgE z{TATsasj1HzZ2#M*Unv1Je&EaatF*?_4*A?g-oN4ud97E`hmsY`@Qh_QKyU*WB;6T z(0gonFTcNA6ODW+!3nqN-y_o&eCsUwvm#w1Yw?X=?cQ2vem{fW z@l!7qg>rSh3Ae-iW3Z6#@FTGcUQ!@2j#)TCmWMcPDAsJ3B^0l-`LVKQ;bd539i`Z$ z_9!+@i}99tElQaMvDW9?;b!OL z=bP7<5N-SBCiDL8Vcb87S`<8SPQ(;PsG~&`f7lN_jckeo@oEuXugXRo(#kde;$ zz!Caj1-{QpvyXuNv}%PvVv~h#@SB>H^Oqyb>6XtGTg55%s-yQ7uEYi%(@=H7*b2h1 zWSpf26cm~^H`Jm61A7jFNfE@N`#bZMFo`! z96fn_<-X8DN+$UoKJQzW(R;MHikKTK%OnC8ppKBOkvo;RpM8*wv!#~_bU?@8#X>c` z#7!w}t0(zGiRF>1o0sk0dZ2s4WWn2cM*u#?B`RVQn*@$)m z{G?peX?gtC-FhApj_nWI7ryr5ql4gnuVq;Pjz*ga{;Wj{wQ?**rOb3W0|MN!q_$^hPa;S zbtkM@(E*ubcG~4|Oz7e<7~TqW;JV79S@X&Oytb6dGlNahxI!h+3&TTb0w(gsby<$( zYJeEAGgo9ziM6>$MONEav3)JzF@|a&N9=3QN|w{Wk!3aUbqyMH){7(4%8uH=++FC& zs#?gS9Q#6Xn*`He>TI!EuEVj?I}~*5a;Qh;CU`({$w|7ZC6|DpT)ZjMN-Y!aT7O_+ z)tEl&8(5aiN)5_|b)}P}T~#LgGAQbXR4xK3LZ40eNHLH33F;|Tv$jDwrY7i?V;=R# z`T@Q;r(oFNVc-IzaC^mp+QJ- zpyu~KHq8=JE1Tu9xkOD~!LA~+zQ9e*-~It7BN(*j?Oti1;aj!~6H{``oQ@1SRhydN z3@leS?-HjSdXs^aShfVhVzqo!##N80FPE9Jd6kym&k-ld{D@4v%$_mopPR-{^ixoL zhO*C=&xuKpfe-34TeG#tIH1I#g}L4Htuals?Cpt?V!b7GYhG?3xJ^31KjtAu4A(F8 z3Zq9Mgg^vQwlG5pL~3!zQslPKt&jJai?lyjQs3Aksc*0@+ctFDc0-NdOt8`MJE9e3 zASB$X3=h3PtUpXv<7)y7GSm`D1dQRuqKsy)-yn@FU5r9--^FOoNl>wsPL?d?I+$|z)0i!_E7=(xz zrJ=T3`$W6RtHOAqxIdvK_-ad=wsCb?+n40*_9!{+*xW65tIAi@*rl9`4($M&QFaDb zC#UQHJMVF^%IuxCmjb5=b?iZ#zIx8?S$xhB6djJ~Kj+v~e9kd3J0oA#XSE?d=Rmto z)b;D1>_6w784iC8o}cMI=Xk0eh%WnKyDRp?;a`r24C=EiY|r&{rr>u=0zyf7$s9$n zxu#uNyoa`2*>^oj(nub~7Ftcq`hi~|aq%q+y`38SS1G$Y1Zq}NFmM*gSkf;8F)5}( zag$KYve7>N?$>(1XJ_1{yCO5CPf*j`mZvw?Wk%pXTsm*D(sskrdD|lMEtk&8Hr1$@ z++z`WlAPy*z+ahC2R8bVU=W!{$vzXw-ZP=tgY1}4yf4}9J;-iD_DDi81pkmiR56g} z8CG;}l``zH74bfVDV>!(Z?zTiUWE1CiR4KZT$*a>N)l!TfS`<*+Q*f-mm<$m)2@{+p=x@oE z&)Jrps5i#y4aer}SYwQa32D=4FM2i`E|6#*Td)I<{MzQ0XOtJ>eGd=>u7S|IDf}cK8vQjWT?Z1WR9Fp zB)0mBCL|4NZ1;qmrowC4Tc$-QB4gQW!66R4Im23!P27pKP{7`=&MJ1nJ3sTlsZyPt zwGw_yL|oZh`$XePe#96QnVk<6wpGOmP7XHyQ2ebfPC8>_c(aO_wq?jcfL9KzhK$8; zvGI#7W_4zzW@$Q+%NWtt80sIS$SxjwrB6=e=;a8$kh7hzSGvNrN(`X-$pX&oa)P7A zx-bK2=1$4|beVQe78PadnPntMO6vzs>r2B^s;2N#%Z?dE%FCP*M1t)s>rjZSn~phf zBx`Cs#y(7;Tb3g^h@iDX3Y$qFC@5zbXI@809+nS2O5@XN?!s`A~0DY#8Su& zJt83JkwOwJv&Blv+GGr9bOW`%`{)1Xh2GV$^W#79>UEv`18j1qioOXiPmgQFtI40h#fHzEPw#9c_>zr#{?`a2_Ul6}-ZGIBHiCoKny6 zBNMQl@zeyvbtQCUT~roVm2ib09e_Z91WSe=%^ejk2lrAlx*pu?$Nm8A;GW+tpgBRI zi~8xX;I&fC^CSp!7nGhNcnO^JW0m=0c)iUi815R}%2^G!^0X{RBjTT$NK*Tbpg8u# zm({ej-B=<17NYr#O7Pm0klczi==gsLg;WQ*(u6oX+NlvzR0l()XB~nKFKb$g6np%> zS0$|U^jlg@Jdh-pGB4&eL9;N;yAcbE5{*qJ&y&~6H%E|YElQA;5{h^UxnG2EYf+dt zwL;FkDP$e)Zly!+D7zt9H$q3UHZmkRy`c}CGQ{R`xC~l!euo0lHDt_W$PYF|#*pC$ zWvnB{I(_PQF-8&ZD))W=zFy{}-&ZO9B z^l9G34n^p(U$l#z-K}=9Gumo5JNs{9M{Xywvj#h|MxAsMPak&fV|}+E%m(+-vL>Y$$0&N?EOuIgu9Jzh1=Iz)Nq&-&waWUX7o1q_l?AmX=$CnbA}lXz zmcBP?D<~|pwQcG z>QMfY_8T9LBHswt_JN4zxpB5x2&C&(aWIQkj0L6Uh1(0^Z=9aUCn_J zo$bFC-r2MHp!Z>amGL<1KWbA6wte#a$CH#FTYkm6-zu_mAARkMum|M%yij=w8EeRL z6V|yoAs}v)nz+k?cOLvag8hh3Ea>rzx%4i=QP@vhw|q3SV+m|+{q)ZEPoC2eDgM0k zz^lK_nlj+~@B615KS7-TY5T!7euH~`YkqTW-9PzQ(>=1dva;r1SX*CN=--^!=r-Mz z^`+I#OYVua7tZ<ed8DR9m!^I`}ke=9)I-ovBaM^#bJ>{hl_hU z_y1u2(T_}iIE?+k#2pWQ@42(p%7;$g+5Vo}zrQ~9$bp$pzU$nlw&v#-H#XeGm6gTk z=2rZ(FK#YE+tsbb)%ivD(Awp>rB%PUzP`5ZerR!HYh}}~u5J4DMg83P;;Q}nI81H& zIlsC2qI+s_{qoYr#?soVUszmST3m2XURhk9+tdTKDmM7gsmoZtDs(`HdGhHWx4Z`MH&q zVJ)6qSzDi5Us`$5Z>`Q@@&@(avL94JX5lN<-r~o-Fu8)XLzmLA)*S0oySH85hfg~SU+t~C= z8xXg?I5+>i5f>H~=xf8HJLubx4tNzLoLb~|jCrf?yRZxM36#d#^_^4w-QP+wH2Z0jWhBu3M@&u#%3vCcrtk}EN;xNFI@pp&^plBxw(ZK zi^c2w^Gn!aA8)GE7ldJN05>-nTPogAQ~iAX=m-OFEueoD;tICtd~JSyYu$Z{ALw5! z4QPJt8kQj>J+%&Q*0whM+6$|TvV>h`Ge3tRuJGvm)@nqF3~A}|m6b)wGMdt5ls$(% zfO0qoWDC(EE@Fk7OP7}DcAX!kzeep(Lb`u`Zo@yji2ODdp@OGRt*>pa&9AML8j}pl zK1=OyzzhFpfrt2?3@oiigD!17$t0&;i#`%x>}%Q9DE zyHP`&d$vy>F6GiCWW8ZtXvol~On4e=J{mj1DxZm};lrV~oLj+~7haSFUs+#!PS!l) z5JsN@DjcMt{`tAp1pxIow$^Zoi`VBD7Z;=!y!O)bYghano)?$HqX*}%%ssobvb4Em z*0TZGOY=)IO)zcVo`Itc*!Pe!v>1prN(}`n#^zK zRa)olV{E@J9iRL+#nsdlQT<;{=KK0LRzBv!pG@Y-L3)|Y4;|4n`xrZD#e7oqt4H(X zunWI=H2++3NYCwK?66hglm9*yp=wdIY4dKmD1Ulo{gjaZ)8?Ard_IOE;B^^?NeApXOyy_K zeB^t-@1x&;?|t|GKsfi{Ll2)nedb5*I`boF_w@e`xsjNo%-sDsNVJ briS07+g~`vt6s5^(|ICxNKWPHGY9`KoBXz{ literal 31375 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