diff --git a/whitepaper/uncommonlisp-whitepaper.pdf b/whitepaper/uncommonlisp-whitepaper.pdf index d33f5c5..dfd15ef 100644 --- a/whitepaper/uncommonlisp-whitepaper.pdf +++ b/whitepaper/uncommonlisp-whitepaper.pdf @@ -3,7 +3,7 @@ 1 0 obj << /F1 2 0 R /F2 4 0 R /F3 5 0 R /F4 6 0 R /F5 10 0 R /F6 14 0 R - /F7 26 0 R + /F7 27 0 R >> endobj 2 0 obj @@ -62,7 +62,7 @@ endobj endobj 11 0 obj << -/Annots [ 7 0 R 8 0 R 9 0 R ] /Contents 115 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Annots [ 7 0 R 8 0 R 9 0 R ] /Contents 117 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /FormXob.d3ecd28ca03f587d6940049748681018 3 0 R >> @@ -74,7 +74,7 @@ endobj endobj 12 0 obj << -/Contents 116 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 118 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -97,7 +97,7 @@ endobj endobj 15 0 obj << -/Contents 117 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 119 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /FormXob.a2c922509fa3b1785bcd08461c0457b3 13 0 R >> @@ -109,7 +109,7 @@ endobj endobj 16 0 obj << -/Contents 118 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 120 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -119,7 +119,7 @@ endobj endobj 17 0 obj << -/Contents 119 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 121 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -129,7 +129,7 @@ endobj endobj 18 0 obj << -/Contents 120 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 122 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -139,7 +139,7 @@ endobj endobj 19 0 obj << -/Contents 121 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 123 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -149,7 +149,7 @@ endobj endobj 20 0 obj << -/Contents 122 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 124 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -191,7 +191,7 @@ Gb"0;!=8`+$j31%en endobj 25 0 obj << -/Contents 123 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 125 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /FormXob.6378944cfcd9d967b8dea9d1fdf81282 21 0 R /FormXob.914f0cd152b732307eb1a2bfb0d863fa 23 0 R >> @@ -203,12 +203,7 @@ endobj endobj 26 0 obj << -/BaseFont /ZapfDingbats /Name /F7 /Subtype /Type1 /Type /Font ->> -endobj -27 0 obj -<< -/Contents 124 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 126 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -216,9 +211,14 @@ endobj /Type /Page >> endobj +27 0 obj +<< +/BaseFont /ZapfDingbats /Name /F7 /Subtype /Type1 /Type /Font +>> +endobj 28 0 obj << -/Contents 125 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 127 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -228,7 +228,7 @@ endobj endobj 29 0 obj << -/Contents 126 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 128 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -238,7 +238,7 @@ endobj endobj 30 0 obj << -/Contents 127 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 129 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -248,7 +248,7 @@ endobj endobj 31 0 obj << -/Contents 128 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 130 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -258,7 +258,7 @@ endobj endobj 32 0 obj << -/Contents 129 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 131 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -270,18 +270,28 @@ endobj << /A << /S /URI /Type /Action /URI (mailto:russell@unturf.com) ->> /Border [ 0 0 0 ] /Rect [ 248.0736 725.8236 334.3536 737.8236 ] /Subtype /Link /Type /Annot +>> /Border [ 0 0 0 ] /Rect [ 248.0736 227.4236 334.3536 239.4236 ] /Subtype /Link /Type /Annot >> endobj 34 0 obj << -/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 1117 /Length 134682 /SMask 35 0 R +/Annots [ 33 0 R ] /Contents 132 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 + /Trans << + +>> /Type /Page +>> +endobj +35 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 1117 /Length 134682 /SMask 36 0 R /Subtype /Image /Type /XObject /Width 949 >> stream Gb"-V"`tI1gW/hpP5kol.BZ)i3%_L.$P]L(O;>;:ga.3l:cu]GmQlcCQJg+VOWm5G6h0.]mo/B9r26#pZe9/[1Mtqs:YfQJ-DMTKiCGVLPI:R7q])!!'GQnT``mAU;Z(Lt>=uBE/$?9>k=*GJmtk!:0s\(sj;n(]XR55s,>O!!$!:@fQK/5iq%d'+tqPpFP=!5(39ld?(PXcNjLN!79!4P:(SAg6MFrq&j&;Se1r&!2-[Zn*.6&jU1_9[r:r.zTVZQhY$/65Mi5cJ2fJ>WzTLCsI!!!!ug3EPfku77.oaW!'Zt\!dn%SZo&onYoWq@YYF6cC?nioJq3fUtS>LET5NL=),pNJ,ZF-P:BQ^M8uGcQW=lAs"aWT!;*+Ia)BhIfsPTsqtBD'ZIZ!Ra3W(MmFnsHVbWKgRk7jQ(GB)cT-mF+80:taI7fbSeZN2i2/CdeRPcTkSihiB-/-"WZh/P8k`PN5m'G$f/&Ui4]p"b.p$,,lWDf_EEKiZA[r:0sSuemJObhV6/I2=VJ0O!t($!>qQcRmR5m+N+kg6$OZ@;au[A@s-cI1.;9,G"tmbPK]?=%?pVZ$D\^Qk+@2bnJ`hHc,];>#JmLrTJqfT4tKi6]hI]k7q,72:mHc'tW>/76+r=sd%:XL9PIGi-5`g(eDRW[3X?fjgBY;^@S:cj'teQ561=LfO6jia"5FpAKsB[rZ+\VS9+!8%hAZ+aZ\O,F`'G4k-#V'RN<86Y<1YHRYf3,t\"N#=E@q7;%RHK?l!g3DDR="e8JGOA^<=BLCm,mFl$*#JL.BG$:+!3dQ`A%a9DFEW",50-f>XAGTWcC?oVL[suU+*Zqq+oHa$QI!u'm?K/$;V"k-nZ#TiA5U0p"g_a]ip,g_\8gQlc_%8u^Nf:CEokHl/V!ct++J8jMQ@oD?lh@fni!,sh[5!C,5+aVH90ge&-!!!#;\T?rVPUVeN@n)o%0&j-7(@`4A!!a,V*,OVQlA

0&j-7(@`4A!!d!05MX1e)jd>Jr,Hl=[+W+t%$CO(S\0&3pRdQO76CbS^k!&XmAfM;*q)(-]_H-9N1RK:lKVR4o.Q>iI,O'-ddgu&Y9I9.oMW(tCtP?#dkfun4gp+ce,?+YORM=]>:>:CVCO?Q&"]_Sre'#f^J!!'e=LrX[=p)K,`Nr)\n/6o9pNQ84sFGj]m?G(SoO1k]0,YXRh6Up1KnUfkariHV=^;6eHh"Y%WZ>HLWobo_[OsFb1[-=sf=;K$1O$5#VgV.a@/j1[cYN_<3nVFG9U*6I&iHNJ7l^5=lfTDa&G&@HsplV9;J%QD)$l>!7mPUd@0J!5N;N*05T_&1VZG0)j#8\]^T)Z1?t5U*W"ThMi)OC_Mjo.9&\jmI-B[W?#k>I@E>f8i7ZZF7iWefq\Knc3tUGg;Cfq2IuJ&/+FGV!2j7F4PmClEofgXo;fV*WlE#1l011/piW!\$^/!99HMlSU)HJ6`_#`cX+5a4NU=ViScM7dYps/'iF"re.34jH6c%Sp*io;1RWc@=M/sTHF+ttCM0"pCUVK7%U/h(72q;5/I2=VNl$\DfYm*t,Vhs;%6O=AI.Cn6c^P.J%1F4@l1"-XUYSPLY<4mro>1'E9DSgN#RDFIo@DaO7GE8O@e9^Z[IKUDVi<$Hlfm/h)g;]/0m[rg1hG'oa0/Q\fIkpD`e>qoKg'm`*U!9o=0a'VW;hsAZPTgXHN.n>O.6*gA#85tNM#c?hnd3cNLhh>nI"[D/C&t+Mg4&[]m?b2%@T$'o_@u%PIRZ1$!t)@<]kZl`rCMa%q!JaQ*Wo..*'V>Q599=?aXZ@Hf0S!l)jV$OU[$8Qj93,aS-;gnh=65\Z4t]r>g*JF'[hEGY3q!%@X?*U;fs5C[B#p2sdT7J[/4YQ;%T.8jjnB\\f)uBnVG""Rdc&Zl7GDqJnm.IAb$-GC+Y/\sr-5;:XB+-]?$l>C@H,dhVp6YaRS;EkA]ZF>b&WZp1)?FNp83I9i6jN1?AdR$B\\+Ju/99j]C99Rp+*Ec?14LS_@cR!pu>kK$nQ.)L+[2R29'YX>JfR>0c@fQKKLi).Vl.;+J.FchiCYuDSeII4%Nfh]mlte]mF/:B954$4cnP+.$aoNGktB(C?',ZB>.9cnJJ0AGLE66/G\J-T@7moINHf9YlHsg;r._&]N%\&]kVa:4'_*"?!!cu&G\m6LA4d2Ge@_'T;0$TD[-BY47GGDd4a8@o&]maXD4DrrK[C/l>lo>LZ_o:Ak,+XuEG1gcZIY2tX(a9o^%oVdUGF*<`DqZDhj$l/>DB8`TioF5Mq?;f`*'[#AbH[%bGROS&"0kQ_2Z7qWp"j2R5meAVk3D4MeL!tNR65bP%%/jiXg2ERG3+nXm?kiPJ\uuap5tKdB?V(?Xu7.C0i5kD@Z"CHErJ.Q31)6Um'ap;rU`Vjj/[<*,-eB$]H#jV@$$)pAVhnK]/_qs1fj@a]bI83&6dT/>8%q%"C@4ZA>6`jCQB!!"tigVdUNY:$[ChIG#E.eb!nmF4ktE;&#AloB*cpE'@ID3*'Zh%StT.?D>"*KQJ@K@Obi7!f`NHLJ,EFRlL:7^Lorn:^N"B2MZVLrU`?fUET5P"S;jk1_7rgG`hYlsO3,KHn=Z7Fo?LJD-:8DJ^9aJD+>^@h,8<,^$>\74[>QV5nG)E@YMJAAEFkNe18BpZt=&tt)?SfjO%ETXnS#EG:AU[0HODr#V>%Z^R^@6rB*r-nHBlr0`#=?2s55Kk?nldDi;Hrck^i.4_ic*sd364%rdL53';e;*fe<$kH,n3:Q>p/8?0+!ZoepaMp"$CIW3.1G[Q3>%!!#d3id6_r<)HqsNJD'mnbCV+2mmQX<:10e0QgDIpMS9>.*ab+CRV(U)Z0X<%l=b]lpkmO^d%@#nnVJ?VGA;HOmY!'DLRT=]+"%Ct[s,`rH*!%H=XPb9#[5NQ85fS#%oRc.8\eDo_:ZX4Qq48B$JoiN,DF1(9kkgZAgDu7i&Ws4KJpfpt%4AdAPL5[l0koegCF1%IEDo^P]j/Crl=-!@^M!'T72D0?4a"nP0o0\iMWdQSBQG&(/h;)ktW>GG[XAlJ#6\"ec"re#qS:Dts^]HqsYg+=rG+4Ku-n^Hc-_R3rM?B*>XM8oSr+B#Y)a-9acNlOUbf[tWI2ef?kj4fAEDLbb\KKE!,rXj@iLat>Wr(h8TS%D=mNL.?i2ijBV>1]R"+d2,-adopOcGJ?;m=peb\r*kd7mYdq?a(X@,YQ=XB)WopBt4!.b"R%LrsX%?5*On^tim&,.+qYM3sMU:&C$nkNN&Tma#L`>(*K\*MgT>#oS@ht%pjDVUpJP$3^_o$uqUhK?SK,YQZXn4A$+psVQ1r'?^1a"cBinJD6+#@dNogr*\AQT`:Il]5@$:Jo<"-0obLRWn&EVeN1i?^CZ5_o&6:[pH>sa,'81f&@FmOt9c,n!gb!hmI+m8lZ9(6eZY=C-4+M^1-*?8Ld]BlJ'%ZFSMlQ2mQ!FZ[/lXH"WjIK8/4YoT.HK='2mki\:E5%YT(C=(Mp4=R+,\3u+eq1V3*9I>3]D@q397OoB'$Xh"tKgQG\,f:\dRf4_X[3='&IGC"tlGfWra6Nr]6"+N.d%.Q`L-9)Wf.oU$_uq[XSls%3@B53FLU2/Vd@*dn8_Hn!p@/\;&c`t&&Vr0G$OjQk6d2f!=9^3o\>U6Y&"N#F'lITj,Vd[eEJX7&+AlgQVBh`kYh$B1!!!uEn^t"eY2XH6X^<`7b0cEFKs_+1*WlE#5`!I(B>f:-M/E/Aa!)A/kCuZ]\4(T"b!<@'W`+'`&n^o:KGROS&dno$YCl*E'I-![W"ouGAKSG46M[0+OlXqmgL(56(pI,!hi\)Tf6m>crih'6J[Z3LPeXEmgT7[T1GROQP*)>VG_83s]TqQeY_Cj'$29TA]m+J^8mtnsj[r:/!PUMY6F1ir1(Pp*3!8%hMMU\Y(V+Qaf3M&E_WqSoOT>/.U\$u*i(GGEPLg;,E!ru^nLrW]A/Jam=GLh*b:@?fAB;nh-*^4t]h@m.1`+&cIlj*(5aP==I%0j`!.SN?!u&N`o_9ASCY/mc2hpI+?RnJD6+qa!?)eGT.6%0j_Q?+]a#L_D78U-u\@p%4gZ!!#:FLrWAl?+Y9gCtYCBH(t%$SBC9U]B,8=E8Z9''*/(5Ln%*PUAA61_83tXV#T8_GLNE`qoq(WfZAN2UOSCM7I4bQp=:;c!9e<''V]mYDJ3]sr9:t0d3;Xnf7*\pfu\U]^&PWak6qP^c^m;eA3P1h*rl;VcIJmm-Yq;7ggX\,X]r9[SNAcKOTkdcE*RVUhG'=hSY)OHh@jmRGOF8Vo^nY;ICe8K!<<*bX=RM[`7h-09(33"'Mr6`^29+I`R'*/(5J9@qrZc:PGFlUK$H;DKL]RBZ8=0>fqg9oCV+ohTCYbla>l=J2,n\Kh_H;DJq/76-H?ne*8IpVT#!!!#7RZq#->./7HpI$"FkF[61]68&)B)qu4!:/Y\MjW5-DkDrGbPqJ;opuEh!!)"HK*Dc?AB;P<(2!F:gM_ud0[1N7X]hRq7-r*OE!!!#kn`\AqbaC8:pYC%>:W+k*5()#%`F\Mp]m(roVHE]dEj]!.b*3UjD+COk$L6c^Qk3\d`fLg==a(e^rF)Q5d4Rj2R'OQnVs$"qC3rLab,lbZMAoiTACSc^[#eqXnX;:K7ApJ2m2hh7J:E%uqPcW_Js@D;2K.#RHeWEMAHAf9]inR3Y@edA'4dGe<[BB$HcN?=#o`6$c>FP\JUDN?(*hGOODZ>>3(t*G<]iIHATd^!Bp`!!)?^j,ZDM%neC<#kZki^V+sd8sa6SHhK!\NZ@TYZ">Xr^.b._ID:70oU^lL*^"\OHhZr:_hQ8d;mU)\HMI!'hD535!3cq>Ai")Fo_%mJ1hi+9r+4ZD*BRM3?'d0LWqSnt8q$mL'.1A;o;:@XM6Z*]O8&%r[q!I=HhQgRHS,9u!3u4T_1SFKLN`.CrR@fFHI(]&r;?IjVbV[+eh+Q_@O#;i@JTNXDqVFmh@m0@ldr=irqY_8D;$ODZK0iRGC!$i!!'f$2f@F7fsBl"_1V46^T[B:ro;\6g1(F`8#r;JF>Vf`Fc0L1(2(GB)Oh/12m*GsN;iIPnI!5MIe]mI4o]64gl9QqF?I_1qXgcODI^\F#n.4N$Oa;cX8i5#@Umi^8V76YNqNb]-K;9ulfZTda3EuMj2d?-15A8S&qu'pg0f!\k/GW#%3'V?HiO'=hm)'DkK]VSA]eQ"lf[nta7?iBOsEVFp[2n0gU1hKr;?I&*^",*=TJL&=R=%e)ns&#jugX8dWjQK=gNPRp;P_ON%+9VF99)"98F0Z/FQurr)_`o7+FuNQ220'Ni%p[IX.6++I8h7]^I][Wh2sQ!kuWb#aGH8r)TUT21q7Xa^6F'e32Xrql0IbaG6?N).'gUr7`\qGj\'\REC1bEa_Y\(.BPT>H9ib8e1.]j4oLoB+.U5b_L(G[<(_\o13%T,rC`/##IOsPJIk`PcYd'IB2)Du8/Y?lY8^k)&,N!8f0o704i6S7u/-KDROflHZEa[U3e)`))b*.cA(2k)d!il[N:nr)/^bEkqI!rr>Jf73l(mqnNOl0/#1(?at&`fMCVFHO`8V@S's1d1WjN3T88R!%]DOj7\e]6a-bY$AM8VbTB`_?:`]!cW_o#p``hIJ_U>_8U?-r?fudQS)Q?:ll+Fn*_o6M)HE!m+>1TdCpdLoPo\%W\7\kaHS-;KO+u,')oLdmCH`D#"dXCIep%flLa>i0q,#.#:._8C2&04)`MZ)0k5rcp%7l=J,[+7B>o`CEWejl*#\,m,ZA!TAkfYg!!!#ko'G$c?XI.r?U(7&A"tDQABU95NQ6q;acdYP"uX[hIJWU*iPXXC*t9TuLP1>Z4XHjq94EKYDo(DhMk=Lg^.9a*Wg-N9[6GhU:J,c'$GO>eQ.O`o^9:%7_mFp;W,Sj"1p.9&I%PCmi<]PKuW7iG`:g-Q5iu0di8=t]^VaPYIU71BAhgb+Ri?<3JHhZs1>IRY"5'ZQ^d])qc*TkSpbQALB%(2=lReE?3)`MZU4AVJ,Tsj=C\PrA"q>$F<8d\/eOl!\[!!$CS/mPn/nQ5j[3LuqY\O%I5.p&lY7dFBlF@k'.Rl@NJH^Zd*,b_1jl'$7rB?tHPIbM/CeZW^MQHt`$h;$dtc'kI;ro&VSC0/&jl]s@C/mML?0b]3>n])a"5C`\1g("`!UQ*<$J,QeIOk#HF9cSpZVs-%-Fo.CO*JeuMlUBY+9F!9iOr?[n>cD!!g/,E9a,Pj[A>VeqRCoihb#`:V^M;f6kgll*jMll](Fjpk?VBMkTu'kM+Ee>[#YEaOJ[o/*]edg%/Hfgbn=);2WGYB4R:]Xd9EikU*ImFnt+[Mo2HJ6jL<8j##LRm%<*+X)tCHe;UgNdABX-Ug&m$4\U&-O5]m=!!$DR2N,U/?G&gp/=A';r_N@E[r6VY@`XWSdV%CIF_2["BfDK\m$*1X"q;K(^OLjBN990\UKspHp$-9S2J8VDDT/+J&okA&:JEaI2Ti3K'e<>?\ok(-14/_2g%rp\1JJ:S+Eka`Rl5,JETH"0?+S*q1f']*;>\H)QTig2=ur0u$ig:oT)!@p;H(l23RnAH"U"rrm'CBQ,$F!hk*@i<;Ye\MF(_6X5Q14QqXj#NV+OapBMll`=gM]L%M"M@h4mK$SiC^V50-f>PRgER/ld3-*&parADtCZAHW(kl-d\g7ZTV+o[?S\hDQ#ri\:E5Y]JsI'r1Y-[?'9H?+kPagIM/-09nr;1M>#2o#i]LcCNFuMo9;b#7hkUg@CC#7hl?YW$^i<#L)`rr&09?.-G34%=ieIf*;;4+@+;nn.(@]6>cRDVr/Ke\RY\@WG]]I!E!M)kg:XNHL0:h8:P@t+X,PAV-(K]^$PWV*BTuV3*O71!!$EiS11W5mbKsEil(!W0E/K.U.(!$5Q4cSfZbQO2gOuTUIUB*UKPRDbEjkpc^qh"s8HX(GGas@!!"u)B8S2m?bZI%UQ<.cl76p^ODT./hRsj`A4Yh)Q".2P%mTuR1hkB.Nul9fXQ!FRil*9>RUgksB0+oM!.\!gZFFrAfJ*mI&*4"$qtKs[lRZ2ER.EEsVr;1L)ZTkW50asGr;HR--Vf'J_?IV#'#",4k=_2WHM+;p'1?V*McG]P(2ZNj9A=PEX*'\o-_o"iek*o!:o^LhWH;-t)S2aBCUqU2'H!dmOQ4hahu5`-'QI+\om>.Dn[Z-^:]Ktd=nouDZBdQBfKm5H2[S^iPL:APq"(AQnMf1ai4rf$PY"^j-7]O/*HJpqg4KiVbNYXj*Yt-XQLN&!,riO**6\&d\]a>A5OY>]"5K0]6@&Sq;fY]a$mn`_aEQb[VXX)CY.i/-/3M#o*k["3!X)U.jn,ar:o<5Q&EX3M5)S%XO(`TWD]R5M*QpcT7$4OcCI&iR[>ZelhL_b!1\f8`K`B#h?4#eC+gK@0A*^Kf1qZ8]mKM!?nb!-a$MP/k006s?b`be`,*Znc8P_'i+/?/Y(VL_&>K:8IKD%%f.X\j-5m;jUY?Ss,^`!!'h13+#pQ+BkpQ\Yq.2$=0g`Sih9RdVPF/A]cfAcIdS0H?$[j%0-Af)5iED@:RJaKABD;2LTpJ`D0P(`!>!rr>R'do"l]6E^=QS+haLPO7\gLe^!fmY]7(+jQLFk*@20/"u,?W3[,-U-Df!.]-0m^R<3mbRHqb8]8Nn\GGPfR>1-`f3WQ+G#u@'.-C$l.u'^d%,6MDZBdQ#rm?$[a6?;Yhl-jK3JS*/q.J_b,0E_UcgN`&X,G(ED!!'fS`LjY\qt=mgM&*7sY'''][IMfu[bTlPOkk-:CXY^7"onW/O0A)@MHIf,!!%Ogi\C+E&WZqm!5aT5eA"F7"onW/-QZ4d(@`4A!$IeV9`826@fQLZE/0Fn&$PG^p+^.OlVrgXohDK9PRc^U]>n424L/UNCgrL@YO8rfGROQP?p4gTa"Qj$OQQYr92.lV/o.e%-TZgA@K6VIYp$)c^m12OMC7XIpX#_k2G8NCF5)[hDK7Ca&S&<]XW/N]/f,$@-:ej]PHPd+,4nJ)Vt#_YH,(+)-oBH5,c0gb-kLJY3\td0kZDQ:QFku0O=NK&*cYI"onY-3bOGm.i/,G4BW>;WLN-?TYA+Y2eY)isGph-%u\Oei19`7c+WE-o$to6;8`6qHZa%+^>(rP.R04#CkT6Q4P\O,l+=C[9MX#:ik,e_[cA9XcG?>:(=[a,kNS!!!SuV"$Eker9%bDU7d+B`$$KZ+ooKd_DoQ2J^q>.V4KJ\T;=>\ntPQAG(J%IR=@IQ2^>?W^l6lZ:`:ehl<`$le"b?f('!>Uf"h()c]"LoC27Ye]P=8qQ1[lc/576o@e2+!/\_r!!!A(N5mB1-dA1'gSiGYp!]-ub%fX0m^Qr^\umrj8kEWToKH]Wlp@Ltfr$\+32W%!Gl79_Oa=Dc2#aZC]>mDmf])+'?&6N$!!%#].H@\$=-(C^kj$dJ7m8bJ<'u8LEk+%Z7Q]M!<<,$c7.fDnR):qaVDdQ'^48E@EU"TVG37P^4',Lj+pL6O;^3TX/i;e=(R7P\[>5I?9Z%t\_EfKTmZ62fCeUh]NN/;718:F(0T%jGhh/bSu63f)(O(t*a?'Ai\:E5JCQYk4:Zl@LN;NApK21U[)$Wt#"bU_?Bp%H+C@m=gOKZ\P3;2:Pnq3'[mk[NZ-ceI@_,"f0`V3(eN$,^VIEoN@fQLZE8iVFD\8$2!!'lma4.jm49bcc#U^Zlrtb,A!!".3GYJ'?`+&cIJ8jMQ:$Uj="3VL>$67K6OMC6+-W]IqT1Flb$ig8=:-=R6H@0f&LH2]>O"t%NI"LcbMR82[!!!#X`8eA2;+!Do0.#l;UBO_[M8oSr^s3OQj1:\,?VQ^Hh94PqT8DeV*WlBBKKE@"Ie3'u+Fi8pF%4761IkOE32YlP5J4^7L>&jUaJ`(4*a?&hk0/p3$ig8=99'jM`IaLFe]-PCUSR"`\s4O+C+gC8]=ZUs;c,_S&*bM_.TImrhS:7:Zt,"h[IH616'UZf\VYDI):25!jhns-L.+2eRT7O':RQJZpVP,l&s!%n!+NhXj)OKl=ga7'c"fs^lXmPZ%VRr"s$%7FcYmd[2JH'eaI,2TFD070\o\520h8k,L)!#.GT?)niW!4p0(VLD-/>qE>us,GjDfSPq>71ghA%#14HAZ4QoROn0`V2=CcGldY56BZg;[=HbIL#,U8&W'DdM(j?0h-Fjk=r!m3$.F9u=*sI(k.+n6BL!$F1i+e=`F:Y5A;oE/G!.aQ`'9>)T$qfmJWP)lPB]8kY:I:*)76CbS!!nWEnQ>)8p"_,7N?16abIE\jG&<`]p>i1?M:A\cGROQP&0@J'0kIqP`rH)>iP]6kh]a*D!!%[6>!26/[@*i#'DiU#+>2Ag>P>:,i\:E55WJ;d5.5#5gEdmC!!%ZcO6pF]p97i^0`V2=\@ooBa#Eaq>Vu;4@@\d*m2`KB:;lAko)=4%$V$*akW!qSTYIYsME$3h2*Inqn3QH<_j/^:[>VJqSMJ:DpX[`Nt?C[cU9pG^+YGg0qmV+;s@rfo8HOmbRGt[%BLidf0!'GROQP@)NQ8nP>>R,Ys^oqi'Mf4tl^!nI[W>rk*&PhV?f6V5[B>s#">D])&[[Mj-0[W=/tus'Dgdnu!bZlrc+o*P-B0'NI7*Sj+]?QLsH=Bi:k][rn"b@E84YdaGIC';H;#(="T)IsQI6rU2!$(]XQOLqUc;M5*\5.orH2]@M*dqDB[(i`#[Lk2B`+omPbh3`ALdhr_1d:&7L)p%#(;8D5mL1M020Wp.!Fr-^N-SeP0ej*WlBB(pUPpr*dl%P1(b=l_A=P[rn#-((V_aQ29jrkBB:X7Bc\OR-2AgY-+pgDsgV/cMtKPd]'X$\,6ps]'#1SD'^&l"I6A?8SY#1Thk8B\Rk%-YL;g%O$6N5QM=Xq``LSJAp@CRA]Bf0jm0SD!U8Yei';&po?=-'2\S_`Mtmae+Pc*/QcF(Wbj;?!*NU=`^6[dHqmOe5p;C:/WDb*Es.7LZp5sS.!!$EFhVtfie-Z+G&pn?]gAS2b^\?*_VaBSB4tU:&E^UD&"[j=-i],Df0/&[?H"a*WlBB(pUu'/G8N/m\OtpNXY,2A\A&Z?1ZQhojr*rc:[,f5I[UDpTEkM5@]MN^1c*ea#Eb,qWjgJVW(,OM-+N%VmlEB3$SWO0R@N+[TYTbf%o.6oUPFjo^$rIM8oSr!(Q<2*]mD.4gVuR1LZ7mATXP9Cl3HG!!!R*4H<^lR5VR!f4N0`Rl@JYdX=k\kaZ=76CbS!!jqn;u[X'(]XOYS9Ra+>Jt"O!.]%J1%fGsNr]4\_MQ=_^I:6h!!!9P*`N(SnJD6++PaEq3)`:b8][-E(@`4A!$L'OEFnLhYs(pYEokGt$Q%B@(021`&e`fo!V%!,!8'NXr)UA$2Y&*Fl3!3gO_(!@/L/]7Ag!!)@*EQ']OA'8i*!<<*]7pN;-n^oUeDZBdQc4O,/6Thdck8OC$Y]I_tb7K^d_taK:!:1\F`A5AAbAb/r!!#)N>d4_-fJ8t8!!'g[&Q^MN4LP[])ZTlBF2Sg:&Q!'<\UYmg0T17W7_!5Qkl="H^$[LD=d4_-fJ8t8!!'g[&Q^MN4LP[])ZTlBF2Sg:&Q!'<\UYmg0T17W7_!5Qkl="H^$[LD='C6!l:%0-C\3TKntk3,EYto"hS":!mHlLq\4`/@HI'RHE4u>Q!';!6>R:]C=b[3^7lPB"-!!#!cGS6);]!cC9^TUfc#'ZFn4WsCP7boHSHpp.%!!!K\T#BXs^TE@fr%U,hK7EXX]$JXCMKfO0!$#1TMT=DVAlPoSGOO&FbE@RDOM#8XE8@GT9LV&J!!!K\?H(s.b8/\fqKHj1NR]PGepVki<5`8H!8u5`F$/,sZ+Z4d?"gVA+Fi8N46M>]3P':LoJ+7q:(QWf/:.!@_6q,>-]I=F5-XpqjV+6C%5HT/Rtld.XI1W?":j\+C@RZ-pCWmO^HXF>37?-_/Y#M+UhfncE4ZBM>;-HEnFKFt3$"[i0JpF3kd-g]OGc0,qjde$SY)P6e9h:'+=YjeSABs8MNd_FJUIkfY7/coC?5(4;F:jQ7!.[Fp=7Oq!_=7J#Y'>-QQ]N5/:*3V&j2_/:#.B`n4KqUs$+_5?cP`mBa3o"rpaY[8H#mWASLa$T\=-&+IC-Qprs.4T8inf5I28>0=T@9Z/WH:sWXDd^a7`4rcg!\>*iUidl2_T!(\5>iCmd=rnrVVB[BKN#>>PTDlUN9o_Wb%B49ap@776CbS!"LSe`FGZiO4>/q]9O"`)`=SB]5+a(I9K9s:B*VKe>\T]*L%O*H<:uY(#M/<14/;ZEi"[d8=%eA<%5.i?D+kdAVt"1,I^!"UeqTecp^&$!!!LgGUujj:d3"1GQ-Bp[Y-e(.cJr,*fgiu*nC%KPKt7V2.h)7%hEjjfLfY6C`0q!&o$7SVj8͝e5!5?.sc]bNAIW/uNi\@3_G+'K%n*6;MdNTdoX0P]Q]j8PkDdD-:4F`UfS2@\K[^B&@%s_)'m)dX^[`tE=6dH?s43Xl66nZ3c5Oj!<@X;M^S%^Z<7d#!<@X;,9Be7/`JJb!,uViA'2AO49bcc%ZP^,=gs4-!!'g.&W\C,(@`4A!'%@\)3=N1T0:9Qp[[Qk2W!le-"CMuJ)Aq_q[nXr+s$gd!/D=Sj72>A>pRDVg,R!igMPZKRV_`TPo[FX!AeN;k*_CqPpbCU=i=eM!8u5`B0=c2lES7Gj.QS/b(TM+SRqdM`+&cIi6^Ir4P$Qha2DHf!+=uk'p#i+SMJ:DpX[=V2NKLRl@>j4f.:7)b`?u!!(4K+Hf4L2(,\:Q5RaL61DB0ZfqlD4KP9iriU@Dg:6J?h^e)UPOP9nV"pu:msb,^pLeup&J9Ic$bqFkgOH;Hh%c\1"\5PaN\gR#>tCME6#?5l"54qHl5b%QiH)Mo(Q:cB*UNYn&JJoC87gA^JCf8UW.9b2#c02*J$BEqTKh9X9ajis>jm>sA/EqQil?^EA4nm>tB-pg$#!!(RSrT9"ZSJueFCS2rX.c6IgedA!59$(AXMA20E-lkpGpf+uAH$D;j7ucY-+Z4"\4NlD]^"AO?RNYN8ALneSKg*cQjOQN&;?CV/=X/Bj&'BUe5bXUF0.8mEn87DHn'TG*Y+fm1AZF6nF2\#(p@IL?WHrb!i(j1ojBhoWZa2L$>?Km@9G/=6d+fTAL)T3kY=T@%In88cjKiF0F$/]uL*Q+MP*u4C1-s\Ctup_A6k-R6?a%/?'fkgBRsBe<\u%/9Qg'Up7U_%9Xks)E"H+qfo3uY#8&6muoS1n<5sU*q%^fAo-&&qP!Y5*#EOsABqD+p;6IL1M:[gd)f63rZ'Jc2i,KS!$K"\DEQK^X_VSL\\+=pD[tm;O16ei?l\6-?;8qS7Z\M2sfF_ENF1"VI]"&\rSDS/FN^V[$3EM8O1i1+D0R`T;)4Yp[!!!R-gr8=CpG^-i9T`#n>"XK33P'M/UplDFK`?Dnm.?s"g((l6S#tJrTO]kGjk6b#:GE[pdDk49(Ub=_DnN`)C9;TY?`.@4nQ>?pWg(UN:J*+&Cg=YoknreY`)?"denu\k]uR"*NHQsK+2)@NCed)n%b/hJ`Y"74!'iXYVt#$)P-M0mXr\YPhj"/RF1^n:O$l(k$#Ib:MjMZr<"`^2+pH]tf'CiZ5L3Ytd:@A+X0Pd0/kp+\.3jE8"7Oae`o@._k=XdT"`cKr^7'QGk&";OacJ]g[)i#>`FC?".ZLa!Lk.86*Jmn\4Lr?$YgMlml(]'^SBZo2b'bVIEb(JAi5l]6!$FI]ds)l3rhbD!WKM%8I$KLl\RI!6_F[Imi1D:"QaXeu,n$]u=Hd!f>r83uX%;\B2VRTL1E.So])5Xo;MFRHh.\&S9.!Va8ci(lBE!o.#hjUIFnU]MmIJ&c.OmZ_d3tefYm9;Dj6s!M[p*0G5`Rp"8!Als@M7kV+ka<8MdR0ohhYHbmD]Y%ob).DJGMqa@!!%fcX;-dF8h&aS!!$tO`+-s$76CbS!"P!59Nei\`rH+TTb3>7lPB"-!!"u8i\>$#+s$gd!/F$+VQ="?@fQMed-NY3?heJt9*B-M#64,9but"dSd!PlOM@ueRi=)lKCnWZVS;siCgakGq^?CQ$QRUB\sn^k]maoK:$NFu`O'>Wb3+R$k"Z:TRcH]Z7Q)(l?^3'`qpMp.f69_Ia@=[GoU/k#@fQMed-Nk9B@!#DEi)h1:5ut==\&j8Me3EZG4cg;2p5Ao0E*Y&T,%75E5B30)l5dCR3g9FdOn1hO6N?S*04/Q*[@/tQ6h1])tAd0EWfWQ?"HlaHo]rio'+]$Bt`48Z=Z\3]_ga.]`ZF9u_]cH`32:HZE(pZhEL/g1,$GX78jtnJD6+3&KC1j#7JZn(ncW7GUMpZ'%tB'e,f'rSthr"Z(po(u/QJf\T-m0%BSO\p>p&ak$VVk=RMb\RG?%iE`>doi!ruSiTDs4go9kHsS]a:d4b7YAH+gf$.r$Hgpr1d;IYd*m:eYq=Kg2g-/-hfjcOlNm*eHP@\W_6TVAR4@X`TTS^7.Bq)`H>M1\0$+(=\jg4Z7G>a\VQBK?0s!e"0JFkBmJb@SnZ:AOhYrdg:_OsNni7%6s5Za?N#R7rpdFON#n%?Rb_[jWYag3XtQm@Kq5CI[]YR59+-"n.6n=^$.N1jOU4k1C8O[2li$Ca>"8L3=a^!rr=g_tNWqeR&RIeGNK:PXN,sURHMtEKAD)-+9fI*oFQ=GapZd8l*cdhpnjY^K2pCT1e0,2#nnYI(2\gGk;T;6Q!B_rY:`P9bmV13H6)Mm!!",kE>4I(%IKtio.HdVd(<<#'Zj&+TH!-Z.h%14Ir`N7426I8Qui,Fnej[c+#^?oN&.\6lbm,$C,h//*_V90a&a-qB]I5X=gVU+OP6G1>H'q\[H3nKT1b)_/N9Pr2CBOrJUGUbIr1eaUO#Jke-Z-5;&gck6e\/mnp?/>2.t%fXddj=%_1M^O$6ef4J$d+!!!R-*5uFLMPW=,a(+f-naJj3k=uBj4h"9kqVp?4,mkP^RjOtgGT?76@]?ffKZQhM"=a3_SJF7mi0*9[iNVHsh/nEK:()f]D!TD:=gA7#:bdF3*NlH*V4X#SGN[0:MR[IEQ]/%G$QCA8F+EkK&t:b:?Gc^Ig&H(DuBK:nFm'(%hkPOk/h'LC=B>ClrrN!!$EFZ(>3o4L+Du!K34Q2ZFHJd:V7MgWZs0:ejn'p'9X?8@XiD7@Mk4%,VV,pEqO7W]+cY%,t^Tp_,oohS-13sUp!<<+Y37`/3ePb8mQ6TVR0($E?.TW?q]=V:IPVKmu/6TGMd>oL-K^q%4KF&=%r:^M61#;Kn]-6E'8>F,K?!!!!g*:'_PC>HY9;gFn%_Sa9>k+i$@/RoKUDdM'?d;dgSG*-\%on,VG;Q#VajBq_!nYW.7kDtc3XfbRlld(#"e&s.^+9,oWG$%2L:\#@93^fs0!WUpbh4o&O87sOu>a>R(kpW/ONU<8sPIJrD&tUBsbO6mu@fQK/,Bb#es15X3''?jk!E"!$aLZ-VQr-449b6N5our0[p\,)pn%X\DXa/V4P^,b/mek.3RaLYs-jKL"%,CO@![/[FKp;A&!NYpP[rer#8L+J0r@WSCUQIW10h&,D)l[N`6V/rO^j70(ASQ7<>62,(Q=V6\q!.[FpcgdB[M]s2E!!%dD4Jo2a`+&cIi6[K*4XtFt/1`?P%`Dj,7MTc&DUYIWgmlOf!!$&=lI78>a"Lf6N2d!MR#4b/NlV%jmH`9$;r!nd!!!""E:)@:M9!)Ch2837nX,22R?#>Reu]lF?pNM;b5_MBAoS]3(t+STaDSAW,"U!!'f4gUD*fd.628MargLc'pYq>.&)d*ZgoET(51]euD_#;at\tDp)'[Y8UEakWT6PQ\fs7jN%ot5JIF6*n^5r#64a[Oo+nA=05[!l`\(so(#D?0VOYeT0.Cn/0-fqX:P;1U-si+M%\@<;^_9+r[nStbc^F.W^YdA`0/PLbmth#E!;sml[r7OeCSaUd7T+6*;Pb^6Qlr*!:S0glkK_V)G4r(5Rl9BNQ*]%T^]+)1S"&0LKaY"?T\Xqai^M1b4VobXXS5*_!!*#U]6E_.<:'#>mGd,g5C`[J^q^mJDQ"S9+$VC20@KkP%TUK*'q7.#DT)W\[VV?dA&`0-Slp&,HP7/12JLU8*^+g/pML$4!(ZSVn%TAO1am_Elq/ancf`WHO0n*8eZ7H5D0t^+3?-;kJ`P+IHgot0*qAp3l0aiqDPY@#&1Dm/>u'QQT0"O=:ajo,)NE)i*bP2oh`DJlVh]6j#'^#`HLlTe\.\8gQe_1Rr8PM,X55nF/b&<5_pRlANW0DG58#Q87E@hTn)%]WX>/J6p>6\c-\*&qp'eudiDI?V:DW_5rV$=$n+I*K9Ah`a5r0.D(<.e;rZZT3*hN#XkKdA'3JqgoprJfojRn^h,t77BXr.L'm(Bk\G#()@]&pZ';Td[,@Qk08_r-Oq4^4?bqm-RYha"f_U8G4!`.e]lFd=%)"uJV!L[f2mT!hU9j#2Jq.N_^cS-_>e>`K-1GO+G`LKSt8]ogZdqcR%'QYX,'N@&N8$oY1,fQ851*Gg;1GbXfJ"E$p\9ROQ&B7YH:;))Q2VW[(#_F0)UAe\7A];U+J1B.!dk`[3+Q;]%]ic+MHM[8JO?J4#%1:^'.TNM0i8C9b1ojH/kS`l?#m6(aF^NupUC]QnSurr)/O9&7($gU1gp\FNFc3+6K63+U)A`DrT;DVVblkg?0?rq]7sAqhE6Jfk?9A`uFP[C*D6GWQ?1bT[cO<1#gq[R.$^2/AM7M91M`*u%ldJfk>N+G^@J2X'bQO!!'K9@N_4o;B=:rq>a6'j=7RG.+``F8u7<'j:us+:*QA#kt$E5*mj*Q3qR)il);6rBgM(ldr?!F%Jqp;055gG3mT,f"Q@sSt[`%&-P91"Q:]OK0CM2P)tb*+-7*^[hKMje>Q6>D;2LVXp@<)"@3TP;ofOB).AZXX&iM/=t6GQP:'-mX#P=kS8tVs&-P91"C[FZ04->=^:\dblEUSA7bD1gL_9=FePfXoN>a\Fp\.`mFU3RA#_F0kL'me$kOYgXXi!dDoGM(kQ7Z>7mbM)]eYT.?6;omjoVg2Q6kBJe&-Pi3?bUnb:s`iCagespc^d.!R5K_RL/tE[;J)a2Jfk>N+EE.#T[/E,GkgbOO2nk\qmM[RmGG[nMi.rQX:PM#&-Pi^3"kj$;&k?%+6N1jarfl\IJXf"=_lTi;0'>UJfk>N+>T%NT:_L<-ku=LoB4G9qh<+`aN-nB7n6U[*]@h:\T6f;Za3f6*C15>5nKhoW:4tAb*9`8cPjZN!]1Qt6L&-P91"OTnL]m@)6q=5F]C=%Ss1C7u$[r1#])`J-&5ASh$',-Re'e?TelTA&`Y$\pRNT'-NVeeATQ^@I5fe[;40[>8I)u,VeS=Gt6GkgdeQm-_@g(bp%9q+%<3DZ5/$-/W%J,["Z./DuJQg*c!:^^JTL`ctT+:&3tqt=kUK0G3Ya+ZL`6M1B@WMcXApK34Nr:A6u-VmW<;N;_W&fi"+E8eYgA&e0.gUC+Z:/.06WE$!bVl+1\Z=T#SN-GcXdaGFcN.HN\PrSiqE1)`DNpbaBt_Y(Z*@dQ06Cou2h*hnFN&n'sZ7"@3TP,CK=XA_XY1TLOeJqY]U,VfP9l#,.B;.$)oFM%_7_H[EqT@"*S(X&lK4S@*_HM6\3VsNO,"Zi:(cZ!MsXB;`9_hKl1S2=s.W`?*[*'&',g,2^h-2LmO5nF/b&B+[]6?,;`-->1np$-DJZq2lM+KXM^j923DScY?=0ej:4?:71LUIL70mHl>?m-W1%YPeGa2b)OR51"IL)\Lge$EW/Q:$E;?+t^^Z"(fq4aJC.Qf/4%+:*S?!'TPP[^L@C-;>0doN@>>mbPL!ldi1(:#XA4WX+DD5+fT!`JVp02\-uo4=DW!gt\E54DS`uJ:N1LrVJ6S]_M9lj+%((VqgG_M_\tm+AgugW(7N9SbW-YoAnunSND&@Sin$1%6m'A4$,N=qR!T81CPl?$lH3V_1Dao%c"X<$\Pc1#_F1T*2.sJS!f[AiU%bNY.jlKd]H?J>lQ-ad2h;,'0!d3eX#nIPR]68$h;USp%rPaY404)<ET7_cK,9e>ib+CnJrl^W]D#9,5#_F0K#$XBcI=6Nfn(t21=qCl-lIDrKHhWO=29O7kO6lIGBkc85H1Me'=r8.r5(*,:7U'^+pcj)tlK.-h-*IUoS0^*Q(G>U4UIUY'>md#<4r4S7$VE*3DVTKhY[QkLYD8SfQN899JfojpY$\pr-0V\pq"jY6#\/:2I<_22TfPSJ]R9N13]];Q/BkrHJ]o+:?G63n_1T46g\1F4A$UJuaH.Pfbh2X](SI24\1]`uQ>K,oi9f:.naZ-BQ7V:PY@$+sFj8.SLg[[#[r:!-l,\u32f.-.R[VBH[3L8G#_K!$V%!3*HLBY'gSR[agn$hYGk^X^NZC4Xp?h22l3\!?d*T":j2Q0'c:q&/cH=9Bbo[W61iVA9WqfNSbKHr!c^mdq/:i`Qp$5\fh*_eW5nJ<.Jj.ef=VIBQjia!'*qU>t1t'k%GO=,7[;/i!B=2L)WY6aT9MA+oq^o'ThS"7@#D.h6W1U@-&.fBc'#M'n._prY0+Js]0R<6M(+i_Bg=jCKb3/@Z4?U2sl*=^5!r-a)]4D+2&4Ar!$Mk_X('Zf)]?ZY.T"04#V<*3>p1UT:HMUe-ab.oq0iP+eh<-Vo>_ioX8J#7hl/HfLBm5_=A%GbIh,i-KF&!N@oB+m>-)ZmbPMRqtH-m4dt(3gYUf$HhZsoeua;ghuVTh+UEZBC6$r>celHbA(rYiF6)NIT0.D)9:%:-qYEZN7ds2iCoi4H\c)'Y#Df+V>IQ)VE-X0H_?;q^45At"doW@:AL>?fiWSN?tN?(f%C(L^!n?VUX,F`JYPAD;1@mMIL..'bV.bFQl\:/_l2cL`ctTW";qTBcqn(HhZsd_1PHV:%e2P4*Bh1r:k7XIkN`mbSVED+(a"O)p-4DE'mpCG)^?/1nB5MK)><2Y?A19R]D^='mqFVf7ep4D;2MdrVQ>*H\W^LJoD)1hTjs5SPmFf+$XAl.>4IDs8IGmSiqXUJ^@RM<2d$Cku+su*H'N6@GeeI=fK!.G^Ff3n)'aS09H4skKfbS@$s6/I\TAl@!i3=\Or,:,=[VOHM"/1-NtY!Jfn?e^,LCOUs#qUgZJZ::Q/Cpn*_j1BN@b%JY7RfkW8M<$Eb0#U&NupH,XKSf\T?l->eV2E.XBDl-;GqHAG6C2C%=nY1p@n=%T[*m2:7j`+Y$F+c`F[5YSN:oYgUD+Sp?98VJC&hM>e._[,E0^ba=oJ/?+Fu%gQ!DqOHu3@HhZsBIJZ&c3C*b"+]t'`?++S&o'+UN[Tu63"@;+0fV$R#h[q&dn)(lugU>AYf,&Nq:f,NQIJ`*>EO!aSh7FKaH<+&^gQ!t!^jlGl?=#T$eYTRD3'>f5CU8S[l<&JP^luIDS[_G.4L*j8!"@ISXl==QoJNk">U_:g=j,ZkKZq%;)7M$K@1Z(&;3K*Jj.(:0ekC"oGK*DVb`pS6pqk2)oH%j,UaJk;2D&gj2QNDoO6L4P#8,PSaP=GZg@oo.NU]sY\;FY7ZAkQ?(P"XIrr/6:>uH9H#_F0)L"N'E\.BTf_UY\g4*9\ZV5<;9k-ea<$8+7VO;V)"<[p%n2``uN&64AjqJ9VMJjH#kP&gEkl,J]%_h5REmFhdT*8l9JZ):BiWmJ=>MLY[)([b+"fkgh"#Ro:%gpf(K`XFUqhq[#">ISKsp[8"VorCp7ET>'Tp^$H[q>=!Y3e>(Y`F/m8&G66;fs,#laGep0>dbY%0tho+Jd]l4(Pnf1p$,OV<)f>FD4l;lCMT+tq9>BfjBY8G7pZe=]"5&IY'9?kA_1>n5nLF)K0CNVjN!<'gUD+);Pa_ZWnOq#J+`),[QQ)X6\c/R;l:,[?H>H\Hp$2j(j8F:q>9Wq@1_%i;^W4l'0`$qX&c@=K*V!s77TiQ7.R3LS(Mm"5nHGl_4]+F.ETcVgUqgm[+48K`+H57s4^c'UQS2^Om?*@gk2tsplgNK2K5F+hAGl5mcHa_F_3_%XlKTk!NN'+DX&c?[hfU%IJhZ0"K*O_/T.aHZ^p[0tl2aL.-76a]dh@CS=BO4^B@#6(W)R$9Hl;@.Vb`qjm>-_:I>o0gCDs[#hj1'tWN!s.7RdUm*+7N""@3TZo(r#p.d43kK*)=+7V!i15C_FrD&s`>nF5i"\*o4k0A,th%`$n/AS%^dG=7E/2>[(9caFXGnsDUh]%EDc6F/6$n+cG5J,K)X[_E*"+:9A=,9o?7SRLZ)n(po-TAf%\@aO:5SN9@2`XtTO8nah[HLtmuU4j40;B3lG/Mf=EccO:;gCZgtCu7ei_Bs*VIu$/Wkg?.4'e6:eYsNap'(i_/Rl9!Sg)LFq%.^p"\+dU$r]jBagGO2XE[i!\UPEkN^@%EcDJY=)d=K>I)3clK&U3lW34aMWQq!GPirVD(>+#%*qq!kG0*GCmU9'aS2bp52*f#Ypgcf`o_?!D+L/dHe/H/,B=j21-6dEn7"oW(UJ<'aVQ/I;^iMQTLt"9\kC=ID2!_AA5c6!NbBR2q>&L;:Bt=0V5;-E9IHTR&YKb&T2?Z)a^E9U<;5e7Vld)'"q`#F04/U/Aqon-3"*l=1sIkAa+tr7o&WO)`f5g/-Ksa[/mPn?2`I'Eo\&-Z5:S.?Z]B?qa(R5qE]Vb0_hZjB;+&a=."QU2hSIk?kg?/A4+`7njY<39)TlPXmbGBrX*ja6Uo1Z9,([r7m*CJc".(GE5$Yi*T["%3EZa(UoU.$"scn`.ZN#nnZT"c1^KH?slnB?k&Bbn?[/H2KHUFmI8>ot7u?c-7h69l#'#XWB\jn&cB=C^&FnD4Wr)I^Np&`l9nP(2X*TP;dAi?;$+bn(kQ4q3Wq$PGON>m*HnI)rUYFVG1d-agLNjTo^/NiMF<%E\'fe;aRCNOH9HB]RBZXTsZ;.2fIP*[=0KL@hia/(bfhF4r]BFPERR`*,BDcAqtG6ueBujuQDC&WDJj?.HWgIb-]`V]BH_\A>57oETV_40>&GE%/SjY:g81shK6WA\YL\9IDu$EZY:/6K+VqN1XQI't%]KL'mb2V,#sKmb1H7J5opR%fTC=63,"hIa8>StA"p@BQ"/glM/5+'VC4tVK3j8t+OhX\#S2^/AYVbZQQTrNp%>`#Zu56c.74gr3dbD/5+nYM5'n(,Z!9uMSSDJ;T!>P?<)f+AW_bm?*^,+5Q4.U@i>=\Aa(f&O:7Qh^_W[RSL!i%ABjtgf,e_sa9]NWFAj'r;RWR:IDr/WVj1p*S$%^FgGnKPM].SZ4:S4rK\8L/D5L(._+YF-J]GOJjD*?A%]]]AV)Pq.^@5J)AmrG'lA$k1;5gAWgK.!ZV4Ml2c&^7JY"BBPWc$`KhRAjk^XVF&QHPq#q(R[T_5eF`<8129e>`J[FH'qJTlSWY`a4M6i8$e/s(Cttt4m8L&dM)p$0bE`>iC4O3&AnJ_\[tZ%.#Ll3LsRMZpYA*EXSh/o8*%Nc26/oKMsF=tr96i-N0ZWY&C>VehCj>'*`1$dErNM1@#+dE8b^-)Zpj]nsYV3r3C@jETOOGfWepL4?V9i!YGXuZ)A7'$N5UPSK5Da#RLi!\nmf.YO`0(N#c,kUVJ??4,\9+o7maJ(E6Ji\q@+:4TgLN\j?V;$lsA38rD!+J6(iuHKBrd)J<%Zb%&sWc8MKH+S4Y$OCo]CC/h3tHg/tShg^D31OIIkHA53%#sDM$UsIVH;?':?S0eI/66c5#SdsuL$jOIu0g$HJUoBL(gCksU9BPeI/Gg59,^G4""@/&9htukr$_[NBF`bi%9VAske#%Og9S>^MQsRHK:[cl:WJeckC"`nh:<&$C#9tJ.Sj*a\#3b6jL4sK40n[T[6:EID2%![,kQ@DB0Go(Vr:nM*E4GZIH?p[nj67$alIZ\D&=t!\2fFHKOc`f1r3lIAOIjg.BR;A*6Da,_=Km0N7j4I!l17MI;uUeVpIi'WQf\p_2k]fi/nR[HIfpA3DrkXbHlT+@Y4HBQ\r"kKAU6g-G#`5]Yb+*tSq%3(rf2`!?=)c0AMf(8UL\nrDY[uV"=kh)gGU]gJh;M@@NQ/166SdrEpl/]eZ27!@cHh6A^_)Il/\p&on'7.=?CY+.bKZ'8e2Ip39pq%1eTS$N+@01S9I-#>U5abo<_DQ>;[2#.I$3PZ-/M1%NHP"=!S3*("S:#MYH>a<)a:'LCc_-:=KuX+"Q_L5uYtgQ6`E(7EnFj]7r]WMfh(IU,("?c(@\\;DKL?BSoL'N@383&Js+N;smG5D1bEmE*?+TN_-6%FIm$&![>O:V(o^[TXl*Hr.$9>2&:`c['EOI$UL=4.Qk`5#QP_!UZTVj._hT5GWoX0$Rf6?T>$)UgdQV0i0L6k9>FJ7k@h&tqH@V[XjE)>na^'#cRqI6m$9CqA(A1@cIcRGpSjp&^.o"XC73q+;,_Zl4Uh3p4-[B]icI\7!f?:;5)a/q'\!WX@'m[[s%5c9MQpABFGS;7$u'UPj%>JU2Q(pX&g*a3Zah1k\.DhF@F8.h;R!L5.S];N0k3Sg"u7bH;KQVh25Cg/7eH#u:GdL:KF'egp+0e61<\_UeC95\C2%BrXdqH!eB#_U_1BGlpac%WB@=jXkL?XP9.Z\A>c6=E_Ae,d_K,=JnQf`9p*p;VF(`4*g[sDlAXBClB?.eiPq0u3^MjcE_1"hZUpQ,sM\=gHdcE2em+&NquH-@dBR[80e,%t]],n0_k&i`Kf98hLDM)*ks6B\=349bfdLP1G;_Ga6P$@;9_NUX*BXtDgeh]+ijj0+ehECZ"D[]SrE[g1h>F9Q'?r2;YoEH!EFNB$Pl1CNCIJr_&XG%TC2%DXj2V\=*C9Z0&*:'P.8q:?>S68Cc&@Y:#7'jLQ,eI+X-;dq'LEbN/JpAS'$kLK+ET5Hhd[PT+KN2TP<9=jeHues]6A1KL(-G@OD4*HOWiA%_,NcK<`42o]lnZ=b$uU)-BDNP`EARs3gV?e?]Om@l;d&[@,uc[rHaXtjieU(M\VeR60?"Fc+SN#LsDPUS2qrqg>dej4#^k_D/QMWUZ:=s34Ws7C+V4T/*Z#_P/kqS__\$mS"$+c^5[i#^Q/m6A#[EldbbcY('Is\"c',fc^KTrC7QnZ"Y%Q%%a*h:A&io37941ppq2iU'Xf#JrWgSU;,a>S/eiD@ct.bXL5/FfJ:RMO1%amu.e_3+LYE":5rK:oc0Nurp$8K>+LC#E7/qh$(d'#c5El%429jW?*lEbKA7/6963[/aT]##"C&RqX1IMO-g6sDa]pjkD80/RO44SjI!d/;0bgO]Dni*^M7qbt(l+q?HC%=7Li^G8kMT@]1mn]P)dFP01W#f0W*,;abZ@W.k>[9jAmnWn3;FkUscRc8S,^+4I3l-%/'J#+8TdAd\j=FKAM#;1,CE"$)QCa[C8cX,F)R`kZDH9e=Y-+p(NbC!J"U/\mX8uU8Ci!@_B$Kr1cSKBj$488BVV\2[:=\+RHfW81MC=lk\@K.ERl67C09H3bnsJGa.OJ!_#.kCJ-P-=&p)sHMq$k6eH/3%d]Gq.\CfM,!sU>,oW,R2\bTU1:K,rB#KJ:k?\;"jjfGqj@QnKbV]S6)HXrWgSUNZ3%bHumml/M4*gl-lVrGnCX]Md@Deb5,7[d*tN+qtp0(k>$H[3M8_E3;iF&[IcS.kKc(G0d4E[dE\nCE:DS<'.*US:a10iD!fa5H'"f#gUCg$]_Fu[EHX]qu6\WVfMS<_.(G4-1eb>9nW-d`W@$L1U"CtYPdYQ+(+s2r#cY&X7+@H^J8daHck"SiRm`uI&#o!hN#6%Q)M4])n9I]Uc;-MH]AqC-C4e3b:0e:c&*C=f=\5Zg?FY?%cYEdgYRg,<_I^NT!ZH?kVak@LctDsZ7.=se<9bbTF1J8Hhg^]>qTIS:/GYTf?)OWGL?:h2UTBVS&.3]bc\ebojlnn8DkAdo^c0;T'cl(o,a=^DP/2L0]9eubfDRp&rt;:d'H0<\1pO6L_E(G/fY_?s*c(DIQsCMO:aaO-bQ1N=/k0q&NJTMDn![r--maLt[c!^cr)#jg3KK5F,?s$1kRE@[/67Up?$+ce#Fm0f?H58b/?]B3A$S>!Y\?&f70]JZg@IlO[,Za4>X)!:CV8aW;S$Uq2B:.^")8q7Wq*2cV$*hO84E)="(AT5n_Q=aaYec\f2LitRaj0$Xq71LDgB&1&eQS6f.TU/\qApH6Z8b.,]\8cUR/G-5?Pq%tE:&=e`F+/R%87eB#6?8bb*rGd/;:u-a*\@0TZ)ap@Ci$0]NKCL;(lc_9LedX+c_"dkP_%5SI#I);%3%2VrR+k;/tb^,"`_?H-EL9Z/[p/8BpTT2E4I*\=G-t4[$X3+'5X0gqTI_'EsG5E9sUpis0\i:s$\q`kl3Rr;"iHU8:H'/?adR8KKNj]!PeWHIQlR68+n#S`e:h$^1;\oB/i:1ni*&pcg5X.PimPe>ZBd`l@LLW8qO5Q?de&?G(M;4$3>]P:,D2O$@^J$kl]>*i$hbMWe$C?+U;PhS"8;^;Y,YaN-mk)]KV.YjD^Jneb(g9b$0'r9Dg1IVAGU<_^`A+@/T#"JLWTKoG+J_qLO"j'mZ$'T*R2S#9&;$jS"%LN_pVXed=lG!p#=7XDYWks]rZ8`(ji.'pQ)OsG>Nq=EdBTHHTh6R$r4?@qCC=L"U'Y-*P8a+=I&kjl5na,XH;G."W]!XZPPbo4um$OR6lY@$bcm;6BE<2icl7>hqDM&F:,.e4E?H:*+/LAN-P)@;`t?R!WT:FW?AgP"I5K.;O4,>ul;/(>9\WP[;lCtZ,@P3#n!B=WHf2I+/cE'4fA@470WBO;FhPK;%lWdSjU,saq/Yo.A[XBPGsP?$\mi*h/>n+bbQkmr2OHN\[-?eD`b:nSK[,*]F=&_g`?H[#gmpM8B@VP:D<85R[9\T<[WI&MTYmaeHWjFhkM.%RGm89c72+JfQD$EQ=?@1A>\nAL6?.Sm$F-k?!$,rhC`N<;7MBa1^tf?qq=XZ2..GC1X^l&QZ)&2)=^DPOba:-"s8KX)gQ,T9'm].TDr2lq;!,Yg,EGK#2;LkMO6'KIgeABOWh5njZ$4H\1M;T)2k?G-4*BiU>>K*DeA]mEi/"(_H:!d8a1Ocbb]QVa,,7Hj55/s#7[N7qZEP+L>Onf-]'L^62:0:K4NKaQ?+GPTBk.K2#f@Dt^]PuJHfm-($(kqbGUKOmu>)Y!gE7s21?D;N%Lcbk\dChW;//g6pmNDl<#l:[!T?E+sA'$2V;ee!hoOpf<2^i<1/QlDf1Qf_s#0/0Wn9lsXr!XkL]#e1JqXm9Q[X,oMe87`0Xk:jPld@6di=.fs@SKPq(5R^ocegn"5]'nFYtoP.Hd>P6:"@m+J_.*[ht5]68&J]Xc7AQf^sR3]tFQR$(S/040I'[$ABj*"-d[1dg,b.obG:OE:&75ZmR[MK*mMDYIXME\C^MD?ki\Hhm5o?DCCEZ&<'`)TI]G5P/d?Xk:_*oV-e>^%s`DnatPC^P@JU$1o0YJ5f8e@7_5+D4EYPb)gc9U99LdOU$XW0;d/^S3"Wa7;+1L3D-le9J26*H!K]5E,'8#%YjiVe8PCe0i)>L=XHT)S25pK)7[bSU8'N-PI"1cT\*btQhP7FC?_pATL;N)jmfoRP9='tkK[Por>6Ue9aE?rBKXY9LR0RVh7@_D2`FR,OR?)VCmV"nP;dA1;6,ehp1!-'@<','$73c'd++5u\#:+;m/>%iF!DlD=0?@W@KL+AFa")0:'QuXV%oJ&/e,qLcnI.-nC+:28n^PS84uV1Z=V52Y@!44W=ncHY2Gcbl6dqs9P/QTqPrf">TV(t?FcQ\4&rS_>=M):oP@4^EPmM?2o$P>-Kt";`jlNs2#-k9UMN@R!W4c01jAFfSQFqD6$=jqqlUq#1#3qVfu.(!O`R?8"c=3.=Ya_+Gpt!i60Wr%NcoSFri,km5mjDTs'36H74N^^a,Y*]l/LcENi^<3l9n[4+&Ac$K#fC?"#5Bb9(fj19@PHT``Z;onsH+6M2cX2?XD/a!2UQG)j2U;*WnGa3\WrZ1,91E$TiLre;k\9KQQS*9BE>6kbKHqPK*Gl:)l1:L9q+$]3csSd=0G0'GOOBS@X`biH'sbUd'$fk_I)DE84X$a?ajoYa;G^--*NLI_U[1Z3fNo.%`:(+G44;D\T?s-mG"gK[uRP;<6hJB&A41LA'i-f@q+-r"npp6\!G:8FHiVjR_?QmJ3'm+p4)(W:-,NhZPMG,J`hRkk^-`7>F(rAY_Mk[DA"05LY*Xr$N0PhRg.B$Pe3^`bed[qagned*#:1_V3iDo?tX^uI%[&$;"D2F*hl#!A;(^c2p/\/E-(O6n1BMmZKOGfSeK4oocaNM*'fn0LV+#d^g+K0/hY#+ABSN@br(4FQ;/!E(^`)HB6V[k#K$T!Y5p&*::Z_L#>K+IO(6A"PD]qf*%j*Opak/i_pB(Yg^C"_P6pK2NWM%VjiWkC[;1!IaH;lHB0l\Ine`9a6NIE&*o+#1LU4Br(ZM.V0DTS@6$c\_MG;g,Ce!TSGte7Xj(E*VRIrrYaEVS!G"G3g%o_!LE(P()E/#q%)JnipZH2!#i>3-a2dD2$3pZ#XG!J?(AGrV#WJ%*(+`e)ec>2hi9a#dVW7:9G.[=)rSf-.kQnDUfF-)nQ\UN/WDm,eNVLe/tsKKOe1.j1)d#<%+/?/4CVt=<:@2+%m[RA4r#s.p&D4-%-StHnr9G:DqH?C\#!ng9l[CC6<_Z7^#(&/G".\.G76ZlDt?"B[K05D+-rr=80J$`5JI/]=[86$R$a0lLL5moL'P5)]K^D;omB4Kj9e]Bk_;.k)Vi5&g9"cP+3P\p`]9miL0]:cT`Qr+Z4&d*&VIF$mNd=7OX=Oi5n%S=A"V5S(DO((7UZlh"jKdGEP_U[MW:p;\Yb/l'#:)R_0m,6[:5ijT5]VCNFQC$IMqJ#n)[PZ059(Be>cMJB#k0*e8L]LWMpZ1VU1OnQp(?Facg6qbfBL'7EAu4Wej#cI<`ksWVuZZB'=p,0D0!$CV%uDrJm4<-BTpA^RR=%UOB*c<%jBS*?$i#j%%#6P@Eta\TEIJmbEAfY$Sdkp>(ua=4XQ^T6e%YaV#eYf;r-8jlLXQ=,>Y.MoLYk0:J;s/R>q%PTaQC%M#'a@7"DMRQ,'(lMC2>7HO'Ss8K&=%9]f:[4u12Lo*Ccr0X#+2&JH5]OZ8a"OP&a:S3B[!A)4q\psG]";P-6o0iOcEaHuMp<($)O')?qeKFD,n`('oeY96AL.;>CbMF9]oSLV/3Cd-2nWVU-(g2)C3l7Nie34Spb29t0%ZmN4oq_kIPAVe094R$Afbrc-@UH.$JXWUsj@"EI##/8lN(GtR2C)-61qB>K)N7@mYkrQ`"mF^@md@`^aVBM]E'NCpk^acAm$u4aV(XbKe?PdRTcl9$Js>0#=YkB#AAne9a)[\T+]PkJOfaJ>q$CS]_CJj";Al.b,9:]Z-6XnV\2:5Rf'U2%bqASdlC"r(e,gCY,`^p%9Vb5C`[f`lsBhDgtd%PUIe.Yoi'G`?,gZ&CbItU&$^GsOWe06kEP]%ueLO\]oD-lV$JbcOj=b[d2`CsHSg$+:'D7.&GqkB7/+^bu`5oNHc-rSCFJR6U+Ig%2RQD;mU$lG6QZH-?4GN$,h5XHu)mqt1pZB_oS8GTEQ,iu@@lKg"aQKY);$2);'P=V4=ZBk@`f>c-o@]g)<(bWNF^[*Vhln5.5XA'78uf_Kd_(=BC>IOQ'-7Jkp[@S+U^9h-s69Sk?NWGSda&2Y]ZT!_dcV?1^B`1!.Y[:/HA7LNnaM>XJS(i`*:d:%-WG6Rp?chK_8s\6EH0kh?\YRn%3.pBQi(shn)O$'^]Erlk,quh(`KYPo:Q5k$fZj)/M((okMtfP@c^4$03te=YKb7\1osQL#,p_q*BI"Y=2`(s5t[tGPs?,%5?hQ(,(M9a5CE7ak2tgmls-Sl/bl5emFp'6WXBRnJ79Z*h@0o''pZhTDnl5T"3I4/+GF_%!"T.@4cA.f=VN2qHKij(a9G_FHM-QhQBk>`afh45;\]uoNsgkH=O?*AOt@eI=HEbB1!lQjIJ3$aq=?`h*I.u"$R3Q^@aBs@jBSCQTS%i6kKLM[I>bso:hq-[--5+FX&_M1=eA%Rn;#IDNp:@_TY_JTF7SlkQTMZqfT>O@F8mA3k\b,VTVq8Vbe'j"/nE2NSUDn&Zlst*hEXVD*]k>$osY,$*C"RQd+gG':$UD7CH-iY*dj?#+%HCS4%.jDsSg?4I4u`EpeY%Nup_LaiVZQZi0jshq,&=ccjU,91qp35sZ+0StUg!GOFPRj\^kr!O>QUiN4%XDSY5g^OLb*kRi6BaGUVEf55(>U`+(Ys?%aT[Lc7$mtdYa?Y6U:6d<).&$TjR@g7eQKF=Q,3^Y94mMb/h7>X.n3IEkK#gUlqKF/X*%9>'T[I(''p?V5)9:.%oG7jh\)hFBJnrqJ;?CJMOsl1q$URW?TL/hEolP>1JoQT0j[)7LpF1Of1`)`-j`+_Vr`rfu2PhduDVs-r6%?QNCGNJ0fj^qbkt2cIbg>e(J^=Z1TujXj[Te>NCLccXJ5GO*gH6Sh:\AT@r:9LV0'l(q8&^r*j7[;(HmqIM30qmUK>hoL_uF+2#]TGf]GHqAF&&5aPkLdD+;dAV5*TkVEmY>S"X5H'Snk+WfO>Q[TqfLs'6L*VY&"I4_f]eo80<3^27e]U(f[9/XE^#8;F4_2Wqd[-`o$lCZ@+3ZbIA4K-![Ocs=gfu:Nj^iZAo]k.S"QDH"`(Cl5^>,qHA[g)SXVGJqCM\80/XZBnrOqrJEdk"_O*tE";jogOJGo98A@b>P!Ldc&3N9KIb?)QOfN._.Lho5a6ufqK[6"!-*l6+Xiu+%+HOW_*9YV%)SjN2>#+92)P"jj4HgUBC#&AXnN&t7CRHZ[rH[jOr3?+H,aO:\a+J[(nW90YX]3)Q/-_1M;lLCRmnUg2]fR;>!7S&*!>^.\&GBDSuP$dQPu,]DK%mGS'p;u?5$b0r9pj@O/=RB7b*dGd?M1#AmQ<1GiM=di:f#(6)0L57^&hI-55.bPeUsaea=>PpEo%;"'B/"EJL]A5-(D=dk;*HChQ#EZT/Cic333-d2b2Y7CQBl,pP28oiNn+l^G7]@0Qp]Bcr#nGk8"C2:Jk.N&G"'J^lAK,oWjoTj6C*eT`kk&UW=`7&?o)Z*GH:A:7!<$H1h).%>FEUTn.qs-b0W]6A1>oOgR[W2MgZBiB._W?,]g=]H[_GtbZ4"hjcqiPR[B/s1'W.loa"a^_%3mmuFf%a/?*LHuu6#p$ui*g:N'VtKL3qUW7l-fD*;%0m!9Gr(Af>;^9o12u8D:*dKVb6)'g2_BZBgfBEo_44F>U0H61gO?Xq5W@9Wkn:D&YX#CcXkS>Tr>]Oh&Mb4*;0aMp+=*Li\VWfbTPa_(1C:/c(X9Tj>5HlK]7uf8XT9'eZJ/FgBHQ$_Er]UIL6+=#3kZmbYVbQh9FbRqt0\M5Z:ohE63I4Rij`X6bm">K3g%`eK3WQn@f?h,MHq,o^Js9o51uQ*I^O0P/D]'.%H-ri\ud,[D_%F+r8njLB8bk/_%G5A^H(AZg`'eKX7%1obMZa2N)pnmsd#K,W57q=CM\V<.!mX4_Ya'2]']I!5I7qYWorb%#9?Xi>MK#UQL4k*3\^Z)=[P``Zus:9bbM#s%q^nn#RNeO2%l[BZ4nWs%"jcOU69U78l)<;b=[%5$lLh=bKEP=bud,BhRn,p*^/0L65*3&Gs%gJGN,Oamer#$%FL%OGflOV2'iS;Z=1n?HJ[L4#Vn1oY#D1>VJ4MXJ/>i[cE1-@Jt]o-3?+H=TqU^`cdH<8a[I8sPTZ"p"i5?aI!rgck40@Z8Q`;'c2rC%Z*pAbOJmF5[t*UW6RiP6,EM"W7.C$MpErbZ>`0;A>l)<;b=Zh/r:og"f%,$$]Qs'ba_JVm=gM@<>hJa:'2]']9L>bqF&;[4CPZ$@^f0BsW_nVGdV%.5""+ln)^^p",Y;>hf__S%2sURFfJZPAsR%@d(r%e-5uP"H/lp<_83Q\p%>@eXLN<+3"fr:6uLA23pK.=*;E"_iO87I'0Sr[eO$DSl\Uj)#!9S.6^tkVCNFQA'"QZL_h6uR;NakuYDs[kd^1IaiJBsPk*g9jeSnk:K3J%5,XdYu#E/-iD#'GQ0I2#a)b["aX]lUk;*OA2P%'qu8>Uk^o(^Cr1XI;'G"P.3P0J'$YV/r;YLBDkiPit":C.=Ma^tu%86ur!ftDZPWjGVdHGHk[MOU)3/TB4b3HGP(b%%-^`QI54/R-Yae^;s^'HJb>#SPE2VeGW33NAQ>+NRlk>-\'8Q1A8Fd\TT5:lp'oZ$MM"RAlsV',)%s[Nc]G*1q5.YgU^)kcEPZ*9\]!Gbb+2YZ9`(6RO3[bET_hREOWq@:>ljToUdf)a[#S$ERQ>BFZE2@(J[j??Mr$Gq?oJ.Ash-nmp.KjQl&%Q@"gYK5/o/HV93.DAm.f%2\*q/]#.1dP3O9#3A\XdU6%nXut"AEi"AO'.#=bDVbfIS6EPVb`)4S%Ej+QUH5dl09l=2c^%G1,+NQ4IM_nUu-ZW'I_PMd1K+e#,*^0ie[MmSj&]oPcg#VGkg7I.C]D&c^SQYB#^%I4c;'ik'Q(A[r7"UL)W$eOF'W$%t&eREC18u_rJ0f-3auWn2#j.I"o0ojp;0!lLsTfjIXB2P29gHQn]l4PLruS/M43s]mIZsfdSA2%NLiP&HSF5a\_?P]GiqV6@jmfqB3+/`lCG"[r]h7dU+#$Z@nnjU.-/'ceJ?^[VaA%K4AGT8V!ut_l=*`al?hn&Ns^2`>8+#d,@>\\X+p3Ll(BOU^=4QXoqaFrG'k8DqW"M1mjFEB2sp`aCAnL=13"3951KN@s)WZV1Bl^=C4i73j_Zh$'I'^/6L8tG&>cHfD!pSck;/Fd:ioG*aSqs!/XFUHs%m5^4M>=-MAZ`*#e[n)k"S;NPfo!58G2&_W=6X?77M>c^%'MMGN5;C+;[T(6#?e<[K8CPA7ZO4W.&IDJ):C0UhTVe\6?2S+=AM=\\P(DKOGA-IOCn]A5a8U[Ol@sZNO,VhjfrPtPQ>s>VPm38i@spL'k[DoX9s,VMZ"p[XoY`=;Ah]RlK0"1/mZIKN&XBG#(GC@Nr]WMDS=CB-_%YK56aUemb%!;u>VTd1&9i?mJq=%mZt/hP5_`Lhnr9A1tWXH,.m0N^,>!iT/J?bmnIG\HVVL2Mg9d*b&?GbIn[hr4tpc')%JThP#ZoT\=Wk\+bd>$5^655iarj52LsL?^C-g,-00(])QBPfIeFjfrP(L(4$GPf.&YO(X3&CM@Jh:"p40=\8W/3IEf"=6P*m$k+Vt\IIcLiTdjg3\"kTp%+#:dF>WH(1*D\&\Fd".D$4A'-d>@/:1[EW"%LB9o1GdD,K3iG1^OF[eXrl]ai@t@O&IC$#Nn/$sf4)lIt"9[bj*$Oki;(^F<20+F5nlS0^6F<>n[k\=='D\#6LFC_!$$_J48NYHmNul,9-3;*u89$b;o&RRZF6*b`NbAtdBWt2K7cD.a-X([FcseGUm>.Wineb(W%HXi!o'ta1[Tu]=:`cCR@*C]4(o9RE]6E]n\g=BjY?nnoMjBTl`3pnZ!m5"0bqt[*#U0S>a(R4Fo1l]-e#(BY2,eTQ<^1D;D3leV_R:8L!m5"0bqt[*#U0S>a(R4F_bTm@K*Qcfs7l-E8nc=]7]TRl\p*Vg[MPA6b%!9Q1mH#dTqJ%YJ$0OfjY<24`irAN%hGj?T`XZF-3M_p:\XAJ@+u&`!Tc&)AfAg%KTIGb[FV0IQVX5;Z0_p#!-MPmgRIlGLM3]!9Hm$)Vl(IQ)m.G<3+(,-pOkKfd(:n`JpKges?<'`eNg[;9VaCDac(.9t^ktPsem+I\jQC4//b%\t4`lF,^iL$+DM1\@N-8U))Gm/m>),0i8B-j<"KLLba:+BC=HYG$O"jR;GpE*]Y$p4:"QORbI0&0U2GLa1G^i)\H/P#FmIVg3Y0V'[VXW+?so(gT?jqj#bn$Rk2oF,11f7NEGR^g+DO>GSfC/q^U5S.LJrVCXXO8%_W'=JoI&-P91\Zo\e&n>G3['VZu*DpZsn(t1AUB@99[N.XFV37C?Xf\^Ri4oB%*C15>5nNjRPETKpDa.jX(q(G^H1'S)cf=P5hnI@D,7(#[.TE?s.i/a"5nLG4eZ)UR"pXPR^Lu:5Q062K+8Yj1gUD*6gCXQc2PHh<*BSFTgC"-MKNYd%h>-[*g%GJ5.4hlg'Ie,7k;p`f(cM.op38$NrbETqJ%Y`iXVPJ'aiShnFMKgDpDo)5)CMRQqB=$t2JfqqK`5L<^g6O6j/iGVRD-miB"o/)q];quJG^)4&Ni3JH(+k+jLi"dV7+j\Or0YObh7.HWD+>-?&OUkj3]u`e-LKU!oB4GlfldTd36eI'X7Z)XnZ-.[&g&2+r=='8Lo-<,T5SCV\97+<[N.XF6mB[4+*VgK['?l]q!]H]^*!\Oaiqu9Za7OY/*+m/%j+%XT/gtID+>.*fi5.]II,UkCjU^ULbuhoqmKnK!Y"(@+Hi*MD4604`Kr5bfQK[=YdLlE^3hrq?6G'0_27mlJfokAPEqMHC23Uc++LN^L`4^OET;NHqQ]DkJgd,0a@HO@#I_<2&-P91)&YP]Ye@_u<`U!jNi4+r7ZFER]/JDM+Gd<`H1E5Aa29!p&4At_q=>ug/g(Fh4F-Kc=''UpVG1kgU7ObC7iN?bilj#Cds1c`/]ctJUa3Ah5nKj1S2kZ1a2dAs[;0S?Jfq/BWDf]ePq)b-nUk[Ke._%P5U=,^KPa3j7+k[F=fki5L2ART"=Z(pbR+aeeBu[31hfi_:(H%H+Gd>6HM&b[cTcI2#htBs1BFrp)+:'/!"U,',;,Lq;B(#*TB@!/\gDpDo.`&s;rr2n5H_KS$W`3^/o]^1=JKW)^+sJ3R+Fn;^&-S,d%j+!BDr7/4kD+hJB4PPWm1+^rK@ngYB_*Z%.;V)?k&g%H\O2,^CjU^Ub%C%p[H?W6"U,'G4+\SGWS"IcLQ.;<^juU@Fp()F:3LfhX/g$^SitbM7/`N;ICbc3(Y`7=LpBTI:?M(kDr/-8gCXQS8kYTQ[_4p;Kemf49G8)'GOOCnm>1VFCY(1E?/<0+4LQ7r&>esD5QC6Kr8YhYZgA$M+:*Q5c^Qk3N/`f5/mQK+,9"CX)`N"(hW)Y;fldKaPYLuEjftFD&-P9uK$_k@%hF`Vgg%9.d0R%`ZF%!G%NdmY[Nc'PCg+8`)&="-[MK4$.#KBJT#eRYi9f:.!dWDRVD@Nq)3X/cW6R9H^;>op1OZ,4]-bLG%KAdYV\I)*'6:d;$&!Q[C*EFHs'RA4K_PV#/!W&9C(68US"0NP]AN71-cQb*^'58LCYN'7ueSbl-h"P*acX/g"tSW5#+U)#>f)]56'!'6YniYM89&qpY`T'kLaq\6'P*A:7Xr*8?q`qOP.+`;WP*HPLJ'_=0o3*C."9\iiGjk^=_=RNedA)R^8H_>:q"aM/_jk2t0`a=pFmITn(+50B&M[s)GUY[nPU^>#[VaAm#gJAVKe-H:bg+Lol%AH&;7C:jY70[B?m%3k2rP=Vap0'1(dKs4Jq#u`l?#2cCC"r%Wk*u)Dr.JJ.r(=pp].0;p#t&S7BEh$"dd]3<,L;5S)e38jibAGjqAlQI`hNri;]1O*BsC6.2`&B2VWj[^NWgHa+b#U)`CfGlRdAjia"*H1PWkFuI!Lf<-.XQGVYBEC)tn3BSlFNI6((W>mAE*acO&X_QCdK*Mq,:.*L?F6ARdXtG0GaY#8,`ARFH#4hEN;t9pO,`c`mY$J+kp@.R-Mi/h[P;&5!j=u+1N$)BchS"7Y>_NgTneaCg(DiG$c_&*OHIo<*+Bk/Rj'&j*rV>WKT0Ihngpo5o*_Kq`5do\5CE5[C=F[.guH0LrYmnmYct?pmS/J8/jFjbXC&_+4H,Y'#=9-@++O4Im-Ms)(C6aOT]\$f2NEfXQ6_MY6:0U-7I?'cY+X-]fbWJQHJVCl,>`k/2&JPon)B/JNqfelC)MBE&/R,*MVg&1?IC:0DF:K_+$!PFS00l02o"DB9N-L!pkMG'X&_22n6MY"Au34F6W*T%u>DhIP@Q"Aq(*qXeLUZmhs2\T?r>m0eLgXHB'E4^l21D/J[5THFY=L9O3>84\FA'ln>8fQIBHbfe2Ye^`K`CDY`c+Gd=+ZtPT0[5G>ke#-!Jm0eLg/9BpqQ)[ib)B0XagUE5\?P#qBc^m:I4s0OQjURlRShk$)AD7Ip;)WuVJNOulo]X\=4+\R\-i!]>4$3slg*`VB5(IqGYj$'(TjM?HR+HQ!H\\kj##bl.dY?u3_C5SLO+p]BH042GHL5,9pr-nV@OhK!O6nUkr7;6IM?+=j)D+>-ljQ,C;V\:!gbI/W$U23_*;IF>9lI@Dn*C16ilbpc]3B0!_/R)74%Q/jZ^rr&t9he?]pk]7]JQmTNU.&mFJKW)^,9qiek@8ID"@8FEcThG_LPJ6pdABX-GOOCnm1,l-'GM6)@RN@Li"dVKE[m9SEA.icaFVqJuB+JnaS4a0(//qq>'i&qgtar.oraudF#LRrAr\n+O]K.[r9`m:"f4A6!0e&lde4FoO-D]"@6"Dbfn;SQS5]4"er$P]6DT:^gP`p=_p0O'Z7S/oA&-Vf_,A4=CC.,M:JV+UL**Dj?.b\Ldce)"@3SV-9!m8a2c6Xh]I>ri')M^ma]_4aihk;gCXQc.aU7/?G-(5fK0VB.$>p;,8jGlj-_XbSF`.i4AS,h)9rM^!bMTM;*[rC7E#ZBLk;@OJkD79&f!+`G\7MaT$CD3ml/J9cL)1cb-97crm*N%?.3*8Mu)2*Vn6QcRTZ=JfcU#Fh>GD/eFR!_P%:0(:l]63G*d"r;Yp=&EPQS4AZN\b=nCt#8@[^J*ljHhAu:.IfE6ULsYiQoK$(CQcY0k/(#dU'\;9dZi6%/r]u(kdWu$CqGW@`;b#7ugQ4@Tlr=]6E]Z3^I5nLoI1ER51UUgU>5Ga[.@AXeMS"#?!ME-Y9Hr#\<0u`M)SNDH.%FWbU1c$p4kF`Dsg5d=?7ZSVHTL"4>Dr1nm$aE$#kK]VM/1cJ"Jf(b%Z:0ZeBk_:$i\>hs(HOWe`/(Cm!/4=V)fY9Eko1^3k2t2E!BK'KS*\`/(D*4am/@T0kbO`f,EHq+'XjL^@nLY$KN*e$HKk(-3%:KsoO4=1<,*?K`qr&M$&O\$q]/@aVMp:SIA(7Z:Fu0cqL0)Du8_LPH8.#VdLij2[4_>IT@e>eYX`-?LlY$>o5!mRBZ86>&TC=Rk(2044"pX/E,'c?q:+Cg02a(bm"*aTbAS=XSD/&NuqZ=FOAUfU^1mdEgB`6b3BM$]:eqQb)!RsFT.:P22H_-\:9a2EcG'@9ui?%JcrT0FuN,/f^[8P)MCT?F?@[tIMPN#KNB,,1ffi%Zrq`!!HW\2\>BD*'g@TbATHA:+=R3B7j@5U1MI6rXj44=3OVQr*MCfsBD?CQBN"qT"X=6K^[/aTeB:^:sU*_hWq@Ul65.@j7YALu:"mdUtHr2W!&SXbeAQ)\pO0hVWZ^CDuKP*CYZGildr=ob)4hI[AHZfR[]eea2\Df"Lu"QX^8^;b*=JD-WO3+i%Yg@;+0o@==LQu5CP.i]XV4WEhc-cIe`E+d-2)Tfsu1ei1HI;;l>*Dr#'jI041l[Vg%h!usB\"9(tg9bf_0Z=3rt'pkaCFo!q[PXK(q;c-EASitk;.p#XJrY58kE-+hLLJ/MBo"-SA.nO#3]2$U=D47Ked/PtHskM.thZ\Uf<_Mi.u+3RluGJq*NN'phXb3"Z-^;cC"iLCT@e57Rr)!-UDDjG;0.&Q>Q4\T1,5]'8PHs7bE#6K_HON8UsmEd"!Sp#1O*%/`W%FXu?Mpcf8U5']KRj_*",S_!,YW#fZE7uua/d(F]Qr:lTq&NhC@>4(qEcdp[u>$>+CHhYh-a^LJ&hS!,h:G3q;6]g*GR_=.H.*XY,tip:MjX(;HhZt'6sZ+p\"S?T#7@#-))?fa$L6;#1jlcM;=N[qpMMH7OS\SUH2RRI@]Z[\Hu*S9/p6e7[;-S$ng*nf"grb?Y9jVLppkGo!W6`",3#k["2](^n)'m$R3)-<+Sb_u(_JkWEahI=6P=s4Z,Xps#9e!iB$gD#aM5pil&VeCE*#TFMr$+EUr.P]+CS_44HEnGUGZelM#$b)d2t<^^`TU9T@N'UC=$E8oJBe'\RcE)!$CGJp),n,(:po4j!Zj#/gFf<<]oj&ADLHDH@A//\jCpm@CI&NhC@lL!ohY?kOAbe4TXNZ>$pV1iP;7uS9N[S?PMf!B!b5[m;qRQ#0A[r:/WcAn9TX\G9Cb\okU77K`RSQZmdK#\l%o0Y$EiJT_F)&S1"]6C#c91q*bp[="D3&i$n@\W'%@K8B=>2_f!*")@`?6786e2-]81S1Y61lZm(F`eE[7q0WJs8MoAf[uSa\#`N+:.",D[Z'-![fD?fNrbEgbn55MqF(;\2mm*`6,;3^eEu"("CJg7mbL52^o6GA'a/c,U!f;Fd4/_]*^<,`;92I^kMrUDTf3,#S.XQi4>(dh4=4++m.]CeQUE^Hj3!W;5EbnE0/80^@DdhiC^g*gY$JZ8Ua2WI,c5t\nF0g5[SkbZ-m4,W3^-U2Qm*aG&o/>nF8e>?u3X%P:+bX$pQuAeLT^V(LY;qcc;65WJ;#3Jn07%n@7+>n2Z(Ra4:/4a2?\I4FF6>4OD.6tsZ\3u7cI&dsZ(eTgpP>(9qtJutX&lLMr$iBt(asK(A]k?#b7_JsrqLIf^Sr[9ZN;[8Pra.d`3(b"TRG@N*"g0Jm3prNY"bAm*ji4>U^^f#s!B0YO71eV!gqbn6PC"$D(s#@qh[5g6-d4a\a*g9C4R#U%//7#i?`X&6([?m>o47XaHM`FkBVS7JRrqT'+$]fg$IEJ_ahEBq,^Ks[aHlg%LQhpV_m(a*iZB$*&CBk*DPnQ8\Sd6AN.jMKGm95H]S=?h4s,$XLq?id-l*7F!^D\"/d_cIM9j4o;6&l[4,PL*6#Punfd\M`Hl'+1QGUui9*b^(EEmVWBDr)W5V2P9L:f1%#q[rc&0OF$PDN8E+rVM2Uq+U@WSacafjt^ODnTk&S'3QD/F/9+7"HSfqK#bgPN]hjhf[%l^rquSO)`Pbjbad>(*nChC`/8#:cCD`>B5)'ol0.>5>?ds_JpQpP(LU'cmiI2_^OSi0h0Gij^uJtmENtG[0ens%\@B&*7CLU=8,)5pUIgXr"pP9V[^/`"3^p6\N8'^SA(9&Zp%A"To][TB/on%Hr#D"pK>1IV(M`a7iBeod1?Rri>kB+/MVp4e&e`R<*'73Z0f;B]%g/9gh(/&t>=YNf;p;_*!FM72N9/uJG*\fgn%[6cb5=%Em,L4u(fCP4B6jh).k6.k`)PGcS2^O6^dH*M;jIUr+4QugVZr,"G3ROWM:InX[;+S'L2kS=+bF>N6gZqD=3pVrs8K/1_@K6L^jH@Z,nBZF6&@,=DAN\$84jb2-3FfePt4bXEWs-R\O/B=s0I,(dkR<890nAH-_'W2/\CPAJ'VO=R5]/kX(BPfFK#Uiq$=$D)mM#RHjV0p.()CS\;BK[6GnLu:!BPr=676q%^(A"jS^K#a]R!3"+)fpMV-m!AI_7;n\e++?p`1_DhsVU@s'R&DDWGYD)27.@]C#etQ'Bi+FX>0P5[Q2gS#HIG^[m["\$4=6rR7dueD-mEn0<2)eM\27mrG4r@\Zrj5f-qddQTY9:-c%YV5.2'I,@Oc3tO,8`5JHMY$4aY+J'PD'RNRsOR_lSB(f;PVrF:*l3qX*[thTHcSeFi-,Hp$NTM70+N9;,s3Mj\;,)q/eaPn-g*GDfq5>X>jkGpob,:S07-H)$&cD7^'#A'e.W'dtEVu@ABh).O2Ji;IT:JIqhpu7Q3nEjPs")tlpDQSEkY$@q_*hSJ+anbO/^7p16Ih_p/HnT+6$>snW/EZjVA\I+XjR;#HZ7(c0T!O*VFOFu(.,F*5PWYH9;jIK6Hb)aP4@r0j4o7s@BotJ'%f&p>q4QfR:WR.ToIZCbeAMr5Are])>QqK#L(@a']\P=p4'et7r4O&r.[0dIoHGMWKp)/lN@8DV#..]?E_kq_+bIbQ<8%Jqj,E.]LX1:oZJXsNq(umCSEUH@$Rpg(R^?l<9ul<@clSg;VngceD(BHDmF3Ld[,9\`5P,-.Em%]gN;4p.K\[[iY!AOql[WKfq:nErq.6j*%q3bq+I`DGT:erK7b#Irnc&K#aqrg@D;5.h;'K%_FVUr>,6Ks"IL(J.?+VLL574#;qW/)rB89rH;4.fZ!Q(g`dUkOSI,u%m+/[Vj.0p$KV8U[b`.qJ;4BUgI;H$F0cu2epFn@)iF!mt5+9:fb_*#41`XUS47';t*GYCf-9lN4,.4""!jO:Y@fA^^pg:S&@E.WeHQ^cTGNX%Db#Q8"If1#-H:eVfK>pTV%5hr`&A[iume6tdQmm*D6e?8?fNnYLe>QA+l/?hIEk](A0_8J']`aCQ6ja8f");=Ei5(4om[RB]@UanP1BSND:2K.7MnFRdSGM;t_r_[<2[E/kc$G[LI#"YUSn6hHG9iE-HC2.HpPCY8pM9Sf+Ad.1.8%^X[F<9.sR(A@NGB\stC(9Z:(QMuj930;>4dl-)PB*V^[L+.i85Ufc,*s\&+geVqV[Ot7mCb>WS_d4n/Y$F&Np%A!YDq_"/4l.X].t&>*KsD8Qf2Q8j,;`$J"IoWUo9\<\c*$PY(i\d=HkI1a`N&[fZ$G$X[&e?F_7`pFEeb`2cthrVL%F:.3#7*>TtZ!,fUq8_S7O(@q7sEXWYDlFV8='Mh4l[f/)PfHd(jJ,DRLZ@4srgUD+S8+lDO$MTGhoU;5C-9/aD#VCYK`)PG_4s"40S7OajqCgChK#SRC>CtbTBqpE[#'7nb\qYt,cE6_kEW]F$\WL!s>e-`6Rc3#FQamh?%K;_V%J+PJ52EJ.q-aKSEZO2Og%d.an`")V6(Xca&Ua(-/3O(()es?dn_fV;[%SUeX@,0oo*U%'Dr.?9^.iqC?]A63J#Q]a/sp(b`_TT9=$I@BCXGaY2$q/TC[Ce/BPOh:9d"2^P*L4&,Qj&0-/d3co?CFg)AjA5$B1f'+$FSRejqfhpjJ_tpK+2R!0-(mc4e#1Tsh.Zs$"HJIt&F7-&4%4R4pMP)o1Q.X]IY"jqDW'6N949n_iRS6/-'_c\=-m.Y;u^[jaX.F;K:.X!3pu`dnI/T/\ImPI#L=aPK`DB/QZ'[*Rp8*"@-ND_`f6J"qd+s(D$SE`%UeSo"W#HA"Ea(b+$A(ge;Cm0)$78773e\1Va#CiH=0SmhI`lO5Wf^@jlX@XKe#&I,o.G*BTK^K%Q3e,,;^IZocJZ8e^i-eCJg`XGj.!"j.@VkUqfaIallgqqtH#/[((T-rD*C0"iOnW?IV4>+Qo=Z7=+7G+`s%*fs@D1]b#/M)@E.p+JZ!^bbP^j7^LH,L4F#hX?a`u)YE[_5fCG;(@BcDpp#Xm!@]TO3!(-a&eR*r+T:;h[5ILT1J8Z;Df6=$'ufksN5p$(9X3a76-t>;Y>K[p]HU@tm2&F2rtH9)$S?tN`)PGi"ci[/;]]Msc66\PJJ39kqk_##57JF0ZUhoCrL]ohW#>H_I6-6C@TJQ'p>JEj#6g=)Xj/_bh(3;ES&*rB3bJErJD]7?!N[<8@j2$55Bj.@VkUbOS-*clDfhg^cPhDWV(J)Zf(X@#hN.A/OK/%"F>TJS;4n_9Tr-m1-;XP3;gYm^Xp_*ULX[ilpYG3;W*(s^qVTEuB5ZOGKX\LE36/TLnQ9,fCooN.2Q'uj`YA$,sSJjI:aS!0U<TmM;,1P2Z&VH#]).S0oSJ8jAbc&%7M]%XrI46tPG.lUmLh0Q)8-U+oD:P^m\T3)8%L']/,2t>jEs9X)^]07HQ'5D']Cm9O!j(eEZTe_6M_S]#$j`g295SMd?.PGR>#hWTeCE"Q,\B*Hm.#eMkErBj!JX'D=ALNQgrRED\N*1o`'XrP03ij29S_qOI0WCT*QDS#N+%XQSQ9VtX7sV2j*jdjTb'/<3`@!dMr"h#qNJ@/tQI*qA7qFo+(C"KrOh<)ou#UO[RWpu]#/08aDVYuibLn2!/fldrtun^GkO*2)XF=$+Lp:n["1ZX.d5ld?Mgic1HJD1T*FHWd8(aR']):_5`A+s'CkRYN8GkF5])SeIHs^b]iA3F$Je*!k0?""uY(fYGj)g8?r=jDQH>&hnQ)Bt;(?^s=PZ?J17cW+]#,:AmY`!">e_*m;eoRV[0hK:&Y0QG`CFH->,lo<.,:6V$2,9"SAJ$f,OJ\c_X;4T8L#7(RNAR.L<*lGEi]c`0tn/1IPh:B?RZjoNOD5)c@gJ_r/;)X",-MTe?oQS2I]2S%!*_(N8g0?sC?pCinWWG,ObiRo[U.i.%laYPfY)E)@7hkkQ.o\>.I"r+)'<^:\"s2f9(#W5'lULC=kGm2(Gi_P>SWP'2i9#ca/3H+A;Ci##Rb9Nh_VM[s/4KY&2YfR_L5-RinC2P\QIqo>3XoJD^hLo7ep\Y]gY/Ctp1M]>BD1EQ%p)hLae.V2HY-Hl'1?&_7!,7$Ti5&_%qS8_3klia1iH5shDn"I%4$33'!gH@H]bYZ6EPV'0birdYYNECmmK\iVf:Y>+WhA.;#p'lb*f","VaIpWoHZ"?kM+Jt[i#RAq^4nr^&`aH*dSR(k:O/pJk[gk?<"D1]Uj'[n/e44cNKRW_(/_YCEV05!ZFPLC3-6C@T6&#l?NMD!]&"ecHMoR@\4T8J5cG^N$=m5S&(IW\eaZk6I7jn[+IeXHh5leU5"F0,F\`W%1(g42lMW(fHf5b>EGL6J+BE]$YEsLYb2TV)mZC4e(Z?ECDG?r5c2DYjK`'Xn-!:/)*cDN.Ur;Dg6q1HA.M,lArI4BR'%slB7ipL)O^Z>='cm!^.9VkHPnJIL0n*8so;g%d*kl8R1N=;^j<&NQ9!t[\R!71S\N(0e.D1$I%f/p*]t"F4Qh,-N@El9FmTIWbB4^_e0"@AK&ARM%^%I5i"]KZ*D1GA4h[90ens%P(q"FW[3qMj4N+YR*0J4:.6318s$lKbH7>c(amA/'Rf#TB1OdWK(hF*'n>\1c_V'.mGR%1beocM%iu7p9!:or.Q$NA4:BN#;&r:L.'Y^*RRLe6FN-OBb/\tok`8'[@8oQTQMZW-Y$jn=J/>1#Pp8Bfp0_iPC/$^Gk&\kNT_:AP,)KUl&@.Q#fQtTsp0E#H1oQ(.[VXVKGWnMN7.@]g`=n;,rkIOuCZFN>UB:`\S0(F+t=`[GYCf-NSlNg;,e>#Qq2p!nWVWEH7C[HfG5.gVY9emQh)A%Hu%iNZ2_%ZBhto=5!DU,42Ks)q+'Ukm*X.*a'm7tU1+ePj$Mt`20>RGi+XT@AnG_a0Pg:=;Ub@tCJaJ%`tXh=&NhD;dT656(a%:JpoKgd/^?,B>LCe?r_KI'>?kNEqNC@SHP"aQ']NTC(9gs$Xt^(F&T6-/OLU$lP't'WG(1kXAJA[U4gjGLBnq7;e[J$r%hLb^NN%M7shuG,%fK;5:.4H1/*"U0),u,;$;rbU@[7/3u)`ni@_hjGg&Y_:<1-u/Qukh`&\2GF6i^IFBSpm\UAf24GgSHieb]*g38.h`/#.p&Np%1/Xib!"&ElV(c1MTTI2^9G&.qALm0<>a.+>ubXVesMbfjf>Um]+O&]-^O,4H!/h8/kI.3*Xj>g.c&+'2ZYQ;PB;7U]!Drn@2F0D`qi;p#P2S.Ols28K2s)M04dL?s:IN-htf3Vr6O5%7d1#mP>N#$3[WR\:[CK@!/J*0h6?EHrB[Xo$P&g[f)T8pV\fi=G90D+oRi04/N2b0j+*LZGT:blfmhY=\Rs\7dhO+Co2d#$^N^fK-`p6jI,*5d3qqtO!H`:trNF*d9^CDF:iPt-SiKI@/6k;i?pNYV?j:*g*q2n,SkWFsLJb'Of,1#[73ASYL<&pYg*KB?+!5TJF*9H&C>$Hj/.>/Fm\M*Pd?<5-9I_k5*TDg3m-IOX@%TUtCugL%:?hG\bEjGuLhJJfc4eC@#5'T!$fuI*1<0mENfMVS/*PZr373;-PQW$XOB&QAi%ZsO[Si1,R4iU^B[t&';WUN"&Z;<:!#TU'S+/S@P'RT&=0>^QrRl>'hWoAN>sj6E6^M-8E2dB+6&D:S4)OsjakR)[)H*_C\_(-.Jrc)#<;_!RdVbD+VC(o@J5>?!:]`8?2W(%t8Jr?`*=@bEV/F?!K4j>@("If5c$UN/pA=cTe\Y78d*/Db0N?fZ#^[)5"nED>W9-^/H`W_+pn\Vr;sL8m=.Z/,EA52E]!`#D`Wg`O#j\6mi[Yh7h.ZrnB@D->hYcd5MjX<5`$k$haPp_*/M.a:T+[^Bb$gpAR4e._msqa[==ghFn"_h6`#bpTD:6:%-r`X#jG/c5`5P,4Zg1B&@kt;V:E\cI4'=/<^&4'.\ZSnFJ/Tgrg(NB`%e"3dhoP0_&7rXGTXRO,9jCQ$PQ![_W#_lPS4W^UoP^bL'UZAkc-(=#Y$P!6?#ZR^[!.^-_YVLDb1C8'W0.7qS17`OFUqn#5-jfPKC7*Ck:!S3"$&Q[PJlI3ASC3*Y2%@L'AHg`7\^>Ae!Y76?S!&U]h-V..I)IA\:3jkGm%;`;14\p+D[b8E6Vmd>E69",g+?Zn7`[/adI*tEsSc9;&WVco'`EHaUqTF1e&g39rE3cOJ#1-RBlp-9;90D3%bK'O\F)S/4O;&ZIhm(ppfugl't/"!4(cVTW!]Th@oYS[(a'/n'%"_USauKOrqQdZJR.NEa,d3q,ZM-d(U\0''bj&ar.r4_aO1^;0MiP#*aE*(PD+h^'GrsRC`Q-!9382[f+o,M#H0")OZIRi20@g\p&$grlL84BahN+R:=]CFL+`E$0ChBFGOD,lA:WO((_h/n5-OCAjA2)Y/_Jmk-jH^EnNdhdkKarR`$FkTp*0od?Zr%,ekoehU=-D*<8miT<,=+c+,&hNiN!:o5$1,Q.Qr$<\p@A0dki*rO;5TA@`8%El,Mbb^[mDa>23u"$/<4\/V'3ukC)<8Xb.?ng[emfTG>gl4L7>>K3b[$)DLK*?ma\^NQOXQ\@J]GU/V4aAR_\<>s21#1g$Ns5U,DW`"B!Ka;ktHEm?hB?PE7)#l0IUN#KTQ,q8!dNa^q"UV#o[n)2fB@ZmgC/bYt%#t:7>`\HQmK:C[:2mn(O7fa#.V^NOek9NnJb7*1Uk,G3=Lu^hds_:L[i$4FR=$Mc\SOp9a:M1%^V2:>nRC]D!6g!u1Pf3aql4[JUnb!<0RLNMCOOnpF^9B-A(P;l$KXq&X1.CfoIQ.IG&n;3J0q,e%G0=J8Q(T!b:UV!iSdIn5t7CMGXM;M5dkIDEPXpH5Wl:OLt8S!jpIS57$`tc.l'a_:]VlUFMEkEg!;rV(HPcGW$IapYV;(3eL@$=3p&-#62_TIhiCOYl\E8qXO@3/MX/W"`i&L$=jM]a_@5'Mdkc,Z-!#ALo)!/L5)F,H<"on,.[rY`)PG_2]`2lT9FgACE9MG,GT]0U\=`PiXOXYe//Q@5]n$q.p&n/K^$65luV%PIi)q?PWO-^:rsJ=ZV9MsmEm%pakWEX@uDg3-@q=6G4VOI3Bs_>tm2j6Xt*1KWcd#ElCMk6F?T5eHX_"W=)OVpU1p?e]blWKt:%j\jZ&rf>8%/3*0EXi"JUGc\\_Q$ti-mDFIFBka;`-s3&:b0q1.AqPXfb2Rcun\#s'*P.=^UD,_0UaJ%lKAistbZ5nT%`nfc."f@!74!aJ2e%']<=pi!fb,L2A9J=Q-MU$RH?bSl"RW\D`EK_/TFnPC_:L'%c?,,lF\\2T(.-Z3Z7a:QU<:o[@OqG^?;*9+fAB\R$\o)p$di2c;I9cJY!FQ>4X1,YrSWdZR0_$!o!l43?'q5n.S)A8e\OAu^>LkF@[r*?:'9DbUfTf)NNBo3U`Xp=`j,Jj[*adfV"jF>a:ZN9,O6(NiB6*@+iZi&5GW]$"qm,h3?"U2ML8q3MQPo%<]mI^"]Y'>i`a]1X.Rk"4-Do3l]($WeV,oSb9b$FU[`eiE6a)7E[;5lWo`V4B6fZ%UtnHM]+d]8_\`!./>17!L3qbA2#4LW'm1:LuhB0oI8*dIXitKTLX=c[["-VAF>p%[Vj,QY8.n7=5*$s1ofOQS0U1T:SV.gStK_-kErB*lbAa&i;'nLcN7RKZpi_En-CZ&IcRSrQ8TD;]e?8#mASqB/8X#CO-,VQ[u_/C$]KaWc-/TAHRT.?J,2RHHs&-ZC^krL"%MQRi`^29%k+\Tf[74*Xcpa,fFY1qEl=-a[]BkD5N?*fh'"^?dt5Hbj%%.enr\Cd:Y!oD^[9\+jOVkKaNJR($n*?GAs))NPWSWYe1oR$^KMWQ4&J=+Vn=TM5X5=")t-Fn<&4g/Y+Q(&tEpogoqt'].aL0Gsf]\Tj!7@G`6CJl>HPY>*'G`f1q9X/i^Ehc^4*-Tt!*U1R+Z@mTDbPmm2C)5T^>N5nf+DsK>s#*JC(e>_=2fF64^hCTm-m:kZs2:V2`d5Gdr!iqm/hBoV6]$Nc83rU1(+r?#/#j&(dpFFCX#e4r2HM1%>pHhta+d/1Ma*bI^Os8'0bo7Agp+ZH%MJCaerBWKq^sSI6;q8+u);<2g/+BX5Xc.@q$p)V&k](o/@l]41HC1-Vc=(XP_CWgj0,;;^6?mJSCgV8^"!4$H'2[3qqu-5MLNm?i7p91d'(/-gD$R.kpK4'V-$N9h=]WXO8TtI?-$n^)/bW._RJfJCB>3VLoPK#/oT]SLC]CIEaNQ:%&Tt'Kh,Jr`Z`r>?_?a$rhN9C`FHKGMcn\ab_ei@2d'r:oX"-Ik;,QGch#fo9>2'@r?aG5/R%"hohG3Z)q?=NhK=8TVVI4EgHZ,pftt?CYTaCC$Xt8?F?3oC0jO3C1J`elS&*:Psme>q>);l_Zi6fkt,0lKW]$\gpTqqB%SC'4f3p)'l-Q:TGJPp$V4&`Ds,N/Y?WNb(%_+akZLLtNtoa9\4#hRQqCTI_rFCX;*_/OG>_QBKY+44i;pZZr+#:13$3etG`[%\1pborTmktPY/#2BM]@O8',rL)`SKDJ?rW[-\hIo%]k&3D,u<`'BaJp\FS(ReJ=sqMYMsE;=:.cL$LE**67Uj[Qra!iJ+fFj#YB<_FIn?$"]"3WD2<+_PA'f(6?P]Al_D:QIc8t]r@t&4M@$!&R$e_9!44*d^t1EAe0&M,s4;>[mr09>$$8LS&283Qq1K@$KSra-!"t]Yrerg(UETq#V];\AtR>]^KhPa/ZN*0u+_m+>1>n+$,=*"]MmQ"]\;F5o,YlbKdNcKJ&<0f"msj9$dqNAIL?S9WVLB6WP\!Vo+.KcMm[ht[e'Tt2m=:Kdb?%M#EOmk67A(b6s]d>9G/7$&/LKg*J]qY;=[9MD:bo\jd];!,sVB!%PHmb*3"*YT-bX9]j\;e[J$r0+KPi!9bX_)%\Xepafd]"32QoJs`$;m$BI'9ssX4=27%+X2/)9Vma,n^#[ho=c@s(\.0df\dF09@^m,,,\oK#bf/g>q75dY%2;]t2@Pa_EUO*.'3hb%]o"8`P++kVHo%OD41!/i3/A_4aoRUICM.7ib#TaXXBp4IqnTRm\j;B'm6uI+OX&-'QA>tTlY(+r(]#%HjCNX`@=>>-uHedk6l]0"hH_Rr;VLq/\HloM-i4V%A\j]+`rOTQ?`>gU!fN#Tq")4JT$GAS$Q.@.)/fR2G+!b;'2#I/,OAOl612$4^-0fD^;6n$"VpM713*\[%mlaqa4!Itc\O+?GBcI#f)ST1MSmECS'-pDn"'#A)25DOj.PkdV4pV0EJq\WnIRl1%S7BN1.q!>iSed09=lfB!("g[*QT@J]FUqtD-eAsh\WeT&'^V58CtAeI390sp-5=YK7u'2H&][7d]@9/fs`1[mBt<\j/Zhnf6qN>c9Z4arC(r@(0_R4]MGo\dKl%X\'`+5^kL#Y7-/pFW!Yq-M@bk@I^OW!!o=hI1-H>3F@_\n_i]^$>.R:hXjX:RI+';Rk:!T8pTFbB,TM*TT>*hK&(Cl&p[o=K`#P(G%i-^)b&IVt%@U_WjK*1[kH5:a+X?`gj;cD(P`6ltG[[C:#N=D>4cH8KH?bVKEVk]0obY[C;/th7]I!j:4a4].q\T8`amc]J(E2!9@34'$]PPSC<8Ko8;)%_<`2^\hNZ:lnfZ*Qf[@%TWV$S6TJSQRPjKVrm9127e\]oO2`LFi8F&U9#"hc^*%R_4F9s!%;e]/;*d?u-$(UkpNlZ[X6ar'ek&KYtB;s)%>u1laaBgl5].L$s&uk(G5XJG-K$=e1b/mA<_aSk1c:Y]X(uAKA+Rb$58VXXp!KFqiN`!g49KOUAsplBg'"77.KXB>+F<>VobS?m&eQC?Sh69UWF"%`;O6u];Bk_9;_pm5eB`]qsY6c6d0[d[`lkH'T.gQLhTmlnf34@JmRcn3Ce9K9mC#MRN!2WRIcm"cN4ZM6W-Q=A^hL?q?LZY60sMikePEc\-5oB%QbD>6/0l8t^po>d5+Gk"V>DGONJiCA2UP>q"2fanY'7)_7V3F9s!%;e]/;*rf-M-91,T4s)`;C^mIBEKre,eHkDn#_jG+WLjn2icDp=-!OZB\$7YUnlp3X78pHS"lct1ATC%*5=fI>jW2)/gr'WBu"7O5]*DIhP5B,C'qfkJftHsjt$N58Cj9=&o5((d_5_u[2ebB7oLbEXSJf,u#nJPdS_$5G)80q/F*%buIp9NIW_1c3S-ern&BX;Y>,GN0[9Rlc]"ft,5/C[^\+q;26OT4IHuTR5(rGn]BFjC#Q2.K3MeB.:?pGW^8s&pUG.J.Z#@IR[\mtJ_j9hd3l8sRZP3Oj;`qG4UmOUWD4L:bDU\!*I)A<^b5KBs%!kIe^=#T]=sEh4Ydp"j]O0]Cd1,GNjEfc*9;EP57^>Aja,d3q,ZFmU_0:m3+>c\%`iA+E)sYp%1h]_9^],Jg4F$$!RRm^LNep&1p[@_=6D4TU`^d5b=:+r$9CS=98t/`JfVg:r+'-Cm"[6@]18CMLG5XJM*^:;W$isibO/"kHDHjndjg:-`*RgWd#=;bcBK^CqkT9\Ki]ZK*?gBVK-`m\;K8j:V&/VKdGA_9GU?U%0_f7rT#5.3uC^cWFo9_>=(9K7o-_NF@4/)Q%`nK.Y?RXeF:NVp./UVh"<):5j.G_II]t%EripQa0p!C')fA,o/#ucqfA;l7L5++@a+n"X$BK--Sd]=H[n;0GtFc7gJBD)%OrK1DfTG;$toa?tlb7l+X^Q%_1mjHoror?t3oqYr]:'Xh>W_+rtHMj[Qg[9'J4Lj+?$E%$Va9*&@eT([T?`d4N]c=F*$?.a41i7YsoZJq+TPU8&)]&J1DAp;#4d+93)mLi-Am,QIjCimc"@N7ApK4><^k=UBH`!%8#ftRMGpq.K]l+Dm+D]Tc89guRkXjeo1M#$4X[Y/b!S/_+VZR3-k:L&^-\,N._.j7iVndp2*05Z\.TNY*[WBbPp3SoSPCURYbD-qk>.!\8Wd2g!Zm#\=K^03`BAiSc!6$S(#(Sc/m,+e_YCOYNC=T.2C#5_^A;67lgn@poAjB>`>At&n4c)sqADj_'l[69.Hij.]aJ$COBd5/FO,&bm")9e6SB)*E97I.@k_6Cs"kj*XbKCP*8ce`o]b8;'+s3jh4p`lFJuG'c2K(4HjQ91A8j#4t'>?O^SQDs:kCsGY]"hsOio:C^%"kX_PW;d]M;U*CPr>JsnVH)LWku.R<5%,^iXkp@DZZPGXoDAok8MY&5k[I%X(B]Z7205Ss$Q[8`S#DXfdG-'M4+P+6JY%YCHIXaQ>H)Wh),7L(g`FB&O>4ZB8e2>l5jqb!S)D06bFOL1XIUlGP9((aG\g3u:m0\?%3@Zs%j"(IeSE`D`U*=`$o($?Hie9(9@b_*`O'I5>$YFIK]@&ErbH'q2t%_?o!`oSRV6L&oGp'J0B/E/54jo]Q,I0(!h@!?!rO,=;/k?@pipKpPG(hg\rscp`pgh)IRD.J_CaipVaiN3=L*'5h&e=[!o,QoFUO,JG]9<-AjH:-0BL?A_o/^B?5#FR\E1ZhCY,MO0+2[HdSL?n.[@"*FB!!b,N^g='E)\&jStkY%5@shPMR_iVh+#:B`S?7icr[>N7Ar=$)`4H+H#,G5$#(=&jCUUh7e,bVUkM.6$(4%/u!p6m)iH;7"WgeZE^'ToDm&$!hY$injMh1R\c9)O8TX]_KWLX/JU>E=XSa5ru^3Ga?Gk1i3ug/I`_iZtP=_Qhe.OY-)S'`iC>E?T8)4c<*%V4+Ca$D&mK"FisegJJRI[l_ZqBY>`hL+$KJCM*e?.)27rK!+Ba>-l[68S([1ano0I(X.bPfB;h3b%KACE`B#(+U=LJ(9"dRVRK#\&(P'FWe3Ek5W*a[c]Ld3]8NcA-VkmjnUV<.'&S69"YRLa8p9(qZfMt-@):7D#)'4Z.ikNV;:Y[!J04nT9*Q^9(#K4MB;&rqo=\',kg6+:_TB2S/#DAW'VPbY#+K?unqNKp.\GYCf-9dt=Wolj`ScL&I*Uh*K.&@%M-QSP<9`peS;bSN8kgU1'L^Be^s.Pd*GnI#j-MNb--;g>>MTL?S0j$mJs=g68XF3cJ->+5(IBe_OZ#7M[W!OD7J1Y=)TIri!?*2"O"G441\6ar'[PmlDkmDpL1U>YS$(#+k!"5Aaj9a(($e/pgBKe$jk;?$d*8H@.AY@ScfW#5[F3S;b+@DrCc4G/qI0Yhs%DN4\s?G`j0I0Xo^FSiZN`i>@VSO_X\b"Y_N<-/S[ak](@\*ae$gZ.pC#1oLO_8:(&:/fsWK5$e>-:oX"5Dl![kN%:?:&]XpgoFK[Z]lCeT]NTWIh/B-,)\AL2B'o6(X,3afgJs0do.GVI@qCQo(gBWsZ3B$k+894nP_!Ti].rotY\he-"F+@pBi-2JCN8mbSc5q&:I:@//4+HA)cL[+r/`/Urg1a98<6X(t\RW)ha.ZLKp7Gn-]AD&r#.8#!KCTHTgNF%dAU4.G$R/Ei2CF)0ZdQX*_5A2_J$"3TA87sD+b^D!*pr)apl,m6P5pBDq2QZm_4-qrUVJ)8iRmdp_Ec!X'_PEn5uab>q8l2bl@N<2KA'^.XaV^YmFaleW:s6Y!";_+nCW[[h^]2f>e#UC4P\R]KC>*m!B;"@!:]Co&,KJSj#TN@E)n3WKg/9eXa30;4bRG:a+nPGLZs,'*[;n!TroQcWdl!<6HXt7n:tpC=!M##^gj3Mb0kAiN_/jn/3XG++7S<9'@@&K#bf/g6@<3g%e-MbZhfcC3?dE<,:*h1Z*QlF*9D&7cKZCdkHD_X(Z0#A)XNa4"3:5B[QtLWMQ;f_)hUJKoQ/E'5((W1oQ.PZ>BRB/_d\!NQ7^k_pHV-pV&e(ccLu!\.[rZGgZ$u&)-));g%d*kg;(@17Z):cfi#d5'WTgJ#Wd%*;&8feR-K85i6hkd(NOpBnDC0"KUG,q"TOVHp.pHn_!6]q6#,Md2t)FV]NSo]9#Vi7-)#KhJWZPK!6D.-@9)nQc*Ba2s3P@kad\6cdm$hcYP#oiV2Hbc;gpsU`0@@*'AN[`^M35Z.pB@#tgik?B)5Y0k]fm]:Y6N%6e^@'dcgpmCW(h>EiqV7:P07ke)+L-I:8ieAO*2Ks^mLnR3<]Q.Tl(`s&q'49jAbpTEEX1g3.U+X%+9B`hnO[hk<5=pc=;I&Ct^_fh["hEcg^VnW.+%3e0ch&@I%]ol9-QZX1kP&X'_eH5YWj+SqVh)Ilt8c`RMmKcE2CHT(jcPNDQf3&qCfn@do/ngE9i"$^SA@*$1Ii[I,\I-VRi^fp^\WR.^):_.pcTKQG-k8cR0%%PO@TkTTI0.S?o$peT'YJG1oTO#^!@P3t4PdD>QF(4*J^PL@_?0:nb0HhOPTtjd$M%/TmA=h_(/Ae_4mf?@JLL+O5jMB@!KY*!@A'\M1%+hbn569flYECX!/cOTCW5S"L$=79eWT6Q6!j:=/Wo-\8>%N4sW:Rsh/BLEU#=N'TQ554GIc8uXHNZV"HTBQm572I?uh.P7E0RPVHL$[r(SROpkB1Of-^tPDT=hQH"GeAI:fSWg>3>\$6?_BJ@Tj1_.M.lu96Te0YI4>J#!6G]\W-#uc0gAVI9s?N[^eVPa"&nO:TcDXe8(U"n&;.Mj>%4T$d$;LIcHbWLend.uM]FlUjh#_X<6IMbji^Ne>IK>kZ*l8elcWE;O=`Fp0@iFPi+0MA.D#sC#)`FN?eDV]qN#)/7IZ\38m>`oR&H7+Et4_T8cg%M75C`HM,[?K&Qg)o*g\2c4=27%+X2/)9Vma,0i:fDl?Fk(i@^7-M;U*#;$diN@q$p)"HSCs,#uZnU/E=ia$`67gW%!fk)qsGOjosa@;HU)Q8j%R;$=`fp24SC`L3I/o5Sca`A*B\YrCt$Y@NaK?iOY.)7IFPMl5>IWLfuf8A2W(%2IVCZuShs)0ac,K8Y*A7GI0#p,EJ4a;Je[SZ>DKEUr;E,J[RoX9R5+G.YP<8%U!F%Y0[_E9p$WHMQ.BPM7!fOf3oN$hSrq4_i?4dSj-5WlL/IRl'jfT&P09Xa@PiT:l\HE6qaM)4hsbL:6c0r-[FdrF9E#aS4Sjm^;QaVm9oP@Wa?GlJ^=fQQF4W2+.NG"ef@`&/OIC.OnJHud_f1rK"5qo#fQjBIVcVN^NL;O,R/+P^(hR_q'-h`q,c5_Mcp8q.JI4SI-p0+k>=:mk_.-q(D$5oL7L(qR[=Q[`3[:CK9h[MOpDJ%;%ch(\B,;u@hk)d%iSg+!?D#;-p0+k>=:mk_.-q(D9B`UU^--B4#Tm%rd2uj]n_OaB";V5o,q`Nn2MQegn0L;%id<;_!jXr9]l+=S>M3l/tV@`X6]JsD@tK1k:KobB2IKZ@u&h-FcnlQ/LW%V!rNMkcmW7p4C!D;fWLo@O.8?kC%`X^#5%.ECnU$]V9G./l(1B-`@kD'$;(6rk@E9aR=i*.GAt;oPK%nQqqstPTHFGRRl"nQE,lfA+Y?E5r9LS,:t>*_X)bbX,ic.:`&2k7`Sf.-i0p6;QBm'<.K-Yj"$APbg`Loq'hD$_j!I+rO-M.1(Fh2'b0Hle?:>O3belEkX[A]@A1Ar3n`nMske&gbeCtoo&%8`/>RE>n^Q&eGVG"8$W5&ApgX*6;kTo969Vg.8d1Tn(*\4KIke`H,<)O@o<,*n_R<^V1h2n`j3Y*,IJkTET`@1PP$K2.kUm0AJH(^1-Ba:=0/'m2_aOhs#f3cY^dZTR01DX.\d>k!bi-P9_ZZ&'Kd0eP5.%F34Y.`d[GMe=+Je^gMl/O*X"HSfm!(EPKQ@8``@c6(SdF!(f"*C?b3"?<`*e;RThaF<-08k^IW7]Nuq<$=,SqXl4ipQ90p@S+4PiD"lg@?c`R;SZF1PJ!u4-*O,9jC.0Yc`_$l;3JQM75CtnE.f_M2`Pe#8me^_]8)6Xku2egqZ=Dlj*)/dLMh0o%$hQj;,LGiogXI.A5WMS:XH'=4?G4%O8VJDK,I,3juLLYig+b9t8/'K`;kAkY\`0dVaX(Z1>V6,H>p@)4gEqqV@_T8j+*$N+:NbnfC+nM[_9a=JmL;jr:.ZTrS(*FL+gne(2N7NB2Zo$`]gtdJ7F@=$FWN"FJIFj<3(Kp2d*1$,"'%/6J<0H#r_W+T@J'=+X_=qsss&>iRERKL>W`9"p;WXnbpV4Qsr!D!5!P]&g<1#d`e>`le?:]De2c?p!,eHb>\>1W7(_$Lbi2''Ps7YoZ/mP&5IM@q*TgR=f(Y%-EaM2L,jlJp:]8#>(!^D]:o"Y4OPja_ZBYp')`-qMZOdd;nL8(G?l)RmMT-'Mep%PB@]gL=J&pR[R[NZnll213S5QGQb`!J9f%$mL1DC@)r3dd=K]9eD77@oi!70+o?,$P!<$-dKX%8_ON&G>mBR9eN4ndB=p(5G4dP>IQm]`ULBKgK&iG/8)iU<$i[d;S-Q3_[O-K:nT0qgN@CpDhj8h#.O4]/CqP!#Jmrm]fB=.(d85.JJ+@OR4iUML(^Qr$emsB!P>f-e;ieX4g6S%"]S0BZMr/8ed%lh&3/LpRWWAA4=]PDG/F$M4hX+4q?-3"Fac+B#93c&'_C8)#X5iq5RVYicQF*qWA&T9p&e.8b=APcRc[OT[nVm7D\<@'bkN=`/Vf0C$Y(dC?*&`(bl'hLX3rgSjR/N^b]BZD_a:N@Ic6mg`.@t)0oM*Ugf0PG+%9.M3a,1l@2Qhe::i:&4oJ4c)@!Tp[2TW#`SWRD*aQUL4E7>JA><:!-1[5O-S/E[;0T.9FUL\gf_u8CU*EkbK+C5/%U^r&C!u=fgDlK0Dng0!n"_Z5E66gFX@HI&CTXbBNj%CRC"%]e7h::R6R+ss=^(-m$k(fUSp1Z8!i<6?pA5r/OVmh7jlSGE!:3s%\!H930+6]#I3j^6CtuZ0Z[NcZ>)Mhe.kpBLe6fCf;uVk*eCrs+fmddOBk'A+CAGKl6)h3o'M`B+\3KP6b]_,=;`HM.O.-Oi4B@(#lqm_GPGJJrI#6ubj5SE("$f?m(IY/8"(a2YDV`HaE8*;35C/Pq6X.!l;V#Y9#[3oIn5q,V,pfhp(G6gpAoGtLY`lVF@`Js.4<,q_rqmWccNjeATJ$"P.YJ'K'2rUD$6D-?d1g8X3?ag_+C.K=[jZLFP[AY8YiWZ_K:.*XhdRng:X^u#?_c1*ppOn;B"E;7#>QA[COMU3',q>\c!$k[ZOECTJPSW5^gIZpME."S61GX"4BA,WB@#3YS!/L&%LuAUP/LjBWa9#1o]/U&5>r^nn+5)lBe_OZn]G0lnT^)I4F3'rm//g&N2fn_5\9L0J0ho!>4TRii=e\4F8WD%fX#hQ'"FJhq[_i_CC,2`f@Y"$)0#k`(TfBFJ6)&A#:5,a;P7BPIEhl@k9Mi7C^57F1#B@58&(Wl+ncm9GJ$8]$8grr&W^K6BkbFoMiB?4]=jV:og\)X))DGU%t16Z8]KefXkMgG>h61iHl,A[efCP4TQ!NFO+-#R)&kMQF7@BgAl3OjnXnCDF`-`6NUP9GOub0eJ'BF#4`$MHV=2b3>r!BgKj!d4W:dRBWa;pV)2Ge&(skRj7ajk12Mj)$;)`#%:M@E2r'>\0f.W%eoA'9k4TFuBip#^*pJ95mUNN*iGW`r\94P&(L^V^5(CX]O?m"qi#*1!.^3A,;E9M"4!\RNGJq/Tt'\U+6#4SHLV%\C8ON<*0.+guipAl.c6.74:\91rB1-6]@L)Dl/Z8#^O:)F2IG_hLW\YiigdR)10sHe]<.P2L?M#p9dt?hX.Cp#HEG:&I9?'R14T3=H">s?!c>KYM;!P^TIjgh)ne@$/fm)7TkgUfeLU9p,)cpg1S3c'S2lG_JVIXkE4P-^^/!!)K1B+W')U'p?(Ol<_@2"hfD@.a_n@87(Dbo3'>qd7j5?$akM^DWZXV8st@_6dmmA3:o_dbnqjP7,A&.O1#+/V5L&/BWiKXPc.*=JU[[XcA)]I51Vo*.'B5:[P2/M5B21X4HLr\ea>+^t\RPU-o(-Do4g`'^A2D^G9c4GA"Oc-B\Pl4kMs="Wrkg>TAEoH>-S>A4.`K*orC#33tZ3;G9-:(!#D4>IEtmHM$/k]9#7QSPQQ9oV`U"/-%FKI#&-G.Rd_.El/DAue45;?`?,Oa$ql)i.ZM.?8TN,a/?eXoEb!B@hSZ2H(Xn;*Uo9H\1ti&6K.#gD#L<)p[m!.CYm[N7cS?,pSM:)F!on/?3ZI7'.3ncE57/bbHeaLM,f/MMdd#@r;Uj9`A'+08or&.g$3p^tidt36i$+h*\2?2]Mna]]_5@>DJHrF1_*PFq)F,rT:5::-/X-)q/tAJ0.;KqZB1(=^I!L8JT#)]Sol/JhAjl-UQqEh\n[R5i3IOLFLe93>'9u9(4>*>5YWs]Vkk".59j:$67IZ\38fPTVU8!J%Z(t.8hNV8I95BR@\h]l':DL_+&h6.I(RK^URS-@Z7++NnR$^Jb_.046Lu>P6]Yi0n/[#?D2frjRcf_3`i%Yg@#nb!`@Oc5pLrZ$DDi"T/_.02P-%a0*6mY5(O,9jCW?NAsPoLAu-7Vk:GYCM)6:C=1QqA=6A"o]Ri%\)cOt_-nFtMhCN=M,`E[O>-h>$2RU^WanuneWnaSATm[kX3S:6@oSpJ$_3W*H:\OkYhTFk+Wr\P:+a9E@TgbK#bf/g'A`5'h&7dM+X!8^uNV)7E7u-$Oc!N=geaD$Ic_=00!l:RN*?q!>[6`nqGf,:FZr>Gp5jmc^pljNK"D?m9;lg7B[8eQhPP[P`Vsg7\5c&!kUG"D&`0Bh]+jen1jb6Lgj]*jp65'L>'.7Kf`'!R$`aM_.046Lu:!bM37j`S=5=+k/nDg+p'pIM8u<`W!FfmgRHp1Ru3.mF9M(^HRd[m%@p]8+&D_/U(]%>4jdt]<;p;AS5Y@/cCokH+PO1m8JN=H@X*bZp"9Uho*V?o'DF6Cbii5l!_#%e>:(m1,7*[=?.AC0@f"2?r_@eOWgB'O]tX-^t48RP#IqQH!k1b#AhQM^@PnfS?i;s]XhlLm;e\B;`*0E0C?g@b79EE,)bK-$:,?0O'a($s+)E^]!a+S7,Wi'5Y"b+/J\HOA_e&&Li#R)QkU#4rb"2,$XC8..BeJa"<3Xa-B-Gg[j;H!Hkqs4k8TC?sNc>IEG6RDSNQ(KL&caJRJ[GklC18!G(0rjm6P_WfN<\sPT_oauP8o9Ci+f-GV-URjVK?16UM]!*%kX3u@2"9A;'Y[N1L$8to:^L&i/KF-N!d9ic;cn>Q?Sh2l%]79k,X&l?n8U^TNl=r=DH#=*D]i_^:Q6Y/gha.[LG^GS;C6#pUHl5Vj,..%9#B0GPMOsR.!c'sFKjIbntV4rARjK#YQ@&cS)UoKM=VgEV"4XQT-G>C)1RCdi@ek2#9M-c]_TCS]#fgf,I$9rk:rkH0#oarX^3`DrV5+4J$oCM.^O6B5ID)0A2<6>/#eFcL6qeU=/?>>$e6Gb\4WdS+b)\L#S/ZLj0DN5Co0mtM:f;l?VEdE*!Qtkmiqf2iFeY5KH*B5(HbelH>0D[hsQ@VDa!<=IaX]r8,QS.[fk-gkP=+MZl&iP19(]dO]Ri\b;V^eSt:/K78jh4H^<-5sPM#JLZ(Bt+oIeiR+g9k;EMGC;s0d]%1bO+%c-!IKYWFiX5mkS7tf"HA3V7>cCbYRA4QgSl"/lIDn1l/r-l\F].N:"=.h8h;Or+#N3)eEE)DKqJ%O$9!Y*h(GU-^1O\E&#'R&VU\(cBQ$-;XN//4-g`WMCpf,_bY]T2sJY9OmkXO"V+\(\^A]SifkMA':+!_@Zk8jpt::MC^i\aaCcUa6ZN(9l5'p(98ZHqfs2p+"/db8o.JP!TUuEn*Sgr!25%ti!7N)R4P\N=[TTqK042GX3u=Q&TZ>&?DgK'2Q)^?[$04TcU8j_tmGYt_9cTuH3`K4,mTc"rT/n:r8*t$><,0?q>qNPJZ)bLTil*>W7pV0)Wr1kq00sr8o_?h/rsUJ&6./i-aV(d^q51B'5?6[!'2ljsV%NBVMGdGV[OgOIq(#N?SufNQ0=X-iIbI1ZIX-;4W9Rb-3&%H:V]SqBpJ1lB"q4(.e]af1C,N77mM\lC2)RUgO/!.8k""U/m-&tVj,O3*W_J#paL&.osJtVT2aceBm&V>X84-n)Km/pu_?SJOKqI3A\F<:5/J0"dm9T=^YKT[WSH?jf'A:G/A70#J/-@4/$_1PbLNui^j8W_d-`ehb2nc)<'V;P-?Aofb'S.M*-gKi()"oS>nIl1l`;O*b:YL60dXT8N%(ll0KZ]!.]kP\\sU+-lP4H"am+`[->cZ@N)ddL$I):=.^sI\FACR'X(iBEo>97VBeARs&8p$@K.'?@M'3EkKM=eBUV9$I49c7ija*=`#Up=F^Dd]h8mUng\puJAkI$kP,7@srL>%aVB[658bGj`H5ZM%RB!ag_i=PFL(*l5-(`pa$9\Rn=H9Nl>]qYQWXcAn#A8jfjJa?'tHAh-@K#\MaWBVL+O3\j[ojjI:0B:87gK6_u.m@e`q4:a_08nGh`I#VLR;A8trK/UuLa4?S\nPf2^DBrY>G(=,g`HGfdipZ.RlC`:N0l>mtA(ZdCC7,@^If$h7*#naWX@2;%n:5;Z97a6N%b&\JguV6_J2'!kpq`1&]XDqn0scXn(/r28\RW5fV"d9i>??O]B3J^`Su2Pf2D\'mX[Nm^"5^3oCr@fV&@Z?c%R%hF^6,tcscP;=n*TZ>&?WZEg"/AAgU;%>BoW9f5S-5()t=,i.6o/.l(Eb-`mQt[:Z@i+a2F6?M:W'=TVM]R(]f#lIWNBoMKH_B$;&_)`CAL=h8NY<87clPlA2f@.:^q1se1*oDM/bmGR[Xgf,!e"b3qsV;onaSWV*a&Zj"R**FJK?%0,.Le8l?DH9J`s>(:!dY7T0OL+u?0^M3<4R&2qtKR&SI7shkcljn*[;51$0X)D^oTPAnmnn.\T6cPEW#TO\T7f*J0#XCkV3.$Q@L"Y!6h"P`5LrkX1PmOXB;_omTb93TZ>%THAk+b-(r9Y!"7``qtIqC_$YmJrqhh)`[EMeTZ>'j$360"jSo/r!!)Z,U.'t[*?FIqWUooTA%?X]6EHj#7c[oa@)e3I98E/<;5<2I";h]\s$$\f!<$m7q!jk7F+3l>GN[8BP<0TM%FATm8bDB&PKktV5(/SU&HDe2+D#HJ^0S0`=]\\V2/CdaSI>3'kV9:YhS+E-0k85NUIWLu#QOi)+I+m(hK7u.!E5+T$Ks4K(fmbBASl:4j2MP='*/(5!)c=3GdslXD7t8gSj%QPG:ilA$nR21p$:52=]=`>z?&4Aqb+(J5JH?!->dto#0'OD?0sD)ShnMt%]-AOFj\>pY!!(B.Rl>6i"9`sqH>_WS?1(tG2:,i@),-Vag!.e/jia!2-NX8J!9h_of<QZN't*!;&O$GdpYNCu2fb0)N]koGC[1Z*CQU,Y(9ladi\;!!&Z6p?pc&mHn2\=KuYnY0!5-\c[6e/:aCdT\R)!A%?(L!!&>'Pq,oC(G;44A&_fdG0-:Jq>tsObanLshe1&oA`UppE[Lng!!)5NkKfbZC=GeR<+7>_0nCAJF(a=?FUEgH5!E<@6i[2e!<)NRdjK0GCMW7eX]rPdoh+XodKS!-@.#jffW]\pl>gMIMG)&'LN%K`aIBB$K4_s6]1>r;?A3\J"uD!!!GQZY.T&1h^98Da/UBCq4VlA>$uYX=7;XAGc)fjj!o-!!"\cgf3?0SN=H2pJ1-u//.5%0ON+q3C=&@SiqG]:':Os!&,nGQS3Q+G-4rPik9^5jNb^GJK=pbV0DCbH1U1;ElS.[!7E$g:S5pr-VsI&foI1;.X*M2#4rb".Bd'ko(;Rm3fj=A!7EGj8P(dTeoYkMQp6)7gppN$cspI\/6K-lf%(W&gAh3R8C)\Yn0'bNQuoK0VbZ^<^R%#&$NYP^b`iGL.Ptkf7.)T+!!!#p=gDRpPESqI>.#D7H6d\eQ2pOoQm6TjE=.D/a,V0\-NX8J!13mD0epDV^3T>44`fbEgpre8cspIDo^:Ns:S'Zj5CShY&HDe2^f3iu9WV9sRZ!*Ib*=L=cGdGI*Wr_N2rt&?!!&b+J,_\l3*;kNd!p$I8S=^:_!Jj2GlRgEJ/6#>_sQgW!WrNH5CP/-/nPF^(mlSW!:E4U1$P].%[qp?clJ!WW3#Qo)9jh_%j)N2s#Fg9k_XcGe"X*Wu!82rt&?!!!XWoB+<$^])BQ,3'iQdX`GA1P4GI2g4Oi\J"uD!!(5tnF1C$>MCK!R_3n86LJ+&"6_Hn,8Mh4TN!C\;]Yo=!0A](n)'`tF692cMdF)C8O.TOX?dh<8B8eL8A0Ge\,*WQ0?O;;0;IbhGL>8nM#4?GeicspH9o^:NsGOF7r.1ZCY!([JrVbSO*DUG2tbEjmDcG`2&*Wr_K2rt&?!!)k)ldi0U11Ve>]_M0cfB(;s'S.;-ZN)rG!<<*R-BB32g9YGa\8c2rM1aIG83Sih;^"@]4;3a'iZMb[MtT0!&R!*C@&Dr.!JI:l]t02_:!]Cojj(iP+?^c-G-'J%!2,=jM\jin3c!:t3^M/-MG@2ob+]Oc]qCRVguhN7!!!eOM\e%4/6P;h?cJ$B6[sO@^OIn\7L&&)Vb\HZ+kG5qSN:n>qt@/Il'MgF>QINjG4"#Zq>'P&pHti03cWR3Mb[`'.`4=1!!!#IaOR=mJ,fKArr)^93cld`4^`0f`f9ESmcDWYa!=+YoGErTM2@'!%M%IViT_N4l&/;GF=O%!)V-nR!!&ZJ7un_YhS&fnC"$D'IP#arno4-Y`I\7$B$6Jl3]^I4>iZ-9$r!0GA&`bJ!J%f^MY3X]CQTGeCi7"T"_hJV!-kr45FaEfMS_WJN#4rb"194HXUAme=s?G3*3]QNO@]sMASTZ?VDm+=&\n@j;GZI/Msr:i"un!5P01f[bmGVT/SPk!>\C=T?7X]nk9ANIBL.?=B4Uskl#ZN:+,?l=WPL5m00b*4QCOrei9hOT#*FQl^"_]9^:ba!j8L$;m(M:8@ukK]V[HhQeO.VW_aace(u8sF#BZDAG@"9L_E"k[`\^)f4KegtIZS4Q:D#46WWPUY>ZpuT\c[;4Bks6ngWH"52p6ofJZS3io?eW3Ec`R0O&:3VH9$31'VAT6qaWQq%r?b1>NmR4E*QQ?eN+$Qc'UP=DR_h&%"daCnhqXk42.eM];#Hm-cT73M3R'J;2O%fXt4`8]D8WFcNkf>So^FAIfpMMd:+eZ)WhN#D$Llj=O]4Ep3uIT*&D'.-C$;P],$K7f)?$T551j[q"`M2Ccqp!&gVhrrI_!s/Nd4?Q0%bEa_AA&aI?c^niBQtdBdnEc\.pR&Ve(UJ,]?[LVVO%%j*u/SN=/\Z!p\ie'jMhV4DT"mbO,A.i"9uQT"_$nG;fnY2mfp1S;Fq*Gk]No`GC,aI4ueZa4_P;PeR'fYMK#HRAYdSXc56doj"hZ%%?AFReOdIqHurRC]=tXW#=0X&lKNp?_&2mHs?0?E7*YDRtsJ>GX4q/`YsYZ)4#Q1jtkA%iBGV*c')]OXX5+JcuNS3"Y`"]6E^ajN-lgn%\2D_PBbekgZNNPQ1[`=:Fh73[cCikK]W=-^&4$>s05jFtAmdrpJ5WpPp7UEc7@^csQD+bEkG=o&T)dX3I(jUQR?A`iofG1j/*5Z*CS0qsV:`P*0_=]%*QG&#qn'5bC5bn:7sD\%hq=/%H!Y87Z6Vq8TXI__bqOoB&cI:[TJV(VP-2KHUnk1VF5,%FmWF:62Bj\om>mg=h_Vh7nH33[NI&F)u-DTRit;X.ql8If9+_HH]bh7]*Y2feQ1dr;#sVZ\%h@>drS$a/fmphcmQ^ka2UmD=Pbo^be=)l%ZJicMD=BhH,k?G)Z:MiWqN\HS.D3q\p-69P;K!+^c^A9[=g.4p$\j?f%OZPeUKIXYN.H&JSukIGZs\.YYGS1#"ghnI@$/K5Q2qn#(2hE7gRf2;B#8cmr/i';XJhNAI"P+`$2$q@7u7?'NCm6Q=M`j/c\-`#\T;E_Vi;TP@TPkk?1dUCT<$>PHZpqW0k(8e6MlO1pt*N.fLgHF>/pGBJf^ibD5MQnLn^KqXBDk4\M:*bX\.]DgdS/V]jA-`)86%KqsTeB,rP\_aV4'pmbbdOl;JLNE_UV9NAcH)eZ)Ie_2N%kS0#!@e+hE0l$?%fE@'r%X^d\efj!j3LjhBtc5\;ZLZEZqT2Rn!oOo`-ZtU1T13i:r.QMM.KHRO!D'_=_/`Zd\6'"tB2H)_G6rD9i"tRcS;6sk/UZq<"!sbd.K*MpaV%GcQdA[Y;#QXo*TMA0S%/l/>a#gf=kV64n[C(/MlIA*Hs6I+sYOD2Pg\DRPDfc%&3(hD%7WiXCDrr^V!Bab<\;#I?hr3CMG.3d'_$l@M`DM2I2M8qmco-LaSI[aH`F_0A1;d,WG$I@DZ,0VV+[NFC&3a7TC/ac[t!fEe&?kgW*M5eWrr!!'ftTYKOZ2aZp`F@#fH($qq@rU!gpA4_n-70K5<`9X\ipRQ5G$X5k^uRd+RTHX+$t>u9koR$7ug8@F8QT%!Jk`At2f%8G^,NuCMaloVB*2;>&M?f(gde27+F-!M3^TLNc[H&kZ3q]?J=[)ld!%\XRe`2)Tp/r\;AggffV#'KS9GPR,)on5JH'n=!p1tf4_M&As_XQO%q--9X7k58\p91`s4^hc-gdc;>]^b^hAf#&JDt]kk_9*LOVG3P#\k$0rM\[o*)T([uq4&]OK)DabSU9.g9,IT*5s[fUMA9&3Y9mqAeB#Ue(V(/6s4$>=p.RlPq_i9Ccq8/dY7^D/[q'U-itT8Q'Fu$XV!G;58+I*:-`<@gB9GBiGk#7t[V`am^--f7?kqm(qA[+Xa,]?)XB`h#=W6`.MpDUil-lQumdAe1gQ2p;(]XPd.-@JKfKN$SahbK&ET@5O1)5+[Gdt8nO;JKG1?@,pBD_DibEOGSd@s([(B`@)ICkcu;tJ(@>.&,,l07Hoj[EO0i0p#a6f9j=kV6k7]ZB!fT,Pq8+[ae[Au5_/up(+j!:O0+Q]9VYC_SGQJ?<2`&.6nq1pQ3[dH[tpFPK0Fo=+X)CfKlgCE2?d"L:CWZm#!--u^3j(]:7^\#X7MZ_2A#KCcaUCj9*CeYfDlr4F'hcD*j9a!!%ga@A_<:;D+Nr]4\L]T^t1)DQJ-r?ReO,o@[nJMiZ50T9BQhEqp)2HbC=)2hdV,H!ZH#pM0"R-:T6064P8)d^.WGNN!$ig8m*U'cuH2@/I]mBA?=m-9np<#j$n=C"6k]TGOIRP3/!'B)kq?90`V1R;4tt8nDV9?i8A#6@J1i.TV*G$4CVN!gNMuQBB.E(HXZ=qYBsW'pP4kms!un(3W3>!)e"\._qE6I/)(-`F[Jn8HroOH40cR5SWFe]I[3kKO$P!TXVIQkC3$bNJq"gr:i!V`f02;]Q`gN)7'D/N?LZDG^4QtJ,\4gm6cp8!!%fV4dM4Wp[2V7P!u?L$7qDMH1^=Jo&eN8GAk=q$?'j$dUmd2!pPJQc^n^hOC@4kObW0'H40cR5SWFe>eGFXY!RgL[^NW=GJK?0?Fb)F`q6"#UBUJkrql.>joa$N+X&"HDJkLV4Yg7Ycsm%U!2;`>je?hZcD"dl:b%_pr:#?O)>a4+nl%Shie4u?JFpbFf<;MmbrT7J!/'tH4U(ld+:@aC(1+Xu&JPr?mHr/9GnW&GKgK4(7j1E9nDM,fDPYE1AcgC"s8;JLK7h(44*M+e$hP89!.ZKE@i>+;nRGNt<6(">SXl8;2LX+fAjo4j\#">q=ECcMW)I.bEW9&DnLMq2J:=*4aQ`SF@X\f!!!"n5`\Wjf<8Pb?ba<`_hLd[OsJ`7g7"L?dC!ak)&"N"W"@/5_M&@QV?,*[@:o,LOL;ugY:VuH.*%I6&u$H!/P),4f1H^=Yj[uXOR<5`i*"BC@5@&MAIijSj%S60eXPsL)pEs!71`<(kG3g@H)UW/fj]Qg!c=Z6B;-I!/L\>7Ng,HR(+25T0D)I_;WtI>K6"DH40cR5SWFe/3u@qCd:G^W)omjIQOQ5Z,Wta]#m3CK^<-iHMm'Y.j#iT,@?bEOI)^juTIh_k$C!!%Ntcsp41oU)FLp,"-Ape/e*JdjB(\6#YW[<=,_ZFBbBa'>,(V]Up?1-)RNrGhoRWBPa;J'5rO^\.Dr9'pAYCAuemqps:&V.[ZK6SF0)#cUi&-`T(M9Gm[!fU`K,48,MQl3B4N14,Q7iA67-%.=-3,suB*q-U1J1]EZrp%C7uVug+oS#\V0J(rtdQKo<`WQ0jPM/I3KA&aIiV0D,X!!!!rTZ=?+ML'Y1k!$m\NN.+l=o"8F$Q&@]Bk2@d=8C7tgA:TOb4uOc\-)E@_&N:3^#OsgU$EP7^#KjM*dn<(qtmNG0T"eSf,0D'0DB\WTXLm+T:lOidcAet4j/DKoi*MoP-T@`a_bj.rM^_UZbu.I44rZ.(PZFEV[OlRn:VYCqD@PVFuWcWK&(BmZj\e?:jdMTjl!e!p2K=MHk=]kH!^^BRKVP:Ia*q0W$U.:&R(^.C\b<(WIfq:fPW'4h,l9e]7;O)NpimHEd/pYUJDPlUFn!!%Ntcsp3Fe&iE\U^1Re,d)JQS`$q[2K'fT[V=TL]oA(Io$3U_]2-]kB:lDkW3)u=2YjDkWU$gKN=CC*`1MHJn1WG"+Q_`HP*-,QkJ4OT>b+(7##M"#JKjW^+**(SMj>QVAL4)U:S\?66,WJ'T/mNZ?DraLjH40cR5SWFe/>6e>MLCt(=9W;kV+[-;D\[KW()>E&rA.O'[6kLj/<3iUhKJA?Qeq;rpT!P!iBmPA2B)cWVS`#LG4Q)Op0X]6P/YR7b_4Lq;lTo6cE,A`.dYc.&APG\P@(9Xn;ajI\mbR"oU:H$jL0H(b,QjqWE_\Wdc5.HI&-36kcp@+2*JZql&r0NmC[`9ABY(#$ig8m'^2eQ+`ZpiXm/-M(C&Hlc^!kSEg"%>HnG%hk"JqR(R#NNoXJM@5^o31CXf+GC56/@oi*+mb=#N+-DGYFc1mV4\N.kbg9p.cFiV'/-%guNoUPtFQ4g'la3C)403GI:LCYJ;bQ3"u!!#7ukcl\400Q0\qfT2!do!s3>'2tD[)m^gT*]T6KkhHB[n=Bb:1>Q]l#HUO?0LtF+d:H[U9BU4-@I6iD3X/*<0mJE2=W@L4[+2a./j-K[;(u>Bg@^[!!%fV4dIDdW5i_RM@k>uqsfHQf%/DBG+[rIR\CkLS\C$iIBmJB^?,tW3P=CR?\'D#3,7qNM4*S)a33Xa@T,7\[[uJ.`5a4LS@WD1`-KdTJt&ffcKr*ET6W!bf4rH:;L2T]HM)=?b'j-Y8_u:s`rH)>7"HE&&t2k(./S-1@d/24L$ih"^,^3aD3WR#eJ*+iU)r2OqkSW(9'hkW]XdVMbjWRfH-;h`T_(p"dpn8I%GS,?']c_LMj:.Bm-PhWD:]7`dWYc9T+&JVamrR.=AtTI*j8k]04Es]j7%hR#!!'rg*m51bM$#Tmpso_/R.I4O0>1$4QMRNRCokF_^@IJ>Pi'1\.X#&\u!$O1M5cQ^q.R\@3U$qrr)^\KaK\QekGL"<'ZKF!!%fV4dIDF/Dd'aiKhHjfLH7ihFOhoX?FebMA>Pa(G0=fACOVf/Un'a(+U2=iNB&8[`J\Eo#Bd<8N"%9PI53Qa@*D\l%@TdnE@?F4n``QTgEp.RYr+tT2>?P`S9XlgnR>:[1hP0PI@YTZspj`XF%#t9LOr>:S2N;B6X1BA[rIO!BgVe!$DX@(kG3g@1%>Yr;#q8=gI\admr7O32":l!!#E<*[;6\+\Y1_#7VU4iSj=riBqn>i.)jN!!!Q6HAk+bLQGf&Dr&"djQ&.+_?:`t&-+it!!",KoGE-M%jAP+s74>d\T6epnIa475`YpG!/L\>7Ng,HaK*?90eq81er(=tQ7Du5TZ7$4!(;AZCPn54Tk+f]'V5CN!.#%R!'h7^Z)6a=+c(6WT^$*A/kfeG%JkL;?2$NVSO/%Nf'rRB5M$84,Y@c6NaJHq\?G5q&p&4R8?]ErcMA.[J\3Y`OZ?4p7GOH"^3lo`,!!%N`JKAS6kckGS6D2@)kolB7%iI.@e^a?;^8)[:5-hXZ@QXIYN83.lqNc.&'tK)]P:-c%[Bm2(YjJgi0!s^5BAX<0[W^G\)8.efrO-Y#L#61X@\oo6bF0`,ju5ql*&JhXA@-8$Qm=4oi$>@P"cDdg/F$^%lZ#m''^a#%)`J\;a&]E>F+W??ME^5LKYoQAfkmG]!Z(jP,tho'e0nG:nVppdZZ"PHM6].P9s#&dsurKC23\AnZ4pTVO+Fd!!)4'kcq!mY1:0^>CL#6J;RH=Xg\WZR)mPm9g;rPqL$b=-.iN&oQ=-rnaZK7OW?)&IUYK]ic^Q-UG*92TOJ'flPE8poTru(g2naI/#sY=//4oU\4CbWudIt?FtCJF7P#i(DiEdqt>G5emhoggQO!\ISTUbm+J_#Kn[q?eu`.XX&eW\ldtcTeZ)XCp@`<,1/bD_ZI?3sf4N*cJUaN-HhZsGLC\$G3BKU:V/XYFVm#aN!q"W^(<3=:B>"Qr(2+sq>S#*KkY^5D7g38eTX[GAa?7e@5B!nM5ASg0k09B:jX!QcS2YBCk@?_.?bSX(ro]o'ZDkoO?=%09>^=&2q.@sEc!HU8P+@bDZ^*V!I=7.u5L0-%q<+B\ngmqLN#FQgcW;StXrJ&e_Q).c;b&KH!rr>J44%J3+hAcu/*-]#h)@iAKgO2";;8k+cX%TrQ99$PoOS()>HqRWLUQ"?8sFC:ER!p8PDnqLfd@EEQoSa:2]hk(=j[\:p_D!1iQ3_rhkOpNf52ul>Lon6Y.F5FmSG'PWV.@/I4J0UeM?WrWt24;#H".n;q0j72llm]1Xe%T*oFSRO$p-X^OF2eN^KJ[H1L%ToU(+M>a[?Y+sJ3p-gU;`5Q8`hNuL$\8sLlu5(+W[B:"r&!RHOcLf!"c]=P@r:oel(Ddm*"uVt)lIDp_R/K*moP!YD.d2fGGl%'sgfkEL(GB+!CAIJa:OC[n!!!E.oN5%fkZV%`,qEJiFic$FYIgph_b.lk9&Ck;M5<&f#:\FsI?Dj=LeV-qJIr8)KKkpsH,5Q.fr],p;g]$>Uq_3V2/%N>&;g"<*<^\-PES)UnhVI;;EhR@Eq6D7MpHF4@]&jW#!]=ZC[4.!%Y7ZA0tmpmFsF-aRIegIr4&T3BTF:>e+k[%NJm,W4TE\%0-CD&3u:6KbW.=?KF\'lf@8/X@UIG\\GJZ[P$iHS.j2U96Sa!.eLiO]k"Cr<.Sc9T7'4#mm;><.8I%mSh8Qq?brK/&QN5&R8kO:MND+Z:Ib4^3dC#hYSC\Oal;^T?atcEHNkE.)eRo?d:5),KPT-pK,<,jqr*Xr[q;LG*'JcJp2.Wt"o5K>NQgbBZg65Hhl^6HZLjG7>=M%M;;jb>r52g'-+\9eatCe:W)00hY?kXG@1=/6UeOUS35O.u[VZtKe>lYh`/##lHLJOopM/6Y`B>.:`f1p%r:!'iD!ZcZ&"K2]?bLd)ap!2*B@!1:fs>=!?so2$N!4>5^)$T:H5G"N92UbXB?N0EEoE><2)9%0#')d=5;LU45#8:8>>mCKG0Lj_01(d3NB<5b=V+&*3&/_\lQs+6R`.@aXP:Nd7akDf.FfU59^TW0#b+o^VkLA7%rZTp0i4F6Y`'e<>K,p**e!%%d>(r:pieQ9qPTtt6uNo"BOj,Vo0=Ke.C[u3d]A/IUnldi3(kNBl,?""N47?7HL!*C;h@g!V47$!lYSSW01^<9`Rd.`7Ij/8H=S.BLqPs$jSL8"9b`s)*/2+a3U>?oC;?bhnHdTg,BSi@fQK/U-ObO>_p\][E+/b:"mADUhZ@jNjH#=A"56O*d@)04_)KjM2@&nC>V9ANr]4\L]T_/+OWUo:6,o+3b3)E]k#4t6Sr[WTZ7$4!(;AZ)`gbS+2H<].5C1Gf`5=idr8u7nJcuMd"pXA+AKq1<"onWG$M7Fn9H>'If!KkMTsQYNQO1?W"b'0+;Oa[8llUjT]%5&%PkJ\uUrWH2pNL\"91VV#HcnkYH40cR5SWFeQMA/V?o!U>MmfLZ&\Y-0@"D[u`;*neaKMs5/R#W6*Xb:f7oA!022!$k`5L<^gA^i%HoMH!!#lha+b?KP?eZMA=F4,1$Z5Nkcl6]`/e]fu>)E/l42q*D%-D?uBh=a\)rro_?jkHUIcL?*d]WmF$Ra7UA2sDa9rRPg$]%S#h4QWEtL2'KRk@@D-80[!Hj5;Y$/amW5"@q^3u95`0l8j6W!*@4PM>DF\%FjZj%QHZ!5k^*E"I&NpW3+%;WYRJsmSn96=rOKC$rg4M2t!.$bTpi%T.VotD[l`j//"$Hhg!$I03HH`aL`5'sTcAKZ`5ngah$c?'!f[s;S9=]S1gnT=$,:$uHG4t:OhqE7gIc`@&NaSmr*hJj&m,r:E/9i^m0Eab::kVPL^a`;3>=GbV8VlRYaI:bFfD)kc\5Kl%NhhV2TRTkn1kZp6YSI#K0L&//_BnIP2PM"c%`F:&HK"YTJ.grH6S"8Umpso_4WX\Sl7j`s?unA4%W"3YI=Fj/Lu:8BF;/FRAq$o;PeTjoYX17a7f'r8+?baCMmKn%T0.D)^)E4>kV3&;!)ZEUO-N>l)HH,$1L\S1d)_MIIN^:?g*l]34O34cRkQe1Dr1K,LNa90*LS^m'e*:V)YL&p\^QnQB\\V?Hun@\c#-g8YZ\k%<&.q@G\WF/dm(S@l2E&1,I?[j^)%(jp!og957dJsm.+bG*D%-DW#f_mdh$i\VKiF#,[2$+EnC+q.u"7halo"Hp:QZ&4`9/g$bc6(bW*-4?aRp^K.#d%mRnk6CXghn0q_g5:ER5=%D'*]s4MT!jZm0Lh];m+B$Rhpm:#8V;u/cSa.]B*8Gb-*U)lrl3";S%+$P'#?+P-G11f['?5f%9kV3&;!)ZEUO#b&O@[l0X:gpijqBUI%@X2osCqlQo86sB)WE_?S@``)UWC$2GD>B1\]=W(V$#,?B`lr'*hr(t;D,SV9Mmmb3EK.2q`i5'3*[kTG-cn8L%8"s%J+rHUj,VpSVl.5''ZVW%a4f9IO6p]mZ%%RB;6"kDWh8)p-bkbU;:FZGG"%*pMGq!(J@3iQo8r-EjiH$fXpAN?WK30Tgq6e1M2TZ^&?WjBD']AN'NF)!!%ga$@4gQ`kVGg_`Q1A@J.dNf\=K'2%I9Ko&elaB8t-+^5Qjd^p__Y6=5GP<@CD:b*T8!nbmZcW-lI\C"ub4k&0+$rEJ%E<4I:m;<\:jJ'1E`;lP.%m:4Z&;2SiteRRu`WWru$]aFl6l87"t3LQQjV4.&\jg9@lkqUqg>,@[>9j0LQQ-'n5XOYoWOQ,>Yp8trggNWLj-Zqh:VtN384qR^5W9G^&nX)%B4cYAm+%18c-Vd?^;mHKg"onWGMCIboi(s:H@s=l5CmMd-c&l5(:c*+?p@%OXa[8UMa?]Nlp>s#gPu1cogX[@m@Xr8mX6=!rXH<<1.OM]f2:Cso(W5L(PIEXYKA\RNO0boPM]$Relt`Pj^H:JTX)`n;^PpS[Y7n;fq27o>/aN2Rf(3Ss>lnXDIUMA.L;WDY$`T2rdY*WlBB&B,@UGf667pk9tR<7nE]Z\7Ch^S]VjWrL#@Y]S0:&O#9e%@_-:X@Ppspi4.4#"UJmrk4'5gQ`/UBGj/'U$L2Eq&=OIR-5BpF^Mk?GIc9rUO)sF,UIgO"-@'[qBCigIW)UJLQ#Bj?:LD.-WYTci(AhdnkSa:n;r""n#GOBe=T'X?nX+%BU8+"-56S3?qr%*Kb/)11^$'H4:lr<$qt9:,ol?@[*U#3X!!#ki6'&]A1N$I3Q^&QIEOJ,]5:U3)X13I*;/)dN/`C:Rmp$["-W`M!H;%0gTH\4i1-Ce)i!L!4Ms^4B+6FhH%!22o&1cW9?^d]_W_Hc8bh'%.(hZKgR,:R+Z"[/_jb>n`N%:_b`O%j*4\M`V+"mIkWmIG%2[bG_jI6ph(-/KLqo5@o.j"[34O8!HQ5-Wp8;I$A8g"[$9^Ws<4eS3p5&dP/6a.c(dp1%]Jn/2#/AWpK2rS5$.+)F/_H7\UEjZ`%7$'_Rip`mrV!b$CNC8Eu'K/X=^6',(e_-VJAA*1_D95LbRk"Jola;I*&mHj2mD\Gm,,p&TQdc2]NT&e+`o7-f;T,u;kZ3*5o!!".!.Hp$9"*cQ7^mQSrL[5"[^XMO>;e#p^tak$s%=0BN,L6:4L0,]njMn05:'BLprG3V_L5Ut*Y:fe,e5e"=V)UpXd:8%_@qLlGZ97BjZjCe&>F!fS?@mENfEsM;K0dX=2.W#%NreWo9I$B?32%Whm";kRZUKVFmnYA7;*POJ*CX.l)2`njb[J9T#g/[K(>P?+rSUArLE`ZNjBAaF)gkP,,lU%jd>o]:Y[1?bO1RX572k>>jU?gEcpG$g,YZ(WfKU3@mEtjr1JMuT?/>X:^+[]BcT4-J+5@V^HX[9JTpm*Qq!atLPq([@s8@il0D'^ZO<*O>!!!!rTZ;jf7A"H"\2gf^_>JcJQL9o!.n#8gRiW(X1;q#F+XSO*n#$Fi!.#%R!'h6DoiV*59n[4MHu.71/LOP^KMt*R)'N)FTZ;EQm'3h##n%-iqt\&rJ0"dm!"_S*4[pP*`ei41nbr@ZZY%HSs!-k.jBt#6Nr]4\L]T_/+OWWQ8rl2cr)g"#XZUn"4F-KcmjA@h!I>.S!'h7^0`mIY,#rsef3a$\g=dT3Hs#iM#*T+7$ig8m'^.7QOWHj#*g7>&)c)kW7IR,X;Zh=S!!#7ukV3.$*^ZSB5C2tCf@TbpT76Y/l''t"$`4.#(]XPd.#-2\.fb*VU&BJqNupRj"pX56R569@8akgF'*NUi!!#7u"6o?L6\kXEl%sE?`fYZY)`CCX7"@2&s)0u4cld[^qrm6W]q5j0'Bh.N!!#k)UrOSu&eGW$W`:R[ZN*%lG3rIe64jeA+a5-M"*t@U!'h7^1!g`CB$IWj[t!o*J_Z*4<-/':GrI[kDV_nGSVU-o*WlBB&-[@goYpFbcUkCi_hn[7`m^h]$Pk9q^3oacDr8^.Mc#$H!rr<4"aUUL#TZPA$5?#AM]Pt/+$P&X$k2dun[X#@Y2$Q))sB!V!!#lha$>^4iFHM2'bqH0G9T:%5s[dH%M%adG!%t8@fQK/U-OcjIOS-g7,,.ejj!ou+sJ3tThn-H7`q9X4@"r.!!%fV4U1a//1f#md4q1CS86\lh7?Uc<;uRB?ZIM<)pi'p!!&`YO+Db*rqs=-X(uB^W8*40D4E\3cJ@a<2n<82fId&78BMr!!!!eJK=p,'-/*1AS$#Jcloq5!?sXSqQtM;iq`3/`rm7C0`V1R;4ttF&JK^C=D475pj.f,*jA#jUa2a5_Rl"j=k2mEm'-h]R-3<`U!!%NtcspGhSih;Xm-IE//9`;r5C3(lD.dLjA&f(i'/:5p`rH)>7"HB]"4=i2qk?N;b+/_2_XQO%D/=#hXB6Wi+smHb(]XPd.*uI3+:]DQA7]>;4s.gWC.t6`?(k*=S2jO96qe!P0`V1R;4ttFE;9>-GNdC>mOZdJoB+<([^I55ArPN%QlOI_!!!"n5`^KT#Rq5cG'8?2oVpW&UgI0)>,>1J#7VRsG9WmioG@Q.J1/cS?oT2lIdH.V'G_H2G9Z:9/R,[9gY;Jhfi.<,9GH\F!!!!rTZ=j@Zu+RKhqqf//CGb)G3j0eE+n.CrMNG`jNb_4JK=mn!"]<[$k,a-<0WZ5'dU`=m+J_caiUM^X&^<,IZuo1dfk%+!!#7ukV4bJIXZ`*`f/$B?+\1;Rl5-[rr%2SF"qC%`rH)>7"HB]6Si;r'GhQ%gn8:"p?gU)Hb2k5-?.uZJK=mn!"]<[$k1D@a,_5]*Gu2e#(BF%j0lX`GC&G!rr<4"aUT96_Qi#\p!HjG8?LdMA7Z.m-HcTk^[e*;?c\0!!%NtcspH'-;L)plK\64fe^/PYr!XL,F(l4[r1$[`i0,f$ig8m'^.8*%M'XFFDu2d4aXWmM-(I#@:@a#"GA5oB'W,P`\$8b98,V`6-5;`/#"G-Xs5DNr]4\L]T^D7Ut&Q?)2Nh:S*e4&[UZLVb_g?nV9H)Qo8fMgpre,csm%U!2;`>J^GU>bF_"KNugIF:;jejqt=mmeue?+lkV0V,^1m'%J1J;!.ZKE@pi!MN>q'Kmf)e=9=Y]j=.VX+?FtAt(DiF_RlAN]MqJ1q"onWG$M5/PPJkC-H[GX8oB($=+$Y3:F68F/)4;.^n(oWnU-t:u=g3Lb?@X(!!!!Q6H45a+e##j_QS2,fDVr/kC=FXR+!3UA:C:1+>fi]d+fs>>A$]c8fipH,=\od0A%iuQP,teDf$ig8m'^.8*)RjYB%LEH`Sio.aYu7R.q?iM/SXQNsrqq$H#7&)Xiq;Wh4#o=OX&fgQ[e1%#(]XPd.*uI3":cJ8(`4*'D/F-&B4n&qVl-HJ$(;3$X&`4K'[G"LEH-!"AFA6`oMab9?[d;#rk5tT=WYq"!!!"n5`^I.\9dft3AB^&\f2K#^>"'^.7O!!#lha2#dgm+Ger<%P%Q+IeTQKGH,_lC$!HKPsCtQP*XfZ[*aAJp7V+-F_adl;/Oo,0qZiWAp!!",KoN4'OrV'Z>S%r2:&8@4'q$IfgkV%9$`f+*OJ'+3?>7nVZ[AjJSSr=.V_EWR2J%>S49InJ"!!!"n5`^&?l#FSNV[0uSr[fL/cbYugj6RH4F%AsJQo#n2$ig:C;LonT#4rapSca9I!!'fdJKF+]oGE^^"*t@U!5O2;*pX%&(m1BlH40cR^k.+YlNZtuOe)Z$$ig:CJq5!/7XEGAq(n>'%B)hfn,,n3O1P8CS'#4O>rP)KgpSa`Q*8c5EOuOPVT#0VW8I,?T/_nchm2Ntm!IU]"*t@U!5O2;*pZ:Ad,T*jranrIo.O?8n55GX5>_04I@#o>'Xt2p]XdXSm(]XBnIGDD'K)pDn-J];*WlBBY[F-E\rhI6fYtgpr];VeP5gY^HE:=LCtiP2gQ8pC/=Ntm`5(n,flBntS)ta`38Wk)ERb!@kQKT5]]f[n(]XPd"Tpp=NV'!d>rr0L3]Q9J=7H'Sa4s1rl*5,#Z#,!Z3LF0`EVWoj/=>72p;l[n_*PsW"?*D^^0799/Z+O;O,m#`XXVXS"F>Ili&12,)V8F?KoV()=K`V(:p3X3OPun"A+$[a:.ANcNWO"I^NAHV=$M"4>fC_`J$.OjV(.jZ9UjMcrEE%bhJfi-MiP/)NGI4[NIpf$_'+;eY$!?\7b'O%qi/75inf2L_eI#0d5PY:"q;Bq@fQK/((Bh;2q!s4T/h;:e^Z6AG$jZT3.]O2$t!RU@j@?[>V;Zn='p8PRaU-[nb"]!H[#:<$9P]^_%g99IQ*of3C+,Yo)"u:]##qM,e)7pkLT"eePh=DMj@6jD:^>qc:S4\O."*gcAiBp>_@iHE1`$QZ)t-6SJq2#R4r:AoOTTm\"aSn*4`USg,/7`-/#U!N#X[*3ZT,$L2nO#L)uffcsm%U!2;`>FX+TanbH[=]KEk`H"UQL'*M'W0)F_HD6a%c%O.)f?`#TB=K9`\;;9SYV'uiS)*C$.Fm75sSVW>$EcuK3[s-K:kleKSl%@SM1O(>_$>tD&lHue#&ZXEW;a5#mDXF(l*Js&92ZsmQ1b*$;Uo@9?7jf*cQ_V1=Eu"CcNj5psLE;ogcsm%U!2;`>FX+Ta0a57`[t")lOeCjDOV)@KGV]mj!c'YapAj(%^Zos\8*B'1"a=[biQ]+T4WmI6$mpg:>SkAW.>XGEsX](u9Q1sT)LgN0MHH\E%>f`OEJJ-%h1Cs-1/:\cD!!!Q6HE8(M;ie-$50B'>T;UE!u"n6_MKLKpS\rs2m$2Vou9WfpWa:c9<-9k;Xs]cBt#(@ZK892fd7JlFh"!7;H])-*u3CD5L?p.G1p@_*Pu+Q;^<0Id=m(I7'&i+6YEZ!!#lha1@Bsof++?EF<\T"6[&AX8GM,SK+2X'e,P0pNNF(7K&*Zf4.NLBhF"^\Y=2fo$i@[TjX4FYFL!UW\'dJT),9M&,-M3KhJZ#/VpB9_c_]?E=qiO?Cci;/bPLQ4,]G<`Zni/XOBIrfc1VTeVY7$e>['b0,kk"!r;enKYOOAjTY8n!!%NQ"$P4pFK&o&sA!CR=Bub'GZ5&N=u;LSiSMi*sZWc'qf$(G%V`O8W9XY)_;GHc&_[STfE>SY0g'3h;@[HQABX/%q03]fmC+^cis[Vmh8<=Q+toGPQrW4JbGc3Tg=['DF8.A]jG);tdE@TE.1[!!$EC5`^%44m4Ue8dl.M'6j(,HQ@=kG0@;L"YLaSXl8]DMscC0nT]&(]XPd"Tpp=%HoNu7A"H">[?0q$-reHqlO)69D5Fq*RJ9r!!!cCoN4&F`s=DAOSHljK%Q=*"-69o"A##:U^AkmIiDm82[s@GGH]Z:oPo2.\#/=@0l*LTZ7$4!%\uNZ#5r@*`&7ZQh%VjZ"`'nmB"[U"Z'6RkgWCl*`jmo[=j#0HPi8ZoJl:&m=4;;3jehoHb4%?<\(Su7S=0RYq,o="onX2_*F'(_lWMjrq&SHN0u-p.:Zu\bKiW7<3JulDO8fS.(VtTU*Im):e?S!!dF-]rEjFrS'O'3<'j2W8,euJ]_-,4`EIbBbbSHF0H!!'fdJKF-3=mL'g:AlU:Jc/(+gDn\>H&'Q(X#Ki]X4dM(;6SZWIe3%!(19pc:6clarakZG_OoISL<8[+h^s?H3S6q59oW)Cr+[*34@r$HH;"YqB[,AXA'O$#m*fr!r`7WbHd)`;:panP*]aMlhdDehShD9BUY\oc5DCMR]\/5rCc8u6D(Hj*)'kKd8UFYnR.5HG@P/J%;04(@,mHJ>N0Rt'U>@\H64*$$#GFm2,/`kQ&UIKbY8]*gXTSJ<'bH7-7o1MuC+Z/Oe;=/(l%RBg.Z\Y"s%4dJ87$JJ.[Y?Y=;]64Ge%umAZqXtcik3?i"CWE;S(Wc&8HJH57BDNK$5A\=.!?qGr98jiI62#ps[t#M%!!'62TZ=WPep:T):.%Y1ajI(iOciY_bTrN"iMH-P*@%bQO@FfbKVYdf9hLT$Yn\dR?baCUq6Lr!/jDq&DHi[iGQV%#:osNFBV[gZ:-Y@>Wb1onNFc6#0ZaR;SYBA<(2ck4\*4Z6,,6ps$l`Rjh8!_BP"EbJMXJIrug\"+aTZ:Pt9i]g*<"4ET[F._XY82!ukAhhgEI:"E(bmog*msU8pHE%W/gT[9D+1iZIOqe?_]=>@KiJt=$l0Xe%;=qGU?SQHTn(d0NCi/Rhof,r=kgTK+HJ?$aY@e@&i"Dn>7LU844jrZ!*J4!$4N;ek@c&Ibc\rq5).YrKF:7:e!!!!,#(!?iB!')[a^WAp"6[bn>L]i9>F*)]K@c6(YIj?M,)FJG4tQsPaFN).o:mN\5BA+:"bR1h#_m2!!'fdJKF-3\a(t=kdUollo[bZ@V'_b5GG!'C**i3]?;;?$*BA/"'i0W#?OEDdGV:IVV9cdE62d.I.N6oq=>>3FiZ7dCYO9SW+f;ic6_>Zkl_;Nf+a'c\)7&#a!Pd@[]MQS.q]ps.6o27Z'\0M#lml\Cc\CS)_'i9d<*Q:@L@5f)n<3QQhC2C0LL5N[a(0ca&,\$3o(@$@euW$GcE--apMADeo2XZhK8&IrML'OYl8p3OncN^!4+/jE?eU0F41F[MEquEs_a%F&NsQt_fJ(fbD:j@[,9Ebs4EL;OTj=99RJtQ8$4,VID9&o>q.cl8?_X"a'`)]V`mL1FB9+;f-=`htI>p9s6!u,ahDdp)l#i&`Ll]/fAC!7j#s%h@IFL4J9U*G,U!rS_3M\o(3,pc!VHDWdn2VDLk$r'g"iS=5ha5(tkeqOVLdl(K'M,3aKd==!^uWUD>qX]W4BjY9u"jaC(YI)RYVNqEWrPZUR/LLa5B#pFuS1t6#PW79j'%OJnLQG:1@?b*JNA.07`ee"0CVMI*_$bI,hCCYBMl9LdG+h5Tf?W6:2JLY#*,-mhJpNq+:lbo+KG]DhX:7%5]_qa$5uh]p>$4(>0sqa9Ci;H8>r6bZU@Q^!o-dtW@(#V_/EQ#JcUSG8&D"42]=)WHJ$;f?i3nTg#:Q?6bN<_tL9qlO-h>d'X'&%aCeDJ4%/KPZd]ZemMhj83B22e&l*Vmn3n-@+1QF5,^hDAqi?Zt&LD#@8O)!G?+)P2g6_+nf/t'7*MOCj"q5,Kd#m5"kXA*r?p:(fkk:7)%ZoFS##5$Z@qFI(aS_!^!AuR5S*G;X`bTrin8/Tle>lR"D#;pGJ&n4(FoSd"@^/0)C.?J_.Lb;T7;ND,-KTQ43O0t]OO!fpYBkP6Ae$:.X*?\s>OB!^3&k/,FZUi>)cEU@@jt9fP^Hh_QX%*;cMko,d7IZ\dEthDPfdMl1*<1U?Gp,H?Eut5q94V3DtTE7oe,MC2/K#BUHVqmfid0LH6e@-/Qs.2U.kV7O(=?dYc%dQ%=+7:*#BNs_>8')^S';D@NH?c,(UN:`U-'N`HIShb:f\Q*e)g6'\%.3<2EsPt;g9HuLK\Thg`^W_V\n:E:pX[h&We9*f*`]Ug&G13Tn)9a:mbYBqhjeD=C=fCCDoRqkkqUm#W`g)!]7&N7a^\qn]"4S0q)emb?efsiV/@:e3>pY1];hN=[1qFh4XPgn;D=dcCEko^O&H_+K_mV7DBY9=)*8efp1uoB2m+p4r'%agNDq9;CE*]IeSZLYNG-cQ^Ik+6MYMG65np%NouT>-o,UeF_9?J/[HeUV3)iS_5^MP8<>610-hc9"3_%ibiU(Oc.TVj^Dh+N-a,s;_HW%-:l`4-CX;$[V0UW81pVQHQ@-hgt+FBXUcW4j]ZH>L=%/1+bE81:WCBLjZO.URkiak\%khe4?B0oJPW>Fh:S4%=0O$oB[W$HJ'&J>tqXtbR2_cOMHE;?:LF=u86UTh>Lj!Xm64$CciNsBH;12B?o[nP(=\QWjOAK1:>iAR,b:&C\CZAj&Kq.F/l7jH8O9,^\=;ra_pu'HHW&AYf%)Ye9(J)jMjQFd>>86c$r]L"e_RSH=eQuQH/a;RFKo;2p98]`L%WZW5gU$^S1m(mtZUYYY-W;=q3fYim]Jof/1KRX:aeJn>W]E.$V'^R=hs9Z)IEZrcn^ra@*hJ8ejcN2^*$9CRdF#4-rEt?.>!,=J9c8\ScE`gf`?Cqb@[1<$AoDU[F?X!E]9nX6F7KD*h0S8L@sJGf48,Bi'1)sJe73?oeDjI4YG.KXI40AW>.GTA7LbmgcP\H^S=sqr>[%!jZ^]ioM!/<7q8GBl14I_7ppEol61WR;mNk&f4+4B$1oiC"2dUF^jQ%ko#^?0g,?U[GjuN^@A5M.qpbf]aHRPL7fskLX=><26.-)HlG=-+$q;Qg0T46/';jSesoJkm7:JGh,Ei6P*ZO7i;%fm=n\\^O_E8+fTEdUVm>AMF4D6UGe3E!'"^[ff=M'FnE_>Xbp%Sg,'l9^_'[-;8R\=eai,H"(e2N_$_Y5^bDK;SO#T$54]d'a%lRn0PWU*SVMdQDtKS*][p#e8as:kM;VfL^J4$08=L?bp)>rmCT9$I[KkUN#:1p;W4tucV]*hVY&MgB;rG_k(eWK]#PVI-fYD$]&jh6,DV5uJ^be3`4em0?`PMrl]?RjQHW])4XPgn6E%rY:p7nWR@j+<:1F6,C06?r;r0kdqfePeAR,$+DIUW5R.FsO,as%4gr%n(Sj&A=),!)YAoYou;otg^I#4W6\AYSk@kSnYH!7K5q-uudp7)e[OB[En,K";0m`I&qLIJ4&K_ZV9P.nr`V=g8(-@WZ-pR/C_:bfXa*qtkjUOnk++HLl+:W4;i`GL3pF3JAtg,_mO75d"K'N[tcjGWc[oakF)RWqsr@XQr?FK:d^N7Ka[f&V7='\$VZ#U))7oiN/9dUT%lld?T`5/f$PGg3m@=[O`eDiOC6%N+u2BoBn7P.E#Q%?Z:6AS+J8>>U@e+b\K%e73?+7uq)J%I,ed'7(J=>aDG1Pp=\NH!>WBqm(\M[;48BlK'Vs*5D3bmCFZW%?Vm+AT:7C>>U@e+b\K%e73?+7ut]OS0eZN9oF2CAC2AUXrNDnd6#O:/MBh>/`p8(>,?e4,FrCc86B(mNsQt_fJ(fbD.H.t'0c4KG2)PF-Z5?P@!"$(^@C:PO%JN`&+;]_k+R#'.WV>k/.Mu%$gKGiKFf)WHE<+mcTPkono%?c#pFuS0[sTL:leUGI,)t9%76l4(lD[;/<7`?a4[Fp(bNK-op?:WL^c^7ecteLALJ>\2-doJQGV?&NTXVENsQt_fJ(fbD,?9n#5-UqK6g2s+iK,/*c$CSX>6`p2At"S63n_m%/!^A3pL]u8?52h64?5-E^rU]'8K'eS^=\r7I7W&&sTrME8G^%1o"<[iOqdI8KM^/R+!!9H64Uetk%LjHG&QfqQ#-H?AE'/@\,:RuT9P0DP1n'5=Kc4goUj9.*ZX7S[[HU)gN[5&a2Cg^R3(88"9Xn0O+CU03uT$kL_;dC$TqZhhqD@UZ"T4Zusa[6O?-W8%!40%pY!#"%FLE>t/3+op?:WLeU6"eqT32>hH0_SH2J\cI1EU$YOtMjQIlHlKIF;7?f;B,dV$L[/@a.5G9WT!(]flPGP52tou%N-p,W#>6r3E3$M_;#bR;1*pi'Q.0\9AWG)TWt=cQB<7*j_I*90$adU6Dnd`-[O,$UW6jtDM[-u$DDX4=7'/irqbQ-9nhe[EU/=HA71-\]tCW%njOL@D*/5BlIU(_''S&SQPr#qG[-c3I3osY\mR$`B?$bC!>R-RhK6\p*i$QEW\n4tgXkhb4D'n[WuG6(5$_6na(VAGc2-p-*-XZO@48*W5/>(RZZH$3OCVVQ`XP7fat!,%[7,`#CZ=Oqiq?gN]Tq17+I#s0*/(X8fR*CjQ+ON-h)B!#U=qKic'ttkHE8"L0d22]UJR#Z@3ouUYFeUoi*U3[P0Hlr7%93-9_#+N`u>M_E6?hdP(!.k0)KqbF/_K>81PCk5GaMjGCL$MUDXC^6=pjTFQY_&nq*:QhJ1XoUiE?#joHJS?`mjm$9bhBgbpb,r_"?\KM@8d=,%G>pmcpP+BU&CbIH^-!cb0AI20h$9Yd]KGc2/K#60_mioemT/b:?&gkZ@;dr#5EH?AuO'dMoRDLZ4-XE5-4=DLpJ$>3CR8aH.^=TRiUD6ps.pF'mR@Og#Qc7(g\RS$/g^WNIlpBtl+bUCGL3fp1h=Wbho#&VRdU(RP]>f,-..uFW;A@ZI;)`/f[ZY&2h.HPEr^*BW#d0_06PKF;]PW@mUGE2@T7\)uAjiVq7M>Y>Slu4!,;WW`D.$c.-[Wk+hMCaWf"O8Mh`BE'/JoqkV!@ga?RRf\*2`F7OpAbXiN>V@N#V/a?:AX:BlJJ!-4Kj-csKRn>iPG[-acI_Kk!NlilI7ZS_4ndgpQo^=dsVtBc/VU(4k8PLe;cJ:)Y?8I%oUuD_q5D\N>R1111T6cX61$'_4HTPCmWQ`DOc&N*.k3A6st3\DdU77j](NM`T*h$s!j[NTK!(__NT[9RpW_C]H0;JqdYWN[8GrBiE<'jI:S8.ldgAFVt:fRJq$WGAQtsLOisY?M`TQQ#Z7O^$d,0]a;L<_]AqMIVQKH=&8"b"#pFuS1t6#PkbZ#1C15^aH+&qIS[D0'i02r\g>Vi==8j-3rgm#tmheLb;=st47fsuNT'H54dN?2_C5$t(:IjNL8Mi6o^0scgf2,B\_A$*J(`>7DJ%0h'Im]S5IpY97/+coF(1$GbmU/=N\neoBKMPVh+")cd5JqJ^%%9ab4iK:R"9$np.1q:,P/4i61A=1XSM1DgHdtLKFhV1:li#XqoTW^L5nP_-A2q>_bcE%5s8fojIdP-63si)W5mVb*]".D:lbo+K\/!.@r5&')$N%!a+P!jC`)HB2Q4ZTJfN9M63n_m%/!^Ae71s6%dGblKFf)WHE7S@0r#irop?:WL^c^7ectf7;36EV9F)f[L7oZ(K6k`ia?_s9KFhV1:li"-oU(_lN8FRBZO?Gn&421MW5mV:qXj%/!l1BjHePi@j5AiL@`/PcF3.?),9uUCm:X\4V0=+aNSa[CZO?Gn&421MW5lgj^]+)qgMajoio4DL,,BeXh7NR[q0i"nGBtW'EXV.e+bUE%:lgH1Ie_lWB$HbZ/R%f+`J]'*U(=a8rr2nf3d&k4&X$?pNsQt_(km90%!hR5=maqN9:%8Zqt=m?F4$1EQS(9Z3c,sKFhT,l7l.tQBp\%mpEbSodTK]FE.@mUGE7\Lk:Y\;E.4$1'R;lAoOM"T2k7urfZ90Rk)>jk'ON^5fTKFhT,l>Zjf5QCOTA7VL2UZ8q.lh&KAWqkV/+3Kp'*t]+T`uffpSIOqhVXqfBSn4aVh%tKFgJ/69Qs*]R9N1,UC=_gDe_AG:r]G))Gm7]"4c9VWs]XaT8?\KFgJ/69QrgI/W`i[;+5A;l0st02&s(or<#l`\hM\puRiLoZi/$([<^uKFjnTNsd(Sn(oWtY$=e":e!p/hRV]3*^4u8l013:_?@Oc+k_Qq9F)f[.+I:/7RBFnYHMkXB]tLArht#nq3C@%\(fZla2Q$^SI!=Qe71fN+\&.H(FTb63ooGceu;Rq556@lo]ju-7#;O]k:L%.4XPgn@MJ*I_-tlo<=TKK;,L3*s8KXe\`A*dr:.f7'e4llLNB#qr!W1b&421MW5f&B.,;H'^2%Y*O+6iJ`HJb3jbfh.j6G0qohL0RKR-;t+iGeYA"2XGs7t!fTgKuD)`DNZ3u;+2p?^J8Y-*!:gsJ1qU'9g:+bUE%:lfI_T7?jN?+Y8KMA5%DaDuo7Y?hA;#6tD9E@uHaKR-;t+iGeY@iOS-n%XXjq=s_i]m<]I>\o]rNuiRmHB'"-KSHr(#op?:WLf(+k[R>4Z["F"KQn`+Gi"'+\1M;`+Mp(MB\+NLLW.K=h#U.,7e776`&,rd;E*!Yj)Hsh#Fft>%0;'@"63o:Qp"0Inp$1)c_1S;KS2P*CW$o=m+dSfC'1)sZ$M?BnoCL9mLPLYs]=X[pEC0,!aIhhR\'Npfrohb)H7)$15WpHI&7Q@=EPCSIn%NSm\8fWR-#_YQWHTuUs3n/Y^Z*4j5C<)tmmMslW5jQ&6B"5ocG)JfoVcflb*=GV\psaohRS`_n^C8uTkiAhBu>)MX;U:X+bUE%:lk2skdV6O9"b0"lRuSWcoW%Q"E]a3Zh$[/IAD'2`$EiB63n`(TcWAecCR2bl06m,A]oT&o:L?l6;0.ard5LuQ^!^K]b;R/TcOk6#Vc\Z38a8r`udB)488!gkMQ==\)+Y,F8Z%7mpTX5eZ2dOhuEX^]lP>dTH4b5#Vc\Z3.J2\q/S[o,9QIJku/ZGT91?gapV-H;`ARIUfU/VJpL)r+iGeY@k6WjX&lR2Z&6C_rqL!ojN7,hp59_?eg2i@NW&bKUXott55a<^:0b&5KsS+,eZ)XBcAPM[#pFs=LO*cjXBW0Z_8/ETaM7]I>L/m($Pb.uB?qV>'-l3J0OR/N@`@cj\^S!(>P,"&-;U3qd6"O`%eZ2#6ASL;a4A7+5Q0[/lO/,]EcO3jrk'Y1K5tpMJ5De"Ha[hJ\tr#a\om>)hPh)=r;,`_;lXC0d22]UJR#RMAIpP\@K.A''838jR2GBWD]S5O!!\Y)UUlT>$?n(2:.D-"r&Odk[4AdQei#aBW/t)&42=B4glhp$lL8frEXq\rVc]jm#V(cdA'3;>[6>3)Cmdeie6/K(20YeKFgJ/69VaudaQ[)WY>lPDV_lgs894[$'MC[gMai``C@d^)8f72US=LTcETW%4XPgn@MJ+4oai/cY5%3_50F"3?bLc^GE*rl>ePHk>e+lEk?%HSq<=GUJVJJE#U.,7e71!P5!IiQTAYDEj52_0f'&YOdDA-Jq9Rp2H_Ui5mHkWOS!KA;GBO-+l7jH8&>N'_Xar_9pnLTT3ee_1MSI?H\[`.i3qU^g4*merZ:/SGXJ_tor!rr*H-)3qHKS:ITcOk6#Vc\ZfG`DMCR=%%7A7j=.ooo^B[P"i0D/)%j:"hU4:)<#O_0uUe!i1.U3BK=([<^uKFjnTO*0WphgY1kpQq*N@LR#Z%hCmGk0+osr1S=X,_n[X/ml?Jg"BN`!BE2%rp[f9H7)]XTcOk6#Vc\Z=Eg&_>:)O)"MVUaZY.V`lDq,\:5\*b[r1"/$k*i"1>'3_YMSLX:oMEf&42=b;3)l=>tM3HTgK&>)&6W9W)9>8SNH/.OVVtJ-l01Peu;TGJ:IWAIJNHqp!1OB8OuB+2<:^VKFgJ/@Sr3Vr_g=LCO6"'8/rfX<+B'pcVL?MA[Am$pM)7fh-"$ceI/NdLLBDg#k6*7cj=/&qCFo`lP9^=5h2A((9>hat9t2c\gh\LUKbdcd*%C)/i>_>*(f6Jfe6`O!YU-r>6fkg"ASH4?(0D^_MoM:+;DRpudsI^"%,FZ%I?5?iKI&+bmi&^4%==/hPB8#aN=/hT1U\+HAk=>FW5iD7f-LmieYdMIWiIrZrG5d+V@Jm5lHlU-Scb:o;7Wb*'crT*.JVS(MA/-;55T/c<2jQG"3cbYY4MejjMNZL-\+,i"p-+-k(r('c8.8TC2\8CWI?=!H;B\!A>@!LI_s"$Z\1I(BQlZ#t3ZA,"n'1)uP5YgPuhJMdXK_NqcGJ5k:+[5=k]tJilJ%Vlp$,=o"bEXY4^;20bpRMV3SXg-[1FJ+VQFMB-I:/[;20C?;+Qb7BQ#J70;[YrM0`;r;e?Fd(Ot3Ni="];X)P;00\giC,08abmVWEkI>,SCi$WhD-(Y:a$X[F\'8E((Y&&(2A#D"';[(6_6m:)YH-ZFMSKsY<9,Cmfc+?ETq!"cS*bVse.P2i@da]H1]7.k:ofl7jH8OK=XEH@4[r1-?=j7d`_#6Q1_L%N;rnjmN"qJ%omXUa=knjaZPa*UGOsb'S/MJE:s5kR(Nr+2&=^Tqk^c?+<;PY_cRba"1N#g9411'Q.+g/)L_\cmgl"jc[k-U3H=r2?:JMjQH^o(NkC:qt_"r3I/HL[JL``>QuQGad]Ed)`7Z60Vuh22S<%:*#H0Ym+NO-ji^X<'i#d^g:_Q7Pg#]4(bHuNkIU.h'`+/uJ:li4E14Jt*pDP?&5Y)XI[bjDC)n'%rP:tiGkoj+Mha)N$T5Qgm4fG(AP2dWD?L[379@$b+5So0mYuG]PsL!(,.it6qo=?ZHS`SfHr]87D%K#S6dMA.ZeI4usS$#TRNrH=SNo1C<'K>S&.'peiT0?aH8fi!Or)p^oflTX#G(%,1R!$u,!-d27IoL$RlOjd,dEle$7bSBMT`0bE(9NQbV$C\\Gj"58NNIr5k_@1J0?R!@M4FtNpfO@jCsp`.hq^"$?$f@Dg+ja18pHOkf^R^L8Yr+$a2LG`qNaKn\:5q(WunZ\]((ksJ&NnJGH?>W6J;(0BIMdHqd=FA[);/+IW3?n6XB#+qG,,tcH8,8>DX/)&jXH&FPXQFIkp"7J@ilXZrm[uOBA48YI#L#*4f.8JjU1U4#l,S@',&u?mCqs_CC5h3na\C$q1I&Do93GCh:lbo+KP2K0T:1Q0>eE5ml8CmWR5\W4,^rPkkcluE+iD5:'K(O.GSg%8QU';%9q''Qp/68S0E&mH']Rpj5G(-(+KmFee?Fd-17IlD0eF`Gdc2ML7d]&S7/lu8X/An8F7ePB-P1q-NPsTDW1am/Bug&PL6A3(O*uG6`Pl-p-.gGtX]d^jL!n1X(a+9e*&L\IXRYB>O*Fl!8b$79`O(V0dc3@:(?&>NKY1(?"sHa%:5e7&5J6rsr,Rc:11$cCB6oLJb>q:WpT?22>R`D*Q$TM;#\6dcDnF6(.#R+)i4U!-.S#rH:5P%D3ITmLq);Dc[N*39nA!;Pf8uK@JS.H52.U8-5s6QJ&>F`GdUNdu:V4i)T$!D#=MIVK8ekZb"/DY_i?IjW',d3Z+N:*o""FL)r\Br`4V"Jm97-tObZ2*p>]!TkJ3BB_MM&biC=fC3(>4fHF"Z_I^?m<717'H*6)A^bYuP$]pEK%0e%2qnQgt^rjQ<9[Dcn)*%diR\*(g!Oq`6c!MOP!mGIWT$_9la\bgnatG7S](1<920Y>qSH^,h.0VK/J8m$,E"cf/Roi`E]Br[VDJM\b0;0K5K3=WDZuoN5OqpQVb"fcZ(rh>TT1(hVmSgEUS#Lt:(dEcT.5Y\6=&=qa+bXMO=212:1h*o5g"Y9)Qa:)`)mcFpPjW,2Y(,!4IBfJe/,FmXk#W^11aa3D>rnCJqc-W6pCa)V%1ZV>iHF$5a_"3c56k72VdmHp_V$$=%Z<$ih1e3Y-A2r)JUF0344YLhgYBD>hm^$]Hu^V9DsPgb+*-jQENpgAN&`m2K>n33.VHJ0BJpOTu\PpqSVU*aWGZ,KqflRhn.$:MIIbk,so3o;jD0WGe2N9F)e0"4ZAt*9+cSVsOE^XH8r5(A6.olrNo:dHg@Do7+L#?[=gXC,uiHn\hOlmd[oG)&gN-q,"980jE[7F4&bX.U/bk'1)uP5lT3le:]J`N%LL+$#e@Cl%7HCkE2UuG_Yt;*aSV"$Z:NcB22bUH'F-6LD#@8O)!G?+)P2g)`D*rM1(_rH3edIIt)lCeXG-kXIk!;"sG2?A0N&[k(V,O%@n']Zus!hDaf/[;1:'kH@4[r1?u>braoh7X+>[CNBXR.O$hg.k*aY-F=t^+%N1n8eg*CB\c6]RD?H=dC&)qM5'#%>T;%7)m>Y36-mgNU08qLl"uLp_+i_Em^*BFg0jB\2m4fH+f.&TsEdR-#(XaXPrO0-2H?JV9J_*)u1Uc.rs3,l!I\k6=%'!f>*kUh7^tuuV%PHnnEUR@!9:N)V:Ie!sLosI)_n'sVM#mN&om=Y\>WS:)Ru7<\L10;[2sWiKp/UC_R5Al81OJE(emT0#%aufNq`O\b6BBB%JdYSk=NNT]l`9ANl7jH8&.R\F4bi?g.pH=DQ*c%eTi)oDs10"d=3NNR=e^#T-_H8'+"gf6Df;hX!%Cot#XsQq#o0D\6lZRA=/'pgGo]G]AB9LO]Q!R7:6&*?qMpSr&9rW8`]Ee&I[rDo%ZfGPq'^(Kcb#%j_kF9r>8);kQZI=&,eqXrAh4N/io=oc#^-!ag[`$!VnRh`@b?)(kmpK,2-9F^\7TIH"q;WVfNP58bE^P#9VmV?:^=I#MG1r%&*:=5H\a=#@ani%.(2$O&0a7V>+GT!nT/Y_Z#rUP;20k7W5n&L\4*,W6oYoI`Hfr+i[iH9Y-55WGYWEh?gR?cOULsk-?9E/&W2%`"6b>NJ$ZHNA_trSffO[D!FAEE#Ln\qG4k0mj_tZ_oF?h[n`JiYKF*CVn6@0+TOK%fq9IO23!t!'SI'?l19hRb>In>_1Ja=TYX*m`/R0YV*'`^/'Y:id%3IQAm>'HD:=QM)(lI;ti`/X[<%K,A;8$lCa#c4$>5$gAYbnO"?WnI=3rRW<&\)[GnsOM)U1J$oWgZ9lL=*QP(,HQCJg#Mbo,DBs0r_Hbm0;QOKcZusn1,beI\;`\*(8bMZ*ST>)XGo5@_O-.*?F+Dk^mq!m=:me5Mr7*_XV/8XU-M)ZW2?t+hGHa2GXGL9m2qs0M<.L#)al$U(L$+Cu8j*HD#Ri2\W/mKoE5h(`(l7jH8&.R\F4baTj$TG9CK0j9M@cFpT1$qnjO12G;LBl\p%[;oj%]=GM0T+uY\QZdCkC=9%@!cA\,YUQ;4]uI#"\O-lJ]>co)(j@0Y=%99&@HM&q@:`Zpm$/An4*qKl/Xj'Z^VY*q.L,a7.4<-]`=o`ImHs!kE")F7b3:u9JKZPTY=`2FPV8H>$?ZRHM1fAK8Dr^/r`UJ+IQ`J=A^2?Z8hQZ.5m^fPe1NgA*l:(/iNSQL\N'O>X()i*MEu-Op>MRmUk*lV5EFI.K;'>e_bcC'1D,1YCrNNWRLqkL-A2r)JUF96MPV@^Tenhtr)"F$Z$>+tCl6ma[s-SHs0E.XB=`]DgGn9)gN=PWQ/HXYi90mD/8n!A^5r`eXE]t`M+%12kL!$RgkiZ,o@/U]FF*a$@46t]uVn)a/:_[d4g82](Tu*0t?+3h"%teHf4U4`h`EB^(r34HanRG8Z>*/eq(Ft;nLtR!NGeVdVm+a9tN;)`g@I3.?0u"qduS=%./Cu:SkTh#RJ*!h^9*]U_Q5?VfD"[bCg#OB?fEJQ@-O_8nj!\`hkih(Gp.p+&O!S0Y+>C!a6(iA\bm$9#$%_#3+(H')UW%.R4Om,&[n_;;C_@,&420WCdsKCGeJrtPI%XI);]*O"*U*u"%_mknSpL`h30MKp[os>O&^Z8_[rGp8`.'WR>GSm(*S)VlEcu;LbJ3iT5?(M=FAr(:\R0Gq5a6&T?a"Af]%Jk\Jj%ua1,]rjXjK@PUqqWOKI=qaqk;1XWY9!4_q>IAJ_$5H@Q(u0$Tg)i1o!]H`2jdYC+>@],Y^70qu%76R)SJKJ,Q9PrVlKQf\6cMJ`MSC)CVcPmeV(_:s:qdLTiQ+Mc`oP>3-msPqdBT>\c,NV\>g82PHRK$H0[G-W#gDCY,L4Xa>HXn21^e:R&I-ECW7EXn?uph\*d4iV&%NT+qIJYB3q>/D:f-bfh0EGeg:-4q5MkP.2Ve0!;^(ORa2\7^Qjceh6Pk.2`(E":g3^i>UfBAsL\>QPeLA\;lkQP(SFLg=;k\`7Rc.g"njI<:*95QS$e3*QdIDa40_]l=-rlh3rEnGEA[sC]\00La2543$@Ao33#90EacL?:c]EG.q2m4uGq3Guc7Yu%[(JF;F"9(C%!M1(`/aq=bT(_\o4#^k(rFRcoE+>fmZps*9-l`p7B&1\N7_Z'eEaj\-XqLacba+B]#"J["3"[0Kk=#iIDa+P!j1lsB_3&T[<^"\QSs8+?A;4(ljGVnQq[!:3mfS]uYT)SWAlU+W2HR(?E`\VIe0FTcARuRA^h.)A2aH$MX&G[_/VVk]@f`bT[\%6GkrK4;FV^2U!4u,Sc>p1m$%g^%(Zm'I#42E4EftcX&Z#@W^V4,/dRDN353dld?S_kPVS1_fd_MYXps?&,IlM].Q9Y/LgoUk'.,1bOJa]IlD9L:mE-A0U0=?q6LBPBon.+[cG.6B<4tn`2dUEsqpid2;\#a.g!&GuL-[sLKFjjYl7jMF;:+r[:u;k-CVB/sjQtg_@-4G3Gn[eK*Po^UflBd\bE=drrP:s.p="d0eF,^e-A2r)!U;Ba4&OAs\5@ki0p>c>i&i%?d&p.sSP7EoNP(+S7hVXe78sKaQk2T?#,oS$lpO.gj-'_Nm,)g2ka1rZFf3o2*1rqU2*'dtXB1I409=EBkWA%_$aV%5503APme+b\J\hgYGShBO(*Ht]M]V1i>)W5f<^%PrG/i5#N.oR6JiG<%F)#pFuS&qBiLa1--LcC?n)WWK#N@4%qn$u6>/HAiY']_(.d0LnSc+bUCGA)kRgbEa_9[?]1W0GDrGL,F`(4^P^A.:2jkAEXXm#dHO1hnD7$q!](Q?5VK*BefGa?U?#YA/oWcOkdaN*ol>l07%j1grY\P9*c]ZpA"U\he16)\S9M>UK\BE'(urIQ5gct*,-ZWGl%'3iF'RH*FAB^XOolG+bYX^ORM)AYBM1D&:aF;+#GIo_eOVs8DD9l^\;)K]EnnM8K]A?LIG\KFgI@52aD<(ZWMpgUM5J^WK7VYt=HEL6jm4d$aa1"X/O1U*)T^IDgpR7un_A3tXdbaa*C8L6jk`$A8sW8=$c-l-f([_dd1dq5"fmLs:Gd1q]pK`=4J?HKRU#+XI)MPa"">e>QBJ$QSQ4Hl(&D0KFf*]l-lQ2=0KX@bEt"onADM@a0&[XEg%&$X:i02iFN?Lendstream endobj -35 0 obj +36 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /Decode [ 0 1 ] /Filter [ /ASCII85Decode /FlateDecode ] /Height 1117 /Length 4054 /Subtype /Image /Type /XObject /Width 949 @@ -289,18 +299,6 @@ endobj stream Gb"0M0b"+:%)=Rr<(aI6cteML,KQ'STO`KV!&pd/(t1g1Bd(L'&7\n"0eL>2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_2(1KrF0rBXAdmB"-+i^l#@p4[C/]="l@S@.aVM,l96B#V%`j?:e>)4mb`0_endstream endobj -36 0 obj -<< -/Annots [ 33 0 R ] /Contents 130 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << -/FormXob.baaa2211732baa0f94f6912a5b035550 34 0 R ->> ->> /Rotate 0 - /Trans << - ->> /Type /Page ->> -endobj 37 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 668 /Length 209613 /Subtype /Image @@ -311,9 +309,9 @@ Gb"-V$!9sU*s_;lp9][6,"qV\+gPXF'PT&&9L;:Y'HnW&7hN%"=j#B+/=!W:PR*t=KT(?2Ql0DsrVq!= endobj 38 0 obj << -/Contents 131 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 133 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << -/FormXob.5ed95e45a8a19eeaae0de69cc5ab3dfe 37 0 R +/FormXob.5ed95e45a8a19eeaae0de69cc5ab3dfe 37 0 R /FormXob.baaa2211732baa0f94f6912a5b035550 35 0 R >> >> /Rotate 0 /Trans << @@ -323,7 +321,7 @@ endobj endobj 39 0 obj << -/Contents 132 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 134 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -333,13 +331,23 @@ endobj endobj 40 0 obj << -/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 101 /Length 24327 /SMask 41 0 R +/Contents 135 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +41 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 101 /Length 24327 /SMask 42 0 R /Subtype /Image /Type /XObject /Width 3083 >> stream Gb"/l#C)J%ieIh?/?"AYZZeROH7JhU:J^C@%t!>5l-^^trQPP.nQ]P&.G;j?K+E5*g%7,hWacpN`BX^2IVtq.:rm=lji`\[_\?zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!#\KTq^c0JB:sR1^5Lj`EQFAhc"p;O(Rl&)q71:5KH?1G_u%*"`c[lojNia1R:XRQ&Z'=oOL.-RXh'/RQ4SfE2-Szzz!!"Eap?gU9_%1Isn]'\6Q_e;&@:<&B8kM]p#@'MdFMM1nF:gZ3SijR9Hd3FgGnp35Dkt:Vr#p&>*7$hGCpe$.&eYh/4Ve"tzzz!.[s9%LCm3cTNrBn^LK5KnP+ML%X`]PF@2\LJ,#^Kd+#//g)H!i"IJ5<3BL%Tna[ER7tTSF$V5=JC':W>?MFA$"hGN--#ZCVk40?+92BAzzz!2YPm&F.cEP?aK@QM/HOY=RcA/mSh@kfP+,J,d2aQE[TtTY.t6"%'sd[^(Y,@]J5Y1D1YJ3]k7ueQ$[kTTl@f;gj]+i5($X&J:d-NEWVuM0g39!K4F?q-r'bBl\PTN2916NZL?0`JPC"UX@t>V50ndY$e.^OHM-PLoq9dulIN(A_2X_;lZ*)5CE7q*I$9^0$]tIZ[;FaWN^gJp@:a=fk_cOW0;""q;K\^S4o>C@]A.mK5A:bnYWrg2!mKQ=>Gu#7mt:WKLL=B"_Wj#+s'r@DW/pi2sKF.c8[;pqdmnC4F9U-Z+tc(pO!p$7,!br:.Jb?q&LnN-Eb?[1N5ksEO28Gt[KnAA#!1H4br-n4!2*Z:.*dA)Kp$Lt]?SpB;aA*2T\0hg]"?$kEl8DVop?mB0a,55k-&ijs0lb"%L6omZ.e9.=K+TY5(05iq=Ed-gU_On54cuSc'gMRC*OrJV:m@sVRSiCR`34`LppJ;Q<^n?c(r7Q[VjnNh?YJ0kUqk]?:p6_e9LkmJ;0][c2e>ZBcX]DL9rV#"%-["q:60YgpgU:"8JX7uS5UbO#pfhoc4SfRN])^1>4.$(u6@=6tDIfWj4nkHp%hB3F*^9W)zzz!'n(_%LBcHp=j#$$lh726\c./CY"`5+Y&a,f7-%6.k=9XBE.u0;TXRu';Q7r_f=neU"Qbbp[6jAhK_SjPol'JO*;\iq=EdGo)AUbMq`.*\r#an++IPL:rn9m^A:H:>bacJ0>@3jd\KJ&^%i'BM/+i@$@1fF8bj@rLt(e70>@q-MUY+sJG2^;=0F6VY]KmI6M\pGhm0lSd=:*-"aIHu$X8]gLsHUaNQb?_f1^S5rQPBDzzz!!&[^+UdqASGg6]f".DPDq/$FbEl$TGd]mKVrH"q)/UIL7(%='4*HKca?O=BXK:j.#j'[@!k$!FocYuJ5Nh78?%?SZ*D?Ju+[/+u2_rkVhKr%_s74>dr`0"!zzz!!&[^i@c=Le*3\!++O2C[u^V6]j>'@7Z@b#)n\]JN?^rR"HIuQ9V+@LWeugsQ7bq&3"]QrUArK-2g=ZCiZd1i,*jFIiICZ1j84fWI4L1iOOXN#TZ*V=M!qLViOfHn,>!rC:1WFPq!O>[]'l=>Gk4:T>OE":]EBbGqU;7#+6Ou=*(#F)b>o,+ua=Upf8?:9AW`2Pp=0#B(6%]BiThZ5q7ZI!7\3"&FnV,bI`/#$)7fN2CO,F4mX&j5hW)8<[*U;7[*tf218ih.^kV;![s85g,Y#qrJ:LJ1F"+s96@ibcpt5Y".DdINis`Poc1LYmdhVH!R*3Rln@&H!zzz!!!#\$ooHkc%?Nj\9@7CWEGnr6K31@Y[MQ:GM[VC.$UmlI.PU1cam;jEhu_S&e]6\nn!:q5BcDGdn`3q1$8N6khR>r@R?51-Fc9)$&%fcS0zzz;#X!W8I=util$[heu[!8acW(3`5G2HHG*Y?DVVa!]!^;[;?N1V-'diO[neJ6E8\P,n`(E<>aUhCk&`XSN#3^&ir-AK(5q;B]C2n!Tu)0F]bbq_U0B@VLkpjq_hQF+3V21FK0BNfr:k:#3=5s$*\=cbF6:[gJ,D$Io]R#?np&QhC"#J,pg:R"e;=mDi,VD>V=XIJGh`Lp9AjCU?FP;pQg_6]"qu6M"o3Z`@AZp`9>&[0'EA+5zzz!2(%IaN1;XV+QFK'rF`s)XOa(@,\tV@VkMIqeiVC!ek.arr(g]p\HQIaNs,L`zzz!8nV=,9u6XhgTqFeQ48#W)0U"276U.lk0'/l#bLW=&4coa,V1V*X`[60>@3Jr7"cM>T)mZzzzzgq'"9F/HfSglLPHCE,BWka?(TC"&qRYQk45jmqNVcT_5B_hJVQ4V.Snzzz!.\8lX]@N"fWa&8B-0-S,hQT-zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!"Li37=fdL$!9MdZQc!<<*"zzzPTciQd)YTL7h@Bo9*CqriH5%zzz!!"E7&.nC[!MPu[!^Zkezzz!!"&O&Fq1LTpnm\63$uczzz!$2[_ng=I3S'eMW&DFI'caNmNOp(Zkr#5LI!rr<$!#1`,IuD&Ghrb"?z!2+]Ni'2`'&G#"D#D@E2;i^iWh7p:r:fZq#-4\RJDl&Og6CXcH(nql]VNu!D`spVtqK&=4DT"^Z>V?_n/tHPq5?QAf<*A;&b?@/%qYdG`hWn8Z'tj$(n:uQ`#oq+N<`:Dm)&)8TBqCiHmbH#dO4B)O"cSp+B&O]#T`$-_G::sp1^7Yu=&J5Un=iFI)_#M*%J<3!6,Tnoj9RZ'!`F:cIUU5X\#Y>?:8oKRcnH]TI`kNie%GLWmHd]6;'UhF_cGhP/,r9,X3!#U(C$8P25R&[=_M+G>Q,LuhD66AUGR(gI@Q("jN4#lQsb\hgm/N,s\u7eBUaY4>DL!(f2FCq[a"R7BM5\9UfWh<+?R(0Ka3ksKc.N9mb9f(-tOAUQTf,M2(6:8DsRUsAj\;GJ(gg/FqWW,g[$:&e%Tq[m=YXm:eMJSJ%4pE-&#Z:f7mGfAlReNYuoGZ9NDN?+f9d)GY`!?j!W#mfAR&eIAt`0-@8&0bS?8jEXo&J<3Y"G@&Ek*[q(fn1#jgo_WUP`Ud-$`r92G%.@BoJC*-iUH[/cEr]\TWC7>d%/],oeni$0m1OiF]WH`!WA`/Gq9p,6:=5[ng=G]6psEOXosE8CiKW3]!YKcdqpOj[R*u:\f(UtB0!>6ql`52-A\JO`Nult%b65ne?3/MD7)>>c12mW\T$-*-cRQ?s4gkaD!mR#hFEMVRcuDVe$(8R\$u]d],`^WPdihZ]#*$YBI'9en0^'m.T4SK3_[lF_R.jAA:^C,Tqc:,QXU.>lm?KLfffQ&4/c9;$dLO+sLLlPCO2g+sI4m!^]>a=9:g_:"#*@RB.1%pEbD$IVs3G#S+:fWZV"DI^@c05lWMqKm2jDi+?BTr'_X0\p/kJ45a:+I7sVH0SI%,$YN#>ND)BD$(^-3*!]+Cqrg=5jf'E]S8'2n`8(@:clhY$$:T9Wd@9&bEr7)VN:MXKg0U'?r?Op5Q,Yj[[6?`0q5K_GZPId*40D+[e^L8I5YG,*o/1KFe_-Z2@0Y#S@X\K.?tr,(&>NTrih,3:+0f'6Jr.P*I7W?!Af(S@"YXcLHNEhR.CG^ojj-GF$MFS$!Xa,@b.Mk/HrC/=kgf]G&#,#)$eNVgF9p%RN<^/*,E_%69;F>Mpur_QHnnc_%YU]6TAd(R1(rMr'[C5LQrn_WbS9+Y54gE'UAa[[D($?1ph5>jn]8O],TDZh05?9<1HUOUH*^1A-:uX5/2,6)'b?1BmIk_kbp3fQqB9WEqk,SGhDu8\6:=5[ng=G]`*;$X^+IdRp.cX^3O)e`Hs6Nt1jsc/Zsc0(BTr9s-Y7O)g;r\'jlp9$M=T.^*Sd,UVN:&,h#F:FY6,sQ;$''Qp'(Ucl^)6GS[igYI7/Se<4V<9!UAB:EAl[=&K3`%m9M5&I]u;+bamaggR`8bj`^KU\oL3t,@*AI78.ZSJ%@JOD)3ThD0"1nhd,[p+G?S%R1'AOh7%d43ltd=*QV,nXJWZlKmV>4h0geP9KD8E\hc@XFL0qYrMudc-[*]IT=;^@WYeI1jIh2)55YBTi&]9VDgRdA[oFWM/58@$A%2I'^fn;B:gQA5FQo2OM\sGi49#T_ZM9`9&0`WIR1n`CR[I1$noHSRpr:GD]<3J'UD-_XN@qR_7+3WBGmKa,un8%?6!d+=bb7BGJ-D/$HUjM(O.:6)r@n4JHEjM2lDL;DCLP7BF=nD@A.M(c?0Bd2'[tk0?&.oMZr(0-Zn^b,&s0DAg3GheinjU/cD:<)FV[W:N=L1-,Bed5'l?/DgKTq%)I5]9+=sO#H`K?oklMeJ%R/BTUnZ4.bgplEK1T/]l&21C9>nCL"*8-P*j+lQr#pKR@!^]?L7KPnS>%V]3dJ[<%C"&XRhEbaCI_2f5YiE1A@-o?%P0@GOlm8+)+sfb9-T7eBW'.R68?l-.[j3`c0@2.O;ep`Zuckkt*d02ld3e0md,0Imb@QXdHY`p]&!MT#$j(jkqCIQP`f6;,'^.jf=af)D5[oq)6;)9sY-IG(n3Tea%S]tD\S#`A"&<_2;$ESS>kdE'Af;gN\:B#1h$L_/,NMm^BZ8F_OWBjl,h\$Je7)Y7QJ.S$,b,qd]gei4IL^);p\oF?BX;DSt^V8%6U0P&^mHI`TC8H:[6I.iA:ZY1`'jFkbKoI%a+::7564NqnK\TtdYQ#6C;,b1=qQf%]+9SEnkL[5e?#W8srrj0XU8RR@ZJ[MZsMe1o\+-S4]3:)]uAYNXckFY1RfL@iV"NT6(fA%*D,lZHc`!NKBLs%0JCIb)mKVYHqKkY4'8(eJaE&(U)]_jQ^SI63EUHY8j2@\,bY>NDCp!?j"IAMPB-s1k(\Od"n]0+Mn3+/ILtQ\arc-au1-cMR/F5o&t]6<:!/o[M.n71';lkp)J4.!=rT/!g[TE5:J;LBMs,HqQ^1&J7Z6!^^!Ml=/K7RFBNrjL+1=s8;hn!^B\HJ5F.55PNT)pPnY@&#ht3Zi(opWsilI00heD[&7D)8;5sTZ\]6ZL'3/@&J;;G8O*ROQITqrY9iFbI&dYd'E=A\5-Bs-QA9Wf;D65&Wp.Dh9CHr?'(_8NG($6:f4O(5rGnSl+[0\b8uKr!0-K=jF7G4Rm.$aP#pKRB!^]?L#*0TOQ[8*R<04-.P^j;\_D2u?o'iQ@dGffN=NimI4ZE'+W>r$em1Fcdijq3-=?i[q2pk"g?$-F$c"kuPJO4P/gk$#A_[d\^#UmuEWNPC#5%s$!/[2T*/''G*kYf>hU7-hhC*8l>n:&Da2nm2RMse?tu%,Md;u2X"q.Ld@/R:m!%Hj=LD+_EpMd9O$W]6FUm(FuDj7<1b>i7]DTH2(@r&2J".+kC6&(+f3/&0M@[J[iW[i]sW'PcT\02OD(%qdYk#Nf!^Rqrk\Ta+!"J$5Xnq_WXaC\G,LC(rSF8!X6$p!Q^IgPt?+C\.m+B2kX#^P`a!*MUf8lGdX=:!)n5cA/QjQ27%UYYY?Su#=VN$`\*3m#([HI\k*3eb(g+F;Vj7lEtnpI%Gdc:H0d=[\s-[o*@mS3^elgYUi&b%L+8/4H:G*$8"G@IC/@p;#K('7s;sf2J#=Zp22DdKQQMrMJgCe/L+Q-HtK*S5Ub7K1ag5R]R8"5aNcfQ.qLuHTW\YG#"8S[7@&JNbpWT9/;.Rr+>bt?KZ.C"n%n[;a]ddp.1RUBUIj:3Om)c1F1W3DO'aDE49%h`TYJOLgnIQdZ!75?\&u<`5%6'RF84[H""&g%aW9u*^*#Tb+G>Q,,q/j'IXRqHpOPFXTfXJd6sLG'Bm)8(H@4X$!Z-qi:RU6Gb(A]Qi>i[fq1Gn5bX$&0e]Tgp_uZ/qu'.FO-aiRM;lrP[E/nIfHei`[Tc-3[?Pthn,`WD^ChuG&8)g[7/$^P^j>)/ZZdVUQ>4L^.mn_K.HZ%DLm")bN3f"j)OX,lHmi9ha^X%7sVS."%#?'g#Ghcfl1c"F;l>F,ZHFc,5OtPkp)dQLumLQ%1%)lWA'g3ii.c%2*m:T*/HJD3c=Xo[+PH)?>g,=p@,P6K_CsR?4sV8(jk:UNl;t#iW>rQ!5lYP\XeM_A*OqnAhL0%e.D>aaC-NpopC\%S;DW;[b9q&VW*AGYbT6(5W_P0^]PH)BhN&@5+=%A2>PJ(T+&Qomm3k4bkejkNIJ2'8K"`RV.nDo2&`$G^)_-:M/]egR$1ZU=,cBIa[;Bcpl'dh;Gp+0:'$ZSR:7JZP`gK#nc^")`/tBB9FZ,4O3H^/(Q5T9@L`%L^CK/q8+Q?*I!?oBc2g8ZSB!dF6PT(it?@t1EGj(&5pam.DC?]V[Sl/!saKIQ$BpRSIm(&;AO19B`>A4X4]`V1!a8AYVHYK2j+nI'A+nm9?IlDWW_tjPE.10n^nq&,J=lB:0/6[5o0Wl[k1?:Qg[^B."8JV2()=k*nt`LlDk*?/!7L5TiJ1<$+_9E(c%@c$hm;3a'+B;oIj024j:3T62P@YApT*:_QJ]4.Y`52?<-*dS$DCt:,+0hra`>IQkF5KPpq1[&V+LdA:j"%)0G=UrK?QHma\=Ie2O.GUuBm>-5V+h]Wl2bPep\Zf]cjd:VaTtN6KRp7HX/Vj)B&/Y:4GY#r<[IM<=TjN:MN>m9$Ak/D]VGA23l.](g.DNt/4Wl"N5Rc3!#t(kbMjX:l6#&,EpVO1Dl2b0i?(.UJAJ_apq/du$<>O`L)2KOZ>'rd[,"dk)m\o$7#7Yr(eoUd2X\ke6n`,CY-\'bKtI.(A#E''c;hscdfrj6IlG@F8d"GF"h,p7l;U\H4hqenU`@I(+'Q>1nb?gl/KSsC>!+9/lA9D;V6gO39RXDM83ne91bMl2Rfr_[P[GP0j;T4n8l/%]Hk:)kDm]**cud9Vf`OO1./)ij8VmbQ+cs)B][55(>M@6^[^Dj@_QQ$DTZ_.:4lh#]pbI@?)N;Sq.5]L[.C(uI9#<"J`:IH6%&r&s/foJ+%t!*%F&GuqNu1$5ZhT2UhFlMeK,9cqtKWQ,P+j%L?C7PV/tb.tI;HLBN3I9[jk'(d7li[lb`+iISfnY^GOlk\W\_rOC'ck;f%2)LF=D@SHEnQ1bnZs(^4if?$!^clkXh8U%^Wh@X8jE[*XosE^>W\]fr@4'_2Z*-c#AR:hp"rDgY(J.\aVdfJW!,7io23M:siDqWidAm\rC_e%;>N^U*mpG?19]rI)5i@S?$e<@Z67q!Z!O')$&0ennD;^&7MN&)VkLm94^MRe2;55.'AMM3jgDRM#D]T2.]KkWQKoc]`A0r`amFnmCh"j)6S7:p"K/Q=%9Mb+kh]rPB6BMVf?:Dl#NRI+>hShr08IH<$3BnnbE5CYo'.a3TYe&J2fgP^j;h@Ym]B#SGnc%L?4d&l!#"-hV6@0H%6uB$9;XrI8kAD`>VUgopi3ZXnpMQ1ec.]a$PZZCtm$Sc=Q<$$5b3<;bT*h5@@YAOLUO%/d\K#Kh3%LSc%_$#-NPAY6pqHd`>B0?\10REmuV^R3HiapTAe>.V8?ZeSNld>32^[bjkM;r!9M)]9fZ7T;qg!(F0kMVEMeDi]cDndMGZf9\C0s+?B_nT'4^Cae9*i7>j$4k8itcu/QXU>EqIn^KmL?o+OB&sEHD%4hZo?j)"`??]48b.@`>-^<+qKfUl/8BWi^cLCU1Y..m:a3As7;geP)30\!//mR?NqSH(glS^LS1%*-,O"!sF:qg.M5SM%@Car?c*e:&Npu+0KTCEoem37Li7Alu?#$&eOWs3J24_l;A38,TqbO*&[AEYXcktO-pKeq4f:V8njn>F(HYZU(g"dh@Mj=kQDoISW;CKW#^N8.JlA2>P>?X\/T=jookYo7&rKs57X'Vq!iC,s6Qq1nc=06J9icb(_mm9>j6r!L2;6V:b!Xs#;Y`GhaY./PMCSqR3hG.F-pl&lX5R<9F!^_^!,q8p=7!.$*+I(ZbV:01A!]0Zn)m"o2\YX3B6AH^3WTT>!IZ>8gbra`KqL?a?-M5K(3gGm6MVTm39^,rk55&RQ491kgmtEDRHNW4%tCi^+JDpZM-f2gE0!5`oHr[\ps26H$it#H>6l5d!q^E\#]^c&.oL/\/&.2.'uRW-H!Q-bE\kt_uuWUG&Rsn$Di)"[b$"@j8+1G/Chi6uO=I]CI,c)!c63@HU_2n!Ft(o"*Y;L3bI*7jFlm@l9JU1_:a?aZna0PYIB\4/j;3S1Ll!rO^/Zer4)0NE,6WZR#SI]cEig%73T5.?=/5dXp[5)i*V*/0(d9#eG/ipfCOFIgPQXZOOGIEtcXJ<8+9rU[-]^AZZiEr!8rbm4S`nOc%P&[=_M+G>R=8c^*[Z5LgSY`(SPbSSSbbf8/K*CNomd*AdR9mE&+A_2Yp[8J+]='V-<*]M(\P09&92g*jAg(cCG5NU@qD/7B4:>9o+X"qZOYoqm(+eS^[:Vh/@KJiGn[1Y3*X\-3;T%m,a^c!8*9cMJ[/hn@"/QOOg5>]:&4,n;.lT-st%o>HgLFWkAGtk`sQ)*6-/+#!3+P(f&ppD,kAkm@mOh/!2E[6t76/9`l^XD]NBoDj2cc')um<.Mmg]Kn!=t5I8a3luNS5Rk/3Eigrc4gGjN!+f[[o]RDp+n'J?0#"VPpI23XGjf<9BWlYqLpC\jb8!2/^qn(s"W>pYj1@oVV(f\Y*,AnI%2r-+is6_n"3,fA?eIB_l$Ndq/(f\$_+J,J/l2/`04J=kst._god6D^]C,/_]-tfD7SH9^N7pTPm@Y(0hO\:&[=_M+G>R=8c^).njRUd]^`pkXJe!*"5Cu+VDC^O8+q`Heb!:\:1rk=c;M4!J<85lFYC"2-o*_6EF!6X=khM6=*6B9']>t+C6hAG!VkGcaRb3B5Q,q)_4IV``ZJ*5LWN^4'=.@#-!i`Db[\@r6)9Ks,VqA2[HfW$rW>U%AL/IPLkpl'[C?9)#@^F(9ZQtX(>8=ZRne;^Ca1Q%s/KD==Kb`Z:V.p#]Z^2-\cP2I8N->"KJOtk3[!Ltf8q]VU/a6KbWR)u.IT[2e0Nepbn\oXa84o3:Y50G/-LX;[T$KmD\[ondJ@%3J9T*`[aa6g4psu2DH-r\=enXgLbO2.:n*\p7[WtBS2T0cdrV?=4IIOCS<@]*bUJZPuggEAq_!pE5OJME"KWp(?(8h:gY\^mpmf*pN2D88$NP)<:HU`)g&44>$of-F)6e0DC::iZ#5V(m:K;Puqjmk_AKIj*hZX^JS=#kqABRNQBf!s>na:!YY41,jQ+`$#2jI%AU=WP5.K2epLa=VR+[e^d%'IP^&F.rgFXYnJlOOAe2?K=&>2-H]U5N70AF>[UV_e)1jpHV"i]8[1k.W("P_A:a=&l2LOMcP7oW\F&<-EWVr+VRi]E1EP]":]QgU59K)Rr:K!ZUc^:hZ'b@g>^hXhB3sQ$[ek:o3"1S2g/Pm<[h6JNO!#i`XZRna($U]/(fd(XH64^+hl<8==@ZN\D-(oliB9_n)g0[NUOaDS15NGL**4!?lqV&i2JiAr0'=G;$UMlgt?pB*1@h5c>B5F=^=k=QRUQ*nRMh7[kFli/X^/90`d+[8J\jrnrj5>?b@rMbho?rn1Ytot3R4hib.]*s!2/2>:0V]^I?,Se2tGKFm["!saKaa)#HhfmC0i3h7.0`lR6ZZUTkNP.H,rQNW-(AFGPcBetp`2j2;u'Dm]#PuE/?r03!);&j#e^p[]C\oiLI[k(oPaEn9j?(4RO:PpU5:LAFO^OVDl_'HRf*GCc3uhlOg`o1SDHjSL5BVp.G.91#ZM!hr=#e6-\SuAPg5t@IZ,I8/5rW;DG/MJh%&LX]HWU6$$4'cc:.;1"mM)3G4k1lc+mit(&J,Sp+#Af[`FoW#2$nRoB\bGW=SCkJZfIn"j>4H7c-+8\4%'1U[UM,48g^(=11-)mODs6[Cp?fP(@.lZe&Lc1g2,%h@;;EQ$kNuUR%5T7RqI]3M=DDlcBq/S:/-43cP5]XFDf[jO]q8uaiS_9T5GDY#m^^=rdcpfRsCJM\`rXd+!"H&H>7)E+nJZn2XjWJKM"Q)5gG/^f>M?#.n*495X6`)#matMG"07C+X%RAXEj^'?h(J.=,TP\*?1BAG?0`!D^.niW;-IM2#AR<>n?#3IO)-M`hhRpb;(FdeJ+,sn.Ybmcpf:X4mV)@]U\B0+_:/B1i\)ErDKRb_8Qa`YgSTFJE5D949*,MTBk,>5CK,*=pErB)`#eB*2W@j@6jF/\_MA0Ru+nbbiWp.F.X(GS!/uTs`q!:L3@a)"$e?578RPd^]aC-j$%djo#+"6,#.fgg3ZDmSaIDt;B'G+/;*b8$%G<_K0&^.#i&eNd*0kY^ed9ReGSs=H`\@G7R`IKS@aL+#UO-gHuR9'6Jea97bGohIs;UsnefdDiLNuful=ICaZm'D.dG1B^OXn=/IBd>u&^(=#sKl:qpM`FT\3kfbH?43)&@RJj'Wi5\Th"]uM:*BB-1lSjj5imu0#l5&NOqCKrnZ9?p?SM)3DIU@[S`p@#R[HVLD6=E\O;%.BD=mu;>!N=-sd]rskso;6+PS!t]b&O0"[3dEZX0k'>f>7L,CbbG'[8Y5B&I0g/_[T<%E*bSq`-k\FN,gJr@Dgil[h]p//Ng^QT8UW.%?JoF&*8Vh#qeGI1EW,Ufjl2EcG:dcPYY&o/bNW:u?\.MoP5uj$j1XN(:sEi5`Mu*A1WSOl.ZmZJR_KKI3,k6Tr"/2^>:s*j2j;Q@]-f)fDgRd5&i8-d4Q8X]Qoh`OGOOqD4\PAUN0TP/KWn^nIf/C/HKVPsb8PS@q!*@o4oWos0?#S_,1h_CKOA6TBG3:kunS^Le%GbruFfuI5-'%f0]/=[Z1D/"I?^jVqBZ3'jFkb-&37b0D0:/d1?)EmG/]p&Af'FJ.Np9Rm+!93?^S'=;QGr;LWI-IT80_0D?krboC:S*,@Tb;SR::lZU9ee!X_6%<;sG;D7hD8ga_qAo1a^3doM&@_[**9R5Ne^e]6i0k*QEhC-k;,<9bueVg:Mp%Z@91\\Y:$f&M;'SK&k)J`F!2B:Ia4EXaJo4Rp`T)Q_Yr?Yk*n=R\+@Rss9Bu>B0qG.dp1a"*GSbq8li`h2tpKsaTl!o(PC9N+Ub.oomM>^?X[81lP#R0G=4!9dC]:!,Uht0c/g^E_%YP@B,#+n)^\%f*gM/E?fjM!4apFGdqk?@oao)YuE)<,s7dYX'd:UQ7Ed9=ddVX.f=o`\ikPkOWjk_4X9L]'WL-H245AiBSMi&[iBl?mpKa]*?,JLmYN@@qi<"?Lf:GANhABsVnF]i4@drodK#LV"nLP>Wg2f]%[nVD\oJ,%TieZ2]!rV?=4XEf/Nci5J3.+c#WCJkZr5CMGV[oFI]qQB`%!?j!k#m_\`TiB@1kd9*Xs/,,u2o%$HL_pg4#U'CR`Phb!S_Br<=V;Af3I9NX"c7N(?)o_LI-3F9`!`D0DYiRgd]N?)):?lqP`Rr%PLPHTO&rqVHd>`>VH/q>5AIP!DNeG$hm$&.>#R*/opIfFG<.k:dOM.(.EHkT>9(X&0f:[%dD'G9E1\X'FcmEIh4C0O8\OKUE-J)lo'tMld*K>p?^Z>iG.l1KiKSZ),_sL7>r>i8HZK.YS9CBJdH$sM&eJtm#mcM/TO'H2dr*L&^pg*PGi59@[klbUG6i)3jR/FkO4FKFuZ$j-n&VIpsc)Q>-%JukZMrh'/(GkN\d`FDhTu+pVZrF4N9)6nko.&k^&lW,C6<&F^!-.bpp:c8=N)FhmGK.K.1RK&4.p`&eIApjmZk3@/,P]d+-9^%i/F=JXK8p"W\`]NR2`PhbYVn+fB*8MuGH64m(d@knB-Y)R(=)UtbW,'<;fI[S#:3-B,!l%fa(D9`Z2=mXS[B!n$9SVWB/\L6jF^dJI?eQr+0tshAZ*Q,Hd46@#mp5al9_Q263UER!Z,*G2Ok]3Q0,2l,lM4r:57*.TZ35jS`#.NqR?u4@.dVcjKPj6c#aN,@:2XF8\F@\p4o([M*QWlssMNMm^qVk`:O*HL?;6q,2)BkB`a]OTmTa7.le"jYoY&,*1Bf+fMX?SlAS]6lI!.s=>_6APeg;U>)%I-]2JNScG.Fq"4T$DmJ'AVd00!?j";+27d#0&ODjhmW=XYAtgX\9?Y?ik'kcd+F<_KG)ioQOXK=->mM-DMgu?S]**cuZ%-Rjc8(qRSe\pk^hF^rXPS_m+_#C:+G:S:c'Qc<*86\-]obgq^OT/'^c(H;qC'8!F;l"-1:MNjm78t!j?CiMB(ddXG4f*[@6/VLE+G#7SiWZGme$T(T,kKjF2YO+A,IL\I<+eR::jd=1'N-12>-OJO`tYUe#Kcjk'>9Dl6L47=1Q7gBXdfsR7(B_+eS5GG@a1m[1sP4fp+)q&%aSH[8J+F71]5K]BZBj6f"05#Jp]]fNPiiu3,@mF^o.mro?T_IAj^&0`;BQ9PZ]+U2#epqBd?Wl'p84MG17C:5+4nI>i$$uB^nGfFGP>>d)A'2D\/08g%VrE:QEg7ZcXTuc$!`-%bRASth'Xf?/(Vqi['KE?8ZT$.d0A8POt?0>9V2$)QLcdWln%k5E6A1`WEfmBI+=2:*[EB9qEJL!$1/[an#'>9GDoCK,4uRQaEX3d#-!TRR@]DfH'h("knWKLYZ::E6D)lO6SNu-(T-2;-Q`scc9$69L.h5_],[Pa+MdGf;gMmWKVtK>h:5DKSYF1.01SCFpf?&Wa;guXC(uRO^Bs7-@,\>C)O+>h3#AY8mLt>k6JoCWbg;&eMnmQ%0Di+sN=;#m_]?"]L2"eh!5(^3%qtV3R2qh>ne;iE4JMWE3ToeogOb!C@^k7rTr/sG]76ljjf8@1He`7!k`odroksafpK.-JnK`&NWCl90UUpA//ht:f[)Rh!3T5&L;XO1$;W5`/N@S!;+WuH7,68rU6prSU&eIAOY'*hW-un,KT=!=NZKn9(-WitBpe&\BhRWd_-`(_Q@KMNa."4pjNPkK=:AJ1n+uVE`jNsI=Z4G:46DC"#GPk%2e3uYX';+H-E(*K;tmC9s*=7DYLVC]3Wd?f^\ESD9O4=rT+YC#oX]5FZQM1?/'NWb"H&J;;G8O*P9\6@>op"S)2bSdI=(h#D0a0+#cad1F"ST5a2bY:`qiF1uGH\mp0a;#2K6*kB^BUQOeg1dtU(*F`a19dmuOCO56Uma/5]5k>cT..@:!^ZoKFAM%p$ts4uc8;(TShXl:B'D-,6K,&O+/W=$gQHYE]Z>F'Ua*mt^pL0)Ld?pD*@>:]i!tSI%L("DODu>9:`](>aT]C8`">RmUM?[]m[?a4:h"J5mjIlKFea#,UFRd`NJu(/bn]to'Q5?s(M.D*VjmYr'p.inSlLV2WEF/(HShAqk(Y'eGh^YDHbp.(Cp7Cr\QNNn3TPCqU2c\9C)#*htZZP:P]7piuYVb7Siomq.G3UW8?PT)npW1a'VNU0Tq6E-/;R`.>"lX&?gga]5@/UC;of:$5=;GA_GdFDI[X3D21bSiWAZ\O&>0Kb+?0dgA`V#="Y2jkg*\aSAm6+YM8D9"CUt08HU7]UFXP%p?g*M&Bf^1&?dGS7n5>,l@-=XGEs-TDBmh*[jM5-]4/!eGn&dm@,fcV>[T;EdPd5>hu++K?qSELmbJf.W:4.qK]@Y2ncFe\i^"/]#;c/(7!^\7DZ!"oj[6:aA?!'[a\O3\>T\7F*E-QWfp?p#_XKSYF1.01S[`"J>c&0`;BQ9PZ]+lY(blB"imb`OfC9##._cj,2ZOp$GqljX/PQHd[seiS2eGFdns>QLOiD6BE>QDJZ(>bLO"0H_Y-eQ+,6c^h@$m(!KJHk/Jel+H[SXJniKcgnn817ZYFM*kQ?UsLIQC6^r.;bl7@cC_P85%4!UU4/fYd0%pn_tD3ZX]D?Ad$VRuOM=j"OFRlX639IWYg]Ql;SO:WNq\B&s<>Wta`Ngar[[o^#8P-4E;>nplm?KLfffQ&4/c9;$dLO+sLLlPCO2g+sI4m!^]?L7KPoIS%:N+OhH"b.Vb75[eO>r;E?`R&6cDBY>np;#_b0.\(e%hKY"Tg,[\!;#3,08rB4NHiSYap$R7D[T!r=r*)^lK3.7=JDU7_!;0h0*q92FVXb",,;5N#W[i<"B5IB#fRWZe8SkM+ZPh%SQd&630R;:BEjb#RLdmlk0jr7)Y7QJ.No6M+U#=&J5VuT*0fY&J6b-&eHOu2gE9.]>\g/R(n0ur2Hj!Y#g67@g8shh\@)IaOE9IFAO$=1PnX"D8Oc.NC(AI+0#r:KTFVT\"QOE2&Z,Dd0?L)GNM;!^5qX5C<4P>FDl<(lm?KLfffQ&4/c9;$dLO+sLLlPCO2g+sI4m!^]>aJ,u@K@Hr\:26kO5Z'`sj@f8VV6T>5U#VDX=,sV)7??t/8WL45dY&pgLpJqW$])C8IPKttZ-J>hEbaCI_2f5YiE1A@-o=DV]eh1s]T<`PKpPjV!4jp6\;PgUq,hWsWaIFtk[sOTQj!rY?2m(@`)Ot9*UA`pcUXeAJbqC1RGZ6jQ+G>H1JC)On!?jj!/4g-R+X35N"G@/0mWbo;Z)7=qY9]-_oZDuL2OlmEhS.YsW.ul%Qs$fbfg^8XLj@[d/GYFeI59*=ZMZmkj#r.bXV<9%kf$ee+#6?hbo+ksj^-]NP:PQ:ja7F+Lm[YbV>:j\bt%Js(7Pkn@gpB+(I&'fe:>-r6IAZGaJOeg#!^]up#mfAR&eIAt`0-@8&0bS?8jEXo&J<3Y"G@3b#1<4*QS-DU7_-3WFJ%cm9ffKogi3bq9#?6prRt#m_[uQDaq>&.oMZr(0-Z&J5V-.fl=f90c$-W4Qg@33=OF^142ek^t=?"GEuj&eMY-,p7ksLa=JN+[j6]Q%0Di+sN=;#m_[u,%>L;+B2kX#RQjBb;s^m'"&m\CCizzz!5J[<6N/5QF>HNS#QOi)zzz^]Q#.o^R:Wd6k/iYJ&:Dkek2&qa[M!WW3#zzzzzzzzzzzzzzzzzzzzzzzzz!.^Q.rs.1oL#;~>endstream endobj -41 0 obj +42 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /Decode [ 0 1 ] /Filter [ /ASCII85Decode /FlateDecode ] /Height 101 /Length 682 /Subtype /Image /Type /XObject /Width 3083 @@ -347,22 +355,12 @@ endobj stream Gb"0Q0`_7S#_9/Y<@k+(4P1;9Z3pX4oZVLZ!!)N)$31&kOqdrsJ0ZWF!!#Sk!!!"^X8i5#,Zt-J!(aBs!!&*k"TSNFaU/"J5`ui^!.Z=F!!!!jendstream endobj -42 0 obj -<< -/Contents 133 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << -/FormXob.bb628729698bfa2787467d6784c61ce9 40 0 R ->> ->> /Rotate 0 /Trans << - ->> - /Type /Page ->> -endobj 43 0 obj << -/Contents 134 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/Contents 136 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.bb628729698bfa2787467d6784c61ce9 41 0 R +>> >> /Rotate 0 /Trans << >> @@ -371,31 +369,7 @@ endobj endobj 44 0 obj << -/A << -/S /URI /Type /Action /URI (https://undefect.com/moad-cheat-sheet/) ->> /Border [ 0 0 0 ] /Rect [ 505.5536 256.2236 538.0932 268.2236 ] /Subtype /Link /Type /Annot ->> -endobj -45 0 obj -<< -/A << -/S /URI /Type /Action /URI (https://undefect.com/moad-cheat-sheet/) ->> /Border [ 0 0 0 ] /Rect [ 57.02362 244.2236 115.9985 256.2236 ] /Subtype /Link /Type /Annot ->> -endobj -46 0 obj -<< -/Annots [ 44 0 R 45 0 R ] /Contents 135 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> /Rotate 0 - /Trans << - ->> /Type /Page ->> -endobj -47 0 obj -<< -/Contents 136 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 137 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -403,9 +377,33 @@ endobj /Type /Page >> endobj +45 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://undefect.com/moad-cheat-sheet/) +>> /Border [ 0 0 0 ] /Rect [ 505.5536 464.2236 538.0932 476.2236 ] /Subtype /Link /Type /Annot +>> +endobj +46 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://undefect.com/moad-cheat-sheet/) +>> /Border [ 0 0 0 ] /Rect [ 57.02362 452.2236 115.9985 464.2236 ] /Subtype /Link /Type /Annot +>> +endobj +47 0 obj +<< +/Annots [ 45 0 R 46 0 R ] /Contents 138 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 + /Trans << + +>> /Type /Page +>> +endobj 48 0 obj << -/Contents 137 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Contents 139 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -417,33 +415,19 @@ endobj << /A << /S /URI /Type /Action /URI (mailto:russell@unturf) ->> /Border [ 0 0 0 ] /Rect [ 134.8436 753.0236 202.0657 765.0236 ] /Subtype /Link /Type /Annot +>> /Border [ 0 0 0 ] /Rect [ 134.8436 216.6236 202.0657 228.6236 ] /Subtype /Link /Type /Annot >> endobj 50 0 obj << /A << /S /URI /Type /Action /URI (https://undefect.com/public/stress-on-our-shared-heart/) ->> /Border [ 0 0 0 ] /Rect [ 247.8136 753.0236 385.3838 765.0236 ] /Subtype /Link /Type /Annot +>> /Border [ 0 0 0 ] /Rect [ 247.8136 216.6236 385.3838 228.6236 ] /Subtype /Link /Type /Annot >> endobj 51 0 obj << -/A << -/S /URI /Type /Action /URI (https://undefect.com/public/stress-on-our-shared-heart/) ->> /Border [ 0 0 0 ] /Rect [ 293.562 201.0236 417.502 213.0236 ] /Subtype /Link /Type /Annot ->> -endobj -52 0 obj -<< -/A << -/S /URI /Type /Action /URI (mailto:russell@unturf) ->> /Border [ 0 0 0 ] /Rect [ 423.062 201.0236 487.672 213.0236 ] /Subtype /Link /Type /Annot ->> -endobj -53 0 obj -<< -/Annots [ 49 0 R 50 0 R 51 0 R 52 0 R ] /Contents 138 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << +/Annots [ 49 0 R 50 0 R ] /Contents 140 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -451,15 +435,39 @@ endobj >> /Type /Page >> endobj +52 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://undefect.com/public/stress-on-our-shared-heart/) +>> /Border [ 0 0 0 ] /Rect [ 293.562 363.0236 417.502 375.0236 ] /Subtype /Link /Type /Annot +>> +endobj +53 0 obj +<< +/A << +/S /URI /Type /Action /URI (mailto:russell@unturf) +>> /Border [ 0 0 0 ] /Rect [ 423.062 363.0236 487.672 375.0236 ] /Subtype /Link /Type /Annot +>> +endobj 54 0 obj << -/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 523 /Length 58769 /SMask 55 0 R +/Annots [ 52 0 R 53 0 R ] /Contents 141 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 + /Trans << + +>> /Type /Page +>> +endobj +55 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 523 /Length 58769 /SMask 56 0 R /Subtype /Image /Type /XObject /Width 535 >> stream Gb"-6G?bhRd.iTHHKKV;S9*7;?q-4+'=2>sQuc%9W4VOEt5+"MMd4I@K6]a#T+0$[iX^XpGYnBb\U(!cg3:0pQ,3AlqHU,Y3N0mqXMIRQ%XgD\@B&qcqo4As7>F"n(kU"eZ)VJVG-7+Y@$VHXm=Q?>IJA$]Qs*\aH.Qjo&Os2nAfY8dcJQ4UN#2/jiWjh?+]f;J,Rok6O.7:kHSO;cCI%@h7@_M*Zc\(S@F%HH=1.=X&lK6@q4QZj"4PT!s8W-"*K"fo]c2Ck8,dXgot5)^juTga]Q&l@?W$4/A#5MP9NGQp?gVH]"6b3HhYF5&!h*%!s8XX?O3$ADr8:BCtZ,J[;/um2;gj1CtW&u>cqGK%Vh6)>M$YU'>Aqo)B0V7*Zc@:']eH?GPUgk'.6P"H[C*aGdtAtDr/-Pe##k/?T0pQSND%AH$LDjEoc#dF7<'%qtiU+q@m7pM2;6b*ood`=2hs%q>C'[c'pY)cCC:M:EE/)q:a8i5m-nfi,c5HP8b@cnEnu>[r:0\\T>g?drX6MBhhDu>(!X[$Pmi+FRKQ.?5JFi'VX)6V"eZ;o;q]N7pRPejbdMdLrQL4kX"!t[2rsie\ace)":7PFtFD8pI2(;J$CtlDc\om=(joirJdVWK%0qLLQZ=(M#e>ZBQ&#u^6ZT:'*$lqBNfs519p[5_6iPOE_GCtO#6#LuBmbNX/+$`+e84W_$q>3t+`=W"M5J^#'c[_Mf$IQnT+62A?U8+J.,9oQB6D19MDM-AcqXeJ5^"0Ao5CND#^4#l:CtLFCY$C>T#9_:cn)%?L0+877H2[U4JHH/VrV'YOK3ULLGON7qs8LBl:upq#8;,IiG4p4`"ac[qm-Da>"MP>98k0,RR\-sq6oB4Gd/mXnl9,?g]e:R>Zfb6P:O<-"0M?]T%\T-fXSU'hhj4i$Q!^-TL#JNSV@Oj12514))GmKRl>9%Jd!8X_LLaoSNCoT9G\M3OX!BildlYhS0gt!<2rnHB?m"uRECe*c'gMo+Bl?^%9U/^k>(3cSQ5?3ZY%I*m+Ck#l-lhC^KS5Dgk^cB!0%qt7bA!E:7\\4OUZaS*^+i![;/iD+)1<,aZFV.!!:KcM\i!KHPRD6a*tDirVLg6j<:M,YcrY.J90o!\[f8e9%:M!F%3PC(,)%N\?qNPDL`_@B@!0.))Dp!El!>2=0,L)KA!]_%18b>5d>([]!^3LWDf]iE,`%XbA33(J[r@3j2Q`oC"94`=05Y;WI%EtM2ZA^eZ)&?C_J6rVHgZP-*0r>(Z%ClDr/-p4aT(q\&(8%0j7]'7oujl].eLCQR$O%1NJ@K&e-s1M2TLYHJZN6I8u3USE6bI$QEm?FOfX_Dqk":n[rl6rmD7K9n5u%NIHiU_Cq9.HB[WBpe)^q"Z(<]m@(aV+Sl^G5hDb9:+-NM#`b&S2kZ7I\bGi9mcNrOYmuY&G#5C[hg](m,#FfA]pB-CPeV=EH`H]#c[YWQQ)2Ys"+3fshU\l;n*f_K`NA`9[r,3K>Zmcbg9bQ-)&^OZ?\;^C1M=u]J"aQ&pV(_3Nih1VLBRi^^nj\jOr3.ZXB>#ZfsA+nA_SLV,_X,4W-\.%+A:JKXh$/m^4)7.d+HsDD-,!C5Kp?dYJ,L#k>Za97e-Vs@`'$)+')Dl-a]_U-\>N,Tb$t\>0H[#8Si>+"KR'!%;:J6t(!s]l1H8I`HS:--I'YM,m's]>jXOtFG%iKFCpncWWICm@Pg:MQI;R1t?"-ued.*Z(;?F"*5P$C\_MN8iD/m,?nm*n(Anmmg_oI1EshE?5Z`61ukI!I-?YHKVFkJF>`pmq6P)d:RNuW3#OP,95nih`JPDl7M3_u^V]Pm&.fE"Vb\DrY8Fu;_hj$^,UOjaG^,UH7AiqR*ZZ9':Q]*rA#E(mC:6YuL("qhNZEkp>^gHU&YN'.PNUk42M>[:VY6-5'NUYiY*CICPn9.hoRqtp8+V\DBJ]Y2!WUe%3KM&ed-=JOZ$*C<+\c(5EPDVb0.M\l5Sa6]dV/TUOLT(Jr#h=2%j%fU[Alia.],VH]Y%?=Y"W;6,-2IcJ.p'H0nH'E]9q+&kX&kA[?!%OnFj^Y)!ORA^m\s*\\o[%pG.At&J5V(IX[s&bCppf5%0qc2k=):4+jA%0)'DJar.o5ESeH[06u;=%-,1Z&$fIrCI?_`q"!OigpqJT?;I%K/^3;5IWG>ZmJd(]PJ";@h)^_mr9qE#Z=hKY;(?-(9q'#Qd0:k$\8\-\iPH:,)//4@Y3K&k?>XjYoA.$&,kngNSBdZeC[)B87('=3bKApqmbBhiZF2cr?b`c!=YO=<062Zk72PXC;@FEu"PL20p?\3ajtf?Pc3r`*QA^`VS9dY>R$$)X]i-\1jqhODr+18;t)fj-.nq\$bci=[`.RaYJnN633[StE_7)_(8ep(d"IuRH^[sH5(*-U*(C=cX&mWncVJE<`5KT=H@!HV,?Z(N,8(%(8oEFo5n`f^%*W"u4d9;0aG^$_InB>>N!.LZkPYP_VeFJPauq_6rd7$k3$_,^OsNcZCP@VmXG&m!E&I+8X]oOIe.Y0F%fp:cEokG8-C?5\-:2,oM.(Q8lb\>`*4&Re,0GVfV+Z%#gpqn4qLo:n:6mH!g#o\ScOO+YI&+rP0*a3QVVg=i?r]Bp*^"[DU-o;225jnj?m&r0_*A/q.>pC(i*PF%RlIC1!\(ijG*fZ>63QkFb@dXfmO%o7Uc$b9\[!m`Nf_Be5iW5\@B&qF]Lgq!_aDNao6&+^G&S82"Em2r57,')^[BN`WF;P2fHX&_WLoi%[n*]jjgD5NugHqH1Ro;9Z4uloCAjjl0R-3MgHl,OH:%#%`Ahpi#?>!jR`!U]4)snb$OZP6g9MC[l]+&M8Q^=&ECD$?In:1dRNZL>5q;R\l>Nfh"2'aP>EbsC45q^j>Vb^5=CI4]:GkE(u4onmZ'"q(/#po#4u0V>D7"$qrfFEGIMR5&3+.W7`uM;eGP4*9\ZXLnc@"K8Gq%Y3D(??$s=Wt6COZD;=8I/*3)If9*MD6(WT]Pugr%7\26_;!_6Ha0[[O^aRJCXf96Ea_/'M`/EB$FMeC=P4Zg;&625C^E$fmjWkZV*#smbEptH-Md8/1FdZ0UrjF'Js^_R-qUYR?oR6C,6"l+!=C"0=KC4h]o`GO>mW)s1mGX-Si;Nuj^PKpgWMh4<.UF^ST"Q_\"Ca2Q#OKn[>moB".3ad_5#GOO*lhC)6q"CpC*/>ZeB@nbYbH2d`P6@6R7eL9i8XA/W)?UV54c&@I`'M*P;03,$:V9AN^K&"/D=0E[3A5->lB$;)rG=(&rGAf'F%miu_J]Po'3Nr>/VG6)JF__#4O?uV.gUE5F7UNoZNK0#/%M"6^!i.9.(l0_.pO2i+JQLf[&YP1sc^l`AT";lr2F,?O1T.`-G4+/-Qlpd/p$:3oF660EE'4$no4PVERM#8GNhDLX)ho]:9UWboqA/8Q_hSS9W7LtWM#Er0I>Wi:#RC]d+hDsjk(sa![VXX&@)7FuFKmS>"Yg%c3]oP&eu`0Rp[;IpABBoV6iQoET8F@6k0BMZD;)@KnSkL-WNp*Y#,6I>7ZD`floBLjFE_s'$PtDu"U0HdDRKJscCR0Lf9dU#*gSG7Y7#fGc/7F9dY4tZ,^3VK0cP^qKXeNOPGpbJbREk&>8CcjKHeE=p[6kFkXl1I>NaF&+KE7eFR%@)OO"Z%2:YU#8p3cVk6CII(PBnDT"iQS"[j+&P!&!VMj)PjQ_b2mqj;$=$kBWLF'UWN`T\QrHS8)C;;:C;I[brp/_/#&B*6:(e0P&jW*14*I]G_.Lu_WD@dJ'L9mL";i_HoE;O>_0]0uD!\cXn"QSPiP4m^n/(j]YCk#IrVC6uD.^kNTi%RS,=ddL\8gQne#+9MGjsk?)n";'TVcbqLlL,(77Kbh[937qjXF_M(aN7jB%[/8-gI$`+c'pX&7&,nk99P7@N#=E0DVTL7q!k"RgqS?2:-FBk%I'hgf[qTSYTQUXe#,th3BMt6=`.Tik3e9q#A)2N=gBZfC=OMMZ\+q,j\tQ:3QK1\qtTrF*^*]%P&nRX_#Y>#!s]=k\T8#,46St%q$m=4')=eZI.lopYHP.=[l8][X]r88Fnf(35_4\$+)9+:T*Jh`OZpK_.M7Ip'k,MF^rqbq6IRF*aE-?CgHM"-c"(mb_A,RRUC5+AX^+@CX:S'\jcj@8bE_DraFX1a2Df8G73WnLpNV]JmkK_je!9sjDMR(E(30*Bp_3$Pj<-#D,hR'6UH_\[#ei"ttR7T0.C>*==f=bSZN&_4$i>9,>V`TN0Z+7jeKM)C/Jb)Du8+4(#j#rHQ0+aTdQ9[r:/91b$bB4aZ)#IGN`8Tt=[HI][E0.G1YSLPJ72*Zc@I7uf-+\hpUVd>72E\$Pkf1=1Rk2f:&9@-u[Up[$Q8UQ/(XJ3aR3/-sI^Oc_pq6(n)p4Eti4g9iV%rr)TKE]Y,LOWm4$:jKS;:'gjYW`H7EZ$:p;Ts+mIq1.#:VN`;J4@kdN7#;Q+:>K?5jOaiLb*FX&V:JL@;/=aaTe"$!^\u`e?bcR:pBLp.F.$<"OFp?ed\TTXkKX7%Kl;lH1O/Cs5H?Oe<"il$ZU"q51sXrX<-khV[;=PD[pJfLHaHhZqkE8U_D;`f0h=M/luT0@Z/cV;>7D;%qp.a#ise#,3,ZZYTbK_`J70:.J1^-Que(HEdiqXi:V#&+=Q$,mMMpl^2ZJR,m2cqDHb/Lqf)-BgD]m=hlj@T-:jUU*'U/%7?YdQ`Cps@_iAdo#+ET2Xpdln-n_o!Z%?P#nrK_P.I-3;Zril-h>-;BZXmD6o31#nrpLKFa7'T[1ga^)W5dNP#Fc'gMlo93--`r`5p3a%/Mp$Ao!b?ql)9s(/DWDf_Ta,fPjX/nQQ6:+dVfS'\LQ7cIsW`?+,C")WfbVEbPo^:NS6r;jk[a%`bTGI;lcC[&W<4jeC)8HhS!q/,1@r$NPJ^olOV#GcN=P6R0o\m]Q./8#k09AY4[%ci"&0lE0[Of)a(0DM?srq$77G$\g9P9_m64)Tfs51)hnK&H'e?Fl\H3tRVD]8FH@:0g@%<]i*2(f6tsNRXq+PCIeeEoj<(ZY"t&*Cc)2%I10QLW>f=BDh]*JqJ\!foI4>>3_<.O,q%tkn<")(^CBi'GR?$nV.JlOuEsZW\f,qJ#@J@A?:K0!B%\1?:r%B5!+rU:KCI4&;LNKhaWSDJbj9jk6A[866+=tT0L)?s'E2k%`H<(`5T]DqXb*VB:/=-`N0,5%N;f9X="MAk,P4R\S7QP[gSqAHNNu-!;('R^rV&"d?/90_e_Q?;6UF]Qs*N:4EZ\%'0]$Jp_ups8Mn6Khn:&r!c=ES>NIhLYBEU8`*m_C=TWbingG#&%l;($5I"a`HU\$_7e)fZt\!DYSd-&h(rif!P83CIJ]1^bA.1^",)btOQ"*4.nh9e;,JV'/76,]mlWL@c5a67fsGH,T$H-%F4I`,2rmZ*?bLbSSYhI/:PB,jppN'^M48;-c"G:iV48%Z9'=KjZhQS!?soWbDr/-(E$\,NP!BAeB/1Bl:#3C'_pc/:jU,"gYS%`g-Wr*&Q31S]H'C,TiX!YCS`&F6jit06=gQPe@5KYlY['R_6X^%YS.c)8(gtoFTTbQQhq>)LhnEiD.*EVr=QJauUjJ:3'.-O$Fn=`iEiUQKm-X2$*'$?kMn"9:Ic[@8*&q>>*sMqa/97ZLC!reS2Vdlnn^1`^qk)fNWb*Nu>N*hr2eR"FF\%8\aIYQ,g7sa6[r1a//V?m4Gk#(OFqH@4hnFM;p:._RiBfRA`!-DM8I:ah7Z80-3D1>UHs#egR-NkZS#=4nQR,9?gB'@^A&"YF_0GcI--;ELP@e]Fm9Z)P@Vq,Q$aSa\97*Qqil?lfJ/Q%!WrPpG<9p15h,j&i'EB$VG'SET9d0U`)$U!OR&moV+[kH\SPY]?m$T&Z]QJ&NjuSYnjJ(^KA!0@,tjO8Agb-gp"t9!;)NkA,_Ib&0MdfF-uSCR,Y"of&NMfI?+Y8;Hm]gL(f2H&``fBA.Iu3o>jf&<<(<5qBE@AHVak&hP9pb5O?eYZM&A*]6o+&_\MIN+&J5WAXX$BdOh.'0s!^mDcrJ-%^qdb(K*MqVl,D&tOjM;Ma,_=qVo0cJMNAWVdT4rTh4:tTUcEDP!1jS+jV!nS58+niA0B2:3[edpXEYr4Q7\l4Mh-G1!J7*Jm>)?!8D`IinlM)i4`oma49^V896,QsK;ZJ3q/Ya'4Zkj:[$!]!RPi3nQ4,fa(h+@")"9uBaiTi#>=dW41,4Br9O:mo?\f[Br(>91/C)S^Nuu]EPm"[BmnT8=U.("0f*rb=^q`2C:7aS):H5SgR!hi[nl@>WD,re_4n1qM3+i*bodcX)TgOT;d]?Z^/pe8"Qp,pZ8Z%Ygdu8>Z!s8YmOM!ee2?ZVMqXrMh7^Z8mhnOXo>duJNaOI1f)/B2dm,#Dp8N'A94H+/og"T$@eu`0$jp8YT^Y#AU(RA5AY`k01&/uPr,1F5PpF]^\i9fq!k2s*eeZ&c\(qi9c2"=m3;gW7^JNB@4mHS05an`l3qc_E,bjb/'#r+45&@YN3`CILCP>dkNC*Za'K,U8RTYH^OAh<&6]BIK$=g9bSYWa)Gs*@.Ug[r0S>,mHSG@RMB^0HLM*5_0!lYO`]`R!SGjR5/=Z$WEil&L[sZ1C?eFk09B(_hKUAUh%T1M\[o8p%=#1K<@9)Z,FW#JYE/S14B"@aZrK),=[W:rqneNqBg'P`K4\r$uXA0I25(".H+#E4*Bha2N^k37NmUn\o`e34=8@F4j0[5"9oAXXDD5)k2qE212"lP`[VgmJ9dXFpb,RC9V>O=9#tZoW/Aon5Ms,!'1?iWZ*]#\IOeYqTS418?E?uig9k]<5(#=J2HGakiSt7P$JN"0A#2e_'[#q>hgbP#qeK&ZUrp8kl]=#h4JIgoN!,-'Due)O`ufeu]osX1UIL6)e5TR5iZ>m5VbYJb0nL%_fH=XHmFnD,S`DAOKoI_fEaZW;]6CH!#?@p3H2$a_(3cbhKD*-6#GXeM2ERX@KV(JYhQismF8GNCL!kRY&0;mq>@HH*3dUF3_hJW^b#>35*U:FZ^DcV;++DV$[D.0XN)g=IN@"C6bZYdHHCIO$@p\,V3fT6`Y\7qA.t_M26t$euY9E#sgLqs8K^.aqc!<]kPrmABC!+QE>H(k/"mMQ7A@5J`#]REo`&;PH_R,\@@cjI=($\A)!<3rVQ?4oh1Q"e(n=HDG29_SX0)f<-].QooZbgqS>Gcb^5+(`3P4LLcgd]Y#e$3i`IGWMCN\p>X&L$H&,?[F66hlpqJ:?AN$m7UDmK@/f`Y99+HQ8:6m4i1BkGK4c)"ppl##ks$7\QS.+UbEjed5^GVBqW-r,W\E_&I8b(fh`s*)@`8[)fC**uX&5Vr??/kB6:4*l>rq9TR;'!>c)U\(W"KGIPn4QM_I='"TgX_MAm^,JMI]?BkCf1Y)NZ[``b3VhO_7t5H?CJ:8P&)CZZ_q>0r&OXY/J@q+)p@4WRK/-6N1cC?n>?!rpS/gj8sI/.f&6\30bp(dM@="Qdp%OEbOmP!1.*"Y5;'WCrj3JqfuFC_JS$1]SNKaJP]hDLhE;#h%XGAN_TpUY?G5:6/CD8@-mE!M%N?B8Xum4!DUm!,@cHbMJD[N_iLE-kag`eN9Q+[iG=JCjk/C=Pr8@2RWfG!10D:mIRgr2q,!K_HI+c"lRlV:=W,AU4(?Tk#g,*rRU*EJ*I$G=rNI'eW?V5(%ABC"rji`uA.7Zis8daiKa,V1>'n7`%nrs8f91tVp]"l"t/)*r!rql.rVFu!/[F9X\M56g&9a,_raV)#g5'FrgR`LdHS([/t,@EMBR0I\VH[ADos1s'*MA5o`h.b[ftDb,\T?q[H$S5WFXnX[K%Ejd<)ci!>.#XIV7t]EgWu?k[;$GC@LI_+o^(6e.&X,Hl\#QX3d:#Yi8@Ga[K-m@ROAbG?=E_ki>P=PNrb?gKb]tHR=PtdWggJYCl;<4"<,h2(/S6m2:YLpX\*tSt`.m?XE]LGQ*FQm1Efs,$W:f%]rW'6#K`fDY?k7Ys$]_FL^%n2+aZ&6]6E^A'Ft^E/#i!04*M0[N85uP_1MuOV3S(2Xm''t&JeG$Jn6LK:N\?,(iZi]KXq!X(C'm->!5L-R*#G3p4(i>i2QRl>7\Pq&%WX_$\^ljTL?7DU7;0OY$GIf&j+PK$TIFq,KO+Dr&WRCQqSRZ)YeI8#Tq,ACqK`%5;WV>`j)`gE3H"UiK7K"Jah0k1E7iI;G?Y?m3t[Y'27hb+;!F'cCtjfcGui\_cZJ6CLYgKX(;V/Vs0FmE(^(R=shR]'2b''Ot$mN4afkh39iY6IiNJ,]AdNZI.8gWu?J%nRb,F^lHfJN6I1]b5gLrKK<8Q7UN3*'AJM3%9&qGPi=TX2WESZAL#dDF968)N$'9jNK%5YIQakh^m@ut:8t6$W)3^*'Tc#Rn%\mg%,A'ub8,te/R#MPd[E3L/oKjtS_:;[A#hO7]6bEa`*IF7$4iT+F@/4IgP2,tYgJ0Z@`%FabF3qNV6*3m(P97mEX`.g;m:H_h4ZY'g/#[+]Y-'Dl\NZF,N&Q%#sD1[PL=)`a`aGCQXW/LEDm9:hnj8n'7!\[^KcCI%U'fQ0Q)4j"tB#nK5l0m-U!3$TLiTACSF6WF\O:Z&;B3tP>"/(d=+-_:4%Utf1;LeZ<(FTkLm+Le%"c='I.U9E9I)h0`_^/#H;PZk"G\n#D7heX[IM%[dIs`mT2bm0W@j!QQ28g@Og[T;9V*"8D537SbSD-NK%N9WMWCZ1):B\i,a$`2>r3?bYkr+8\scHZPfes:p41g,ion"Ag#D:+k;g>P[fUe/^!&p#4r^l(P42u.QIWUnj#aD:7[+L*L\0@$As$n$&Xb'^4603hRn-uEp!q?:P1rc"sHPeS%9n_O@WB-G7d]d=hrE^3T=ie'kX,[;'I6KuGZ!0i@M-W'p\(O!8ljI)TsVZpBjQNq&Hh60:#BN0ZUt'4XE4,g]uro]](7iHK!=1(s3So4MCH'!CEW%NZ'$TaJm:_k]2G%LilTP'\9Sd'$e@ndT,$.g9sHE>or?NaJPXVK1e@+B_!#aMl][+'2NF[WIgq`G;I0lB\0DXW=f..pKuu_G%4VEK0L>\DDuFBJKQ6;H\2M3kaUN1jp7sfA!QT4RR#lCfGQl"jTu;&PAJbc04%JN#.(A\?N&fLS%a2Q#o9q)niL[a/3&d*GYg^)!)+I4hW:AOJB=Y-qB\;I0I-cdI%.U??]4MDOfP4%Rro6Pb1HS394HGJkm\bAkYY63tPe#10B($!iN<_hJ^FU8/+JB66IBiE%<9EFHfR6Gf\=LrV=#[_[mE/9C/$47-WVd`;m2Ce-q=0M*]I_d7(ABu,0N9+;]P;@OWB^4S#7Z#a">nd2IWe^B-u)oa!61QhnGYpfL_-"T0SqBZ_-U(mY-+q?]%'i[>e)V`L'qKh_.u1W.or`*,mXn-n`.[3&)XQt^CEmXI`,VC3d:"nC3/=i]mE9W2/:Y9eLn0Q-e*Bo1)La^]6+HC4[&%eLWfa&[VQQTSh+#"n_Y&_NY"P@/;OkZG`fIQh*N0XgR1Xe,U=WX&qYZ/@PofIN\3^8Lu-/mFi:n;NpT8%cWT/(Bh**6;R/jhRk!l=ap)2RA6OP>^"E`)Rc@EK4,4=g-6I'naWn"\NG`\5Lpr<(!dr1F=&oKY=XIUM,P^NBn$'#U^-M%T)+g)CQ!@`92f:0q'#-bBJ:$,WB$['N2BCR?`NMki]QlN+^'f12H-'VVD;$iEH-j]<[;'9]W:4N=GCB,I;6CADKW870\:5%_fL@beNugGX'c5cH&-G6)H`&]6cp4]^*Fe,Gp[dSjpC'W!pJ7DFjiER:]kSlfV`$NUPD^51VCm%T"SZnK-RIY""!-+,F_d!XC?oETRT7d90+.d]!HQj63cmp`Q1O1bRk8C?e>^@'_r2!_g&Og^gdiidIf9,NABC"UlbC_o[FgMK8`9t-)d2"EXTQXUIM8,r'Eb<1M+_IYsX]Z^]4:[A7VKHMlg0j.QTVZU;($KHmtDQ>[AL:IRN0W8Fl]SF1I*a(85p=g4Vu`Y@#%6hM'?JBIRT[*'AIB>]Ie3&$IW3VUQ6jj)"r+brHOX'61[Y!Tb?F=Lr7c>p3G6'uq5mjmQod>7gr.LuNp`SqUYp3QGg(qE:^>`sf2]46[n)p^H9rnjKp'gW$99P<=FE,!S:ViLeWWNXX=U`KIR3V2qJ(+I(5PnV3cuomQ/KfM/(A_)'uY(L^k'WG+m1MOc;U&iC%1riB1Z/MqtKP,:Lr%X=^8Q,Q\EUWV1aMTI/3=V.5+r9OQ>4*(G7*MY>V2h:r9bakA&WP.S5gN%>cM8mLc9fPq#?bS8N_%]XY6SF)k)R&52o$29cb!:-^j_l@bO(h7\0%U%[9s@OR#Fma@qipu1r6gU!-teq($(=gM^b)lecHL5-!h:dq-KNHfRoIX[D7AP0g`I=-DV$9;\?PjdMEQRuEBbEbs0XI(7[+1Sl&o]aiXRb<"<03VUZ"of3+W'OGEaH;,#%KtHMK*<8%AAG@2F1GERM'unc/:;1CL6#bD9MQeiA]FIFG>eBq0kF^`]-V^&J=D$DU]-0DV[A=ZJda'rqPLanNR=S-BsXOTViQZPE'\Fb))bOjh'C3O??0i%OJk&Jt.r@:r@K8_k[75=gLRt$4=)Tn`.[ObV1Thb*=L%HMAIouIS?#2Sg8sD.;D7="CVX/.58?Pi>rQ48WtL\oZ*"7YNg7t=sZN9f_tiA1qIo"Y"Q[2i:Q9_B'Y.hf$Rc?ZZod)EpJ$p@1M;ToV_^g-f<:fWBfBn_`#`Sl$Wu0H<9bJg$-hak)No(ESK-h-RkCl8KP.7NA(NO]=FFgi-oMD0tJ,%WN/I*k?RN'JpYYJ#26J#B=;-VHcDiq$j&F$6fp=nE#Y\Lb:MTND\;as,/BKr>H"SRi8NXGUfjs37I^Hn-;^D.>,g=WNgs,4b[-o;l*$Z;aubbEjmAA.alDWpW:-1n?^P`Z(gmgU;dD(05+4P@WU#-K*314C[Z#=I.W0-jVCA7D0KqspG@`=3J/$'`;p"$[%OYl"a8%Ls:!oijOXhUU)U*L*d&e]6YlrdWJL(^g^4p_N%Lg+m]%F!o*-TjLr>U-L`:U=7sKJ[W(S9i-5&_3!QFtV?KYfn92K'\:>4iHMcM\[nsbA?:]R7tADqj&pi%NRV"m1BFT*6fB*ORu[D8'(i0qtho@8?k-KRPZa'2>m/rNugH_)p1c^*/=U=u5tS2+^KH(&3As3;;n!?i6rk(ucfkS1tbhTnRJ46jJtTF]0DX]OJj;/4nfl\EnYK6b.='P$ZC#cgBJrbuV&MY?o:S2BD()d@s(h]&<1mLPH,T(02CR"(+G-Q_#`0e^gj,3EFDCWDf^VN5geo,CUb0RP`N*[W:GfWHR[_7@4,^S6C#l!:?^>SuBceZ)X>lu9^)'P4_%jGlXMUB%MXfJ-3VX/dc.hFI!j:e,F/*$$'i!e:"7@FCrCH8Q3Hb!*KBn1/4]lV]BWk02hB8?SZQ!=d!rGe:r2(D.o,KrWW*ioB(0f^VQH(`8(lLqBfaH4amUJ,YCOG7j&o\MIY$n)(mH]U!6("iH*+k;rYT0;^os51E0_V(GcO*;mK6+'VC<<8YH?c^m9]Hc)^OO[?0#/\Ha-J1%q5WZ8m+)S$E7Rl>7TT&acsBj"hj`UKJ/h6@,M&RH0sPGjutfPEmk/St^Xp]9%2#DsE2Z8a_'7+XA<9dDFOuF"*(&@kcU==;rC68i?rH/5ZGK]o8J7iB@Zh#8[_5mc;/0/g*>AhGt+S9Rt?'<`[.e"1E%!P.(0<"6(.r3G^3=ONKIug;#D8-m=&mE9brPidW"/E.GCj5G3q.@+:H.:iLi54!=4fo:mqH[BXi<;TT+L%LsgZ!==?oTFY42F,Q!96r#=(NZ:X)Gq4.A$SiQpJAcuB$2X;YA%'O)L]mJmfK)<"2Jh"g0"eKP1US=;0k84"h`QL9*_C5Eo&\k\P5Fd5K3+QfKmao-:6C=bMesd,h7Hao26L<$:7/n`.p'6f^O]S@6VGUBoB&be8E^6e)LV>LJ`K8TYmJ&NJ)@M@LV@WC%8TbqZaE8=''pH%_,IbdO>Zk&,?X=0uij[foX&>dOpb,h.EP$;TN[^hQaaf`MZNPcb[M\=F0cP0:GDD>)6O#mG5Sb_O[VXrd/+6l`ig;#b(0.KGDr3au'#&_e%S?9=TgRghNZC3I0ae"E82N=P`*AajPiib>-s)>"g`[W%Htm"0Ai^*UL5OcGOJjKAE;q"T7m`NOH:%D@floDcuO[7&"oM`gt.45Kdf6F>?:OqqL8;5$&OITF(EFXam=n8)n4RTRo\>68`=*8kcn3l>[]92DQ87Y^KnEm@F%@B(+dD[/g5Z?p,2.@&iX.&l*L'0cqqi]kh!![@1"^dn45\H/;tH&`lH+iiM6RA'(PRm;PiA0*0c8;M\ED.FmG@1A%3ESJHH.kIJY@:B>irrhnQqZL;Ma_;j\lp$t;ifm-H;!(oWXS'3Z#>bhGZRA1,!]G(\e(nr<#VQ%nPP"2#&Y8(&MDffCimI/M,_XBbmeD5)+q\6fs>=PfnR?k+7:c,pi?6'BlRi5k,INjf>mer5/`@/5V;N25[R-Vp=idii_X_9RfH+68.]0!K3GZ3@+"\RB+9R!#G5h28j#HLtk[qLerA<*[AF/G/^U^\u1#<[>6q$+TqpBoCMp(+r!_fU"6uT"=bmRl86H4F6biNBCfoL;&K%@=m;1%";d-5SXA+%O>DbEH#?@@otZiJ=$[d5meiiQA._4\T.iV8.aTCKn&skBlJ#Fr:eU67m^/e:i5pngUD@ng'JE>^cI9AHEp]o*$!2ZGIVYQ#4`PQD)gp5mLU1TrVH3H?Wf^rRlGZ^+F?,BooN_Sl\F8$Lr@6M+:dT!!%CR2/3\Q\:7[h"G)sqmR57@=RcI3Gn3&o:EeY&EqWcT]p3uAZXd_:Q,RUG5"9o(-8Ws@Xi/&*pW"XjQki9^Ec_!GRY@a+SenG.XWhs3A!Y<)0-f`Im&ru9eD7fbpUDK/CH#9"a[Qa-9$$@"R%>G;I,;M]OTuFr5SbtY]Zi$b;3gPq(=f?b`^I\)+iI)\sQu2`Yk`!/d[gNkg/ErJ+I%o&Ro?-UqFS-p$kafe_a$`5]eD99r9Lb4tMe3OTY13HF0l(JI_pANUD=R,(]hY+Z8Nm?.kM'5B!9X+(rok/cNql;59L^jQA6>hoZ9?/R"Am01i3PM^.BlVGNsQjMhTkHM#RYD7S,k8J?Uber4-1*A3rIE9>E7LZe@*nRF0AqB9u2/Z).*.cU%9;#9%]H#r5u-(%[DhdSVH3L[VcEqAEfj=M,T"EpHWo&e1I/ruNB-GFiQ%`PY<;TOqC"8iaf/7D>(-oB+&ib,[N[0K"uZ(0A)$>Mcll/9QU'-J9B,11c>RVNS)t8OPKa[kVpZF[:u,ol(,68G+dAC+aBWhY)2E#D4X?'a#=9h<8O'ens__$$qi/K@?S55gWj9?d7oef'G_!+Em+)3W7pY$F,4+/-ci8#8hCo^Qm\btbQTaTr95n&[4i^ANacO:d@3]VeMqd\qaEcC[e-$pTX?QlP=PZa?fgbFc_Xqni-M6jY+!4^"s'*fB83rceTM_rr_YB4^ot"J]m<[YCE,H]ODjM3JOND/$n"iB`*WPec%<5.n_=&_*b/-s1]6>(k]j86nW_s%h&3:3K;D(/=j=i[Ia_be'\@>?n)(e-?6#s@UGAO"EKD1flCP!OAOXh0Z&Gq0ik!]h?"N!`s0&)0-M%L<'amC:`G3sV;aq`%k*DoHiqDL'$9M>jmcHDP-CRX:gA&h]k\X4'[;NR82j7`*3gUGeoL+L&Y=05X`_QDirV+R_eHcq^,3L1XLp^f'7#iJd\fNSm9mG#*g,N]6\AC$j<0OHId0?Fpjc_&Nc,I>1-0k/',\LN]Q_AG4L*1',."7qo)`ESH-2_qc27787V2HH)X$$qA@UHmc6p$:TBVG<\^BDI\LN?()]lPuVpFmIVT)smnkEo\@R3$s<;7(@=$%`_1YhnC,WK%t1'_C'jF%Y+qk(*e\9qsV:s?ZAkuF>r4@#RLgj]QnRP$5M(!J;GUIRZM/0-cV2c2+frsCW`>6[VXV`P/t+Nhg5"_8_m"%J7>[Db7X\=Jj9WUYs5E(T_i*/Gd18L<2^@bgYOf'f&6#BS2leV$'aLn<1#Vc;fH_rTr@jH(GFDK%tIQ.UqCm<>19[b-W8=%\E&PZ*?@l%#^5M#ddb41JYl/2Ed%Q_ji\GObS1C[(fLhgC>??;$h+1[a4Re?@#2rCn6"ki\h^MZ?+FuE/h.`jVl-H^(4M[6`/p5l\./J36\kuRMM_J;,Zh-RaA:j9NRP_(?.,:IDU*t*.i!0ecCLHcLfl@#GD-A=.%Gr8qiE-qHp>L5",-aZ":<_SQ3@X3W%Bn;^6s]q2N8V4$@.1!21bSpk>O=Vn`.[?Ad;6G@Wa#0n`%NHqDe-9Ue-aab+(J5jsNrrOa_J-DdLf-82a[Wq?#f!Qkqt@;%N/?W;P@(nCM5!%3`JPB\<7SQf_1Gi,8SjWsEofpT2+#sh@GF#%N/X"50lcR40bAdZGgP(VX6JInD%KG3jJEj@R]r`O[a:L!Q>R"4\%S;'Q8l6cg>:h7JFFk26WjkokMU%dPA19Lq\[ndGdme2\^l$#p6ge]lA+l-lPF[kH=7>GmR!Pq#d!h^&-r@"c>dOY^WFK`j]k+ggH`MXWC>>.&+1%L8P.,BqU,!O7'/Fs*2*=Kk']d[$'u4[TE.Uo?,:_;.(R#=.,T^]h,]VhZ?qtBF%-K=%E67A4P^0J6kBeE+GkJ=sfJC^T:G-1#*0GAIX$l4aTGo!>u4)&FnR)njpf5JVCL=^OA`)K(1,M4897a1q*906tB0I3WjTHO.er7%3oG-&Zb#;OJm2i$78rqs=t*^XCJ,k\E+#p>"bmlL$N94^#SK2hs>1OJh3=S7Of0+Q,gXJ,@]p+9LWm*_^+*m>;tDR@iYjFdg9`3G'3Sec0=2q=lEbstVEDnu@p0FIl:tFq7T_b)CQ5*'4=1^U%TKu#3^s5_P6X#,p>pf*"4X2qqXeJ*1PW&<]Ahffm`cKfT0L).-KTV\3aB49KeVE"^d)oNp7T3-\8[";5G`;,.9[MC.4TK!EHE;fX8$ec;I>Keg6i6LYgc%\Yg,K5W9OY[cP1jngKe?j2[54XWimiOfHQi04-p2AO,#aRJni<,KsYNWMqXr!XTiB+XSP57ZA>-PC3ErZ=M(/]WSI@JF>Kp#JSS\Zds!SC$&A_SjC]BQr]lBE\oK"Q?pTaVNp]`R06&ofirBPE";1K?oiYQo3hDtT7rW9$?25_,k<&@-303rL))3BK<<;&=eX7>hWn1;q)J"8!V$dT%<2j$Q6Y&3Sn8l%qMuBBT`PSTYI:^l0-e-qaBsVc7a'eh))ipSh)hNZ:'"m+AQq/hV5.c<\26]pG);Pq,p$l(G7F!F`0HeZ/!/8t.`@Ub.6W6aFb%4aV@?oIO,l9LRl>8S9a?@=ABC"6C?cBU7`_ElR$`\6YN]Qdn3\[/3\TF_f@0*h7u%h&5Bl9uq"ad_,1fpF5[k;W.GgTCK:,J7a>VIn`&UE4Z,HW/u8F(n$1`/P]p2K.F\X#V469-_^Fa&$O0OR/4/mVkA>dS1l_1N!3-Osm0m)&?JC!/O)'C%3\;n@#29!a@Q9X\`fXEleIH,*Fci]m<-(aD',#V(bEXHW*_T$M_STmF\g^QeCq3d)=!.[8j-#2cT?h(RTsSNElETkrDf8.*!<^Vq:]7OXn2_^bBEe#1:.a9N4s:k[?orr%2I?G/0F\Sfei[/aB1Y$QPQoT=JnX`5SZ#B,MFpA[Ap+'B(eU;r<:_g:;+km9qP4*N;:31.Rp#^IZ$3;,afq[dL6*#Uk`Yc8;SK&#a*=P9`TX/9)UPbAB&KR5AWPOVhL^qkX.OVA]lCoFcf3*LPV^k'f@^,qDZi*-:d%YjN5`J^:XSSQi[NC93$d\Vl%o"tO)&9X>";GLZW[Wb3P/C:[NZC4H=X-C0pY\=0[WGYO33mUIFC`K!\SF*Mp2"&8+9]E,4WQ-uEQ/1O5d;*#HM-Q@Fl19cN`E,fmFV:eg%Fm;rC_Lls(h6eTL,;q/lnq&$4h%UkaG3i+5./e3e;/e?c'oBtRL:g8e@KtW'>jMVP%k9GjZ>R=+LS=)a.S_:+h-D1*t`W`1D7-7hbMun('iu1Zb]e/N=8D?kY"^:Niku3cA.PPAP%.ZikIf9-&G;ZLk!`;flN3u[oKf9"fq#0sE8M"]Jdu\D!ZE](m]lE':?5O$!qb['H))LR+<(u4^W)-VKDM"7[paudZEH,tDf=O:1;b.&0?00[6SN=_faL?*Fmb+r0YJ:(2m\;!sNj'3_]Lm2TG=W"C!2F&DN$2%l&Drs<<)=(=DMYA3d%KRISNCoTbUHJf9UIMBo]X]?L(+4cYA`=4h7In"e>ZC$[Va8M_3!Ff@.s\R46KkXDOoKL5hOYa+ZU\=p&ecIKaJPObt_&AdsQ_d.9a*Wfa>0&eOhim9:%7[]WThccihR8TQF/4;M@b&a^&p1ADtCZ69;f+ojULJ)UK_=ZicC@=Yd>X#8-'^7?1rW;56Unl>Fj?SiiFSXmf'Lr;#rj-[Xjk$,"'RPS)_\#BQS\l-b05eG&FhX,9/1!V_"k4WuO9Yd_)#lN188!D`+?]d[hms7kj-'r3V%0$'/"8+l/t5u2K@Ee9JPq<+B[cQAfZWDY:6D8lLm/.rbRgriO'DV_a=h-u:#D^9V(S<^/k/if7$EilIr7o3.[m:iU9UY%nHM-R.UdIYD4F'K;UfkI9GOF5uAcpD^'HR@U=IcI((D1'/ZtUf9[riNN5#%S/'hPW!N>fI@5]T5Wcm91i'A+W3!EJG:PYVXfSD(AdbLHtgfiP@`OX'uH?`mYEOOn-jS4OOX)F"e?qq7#QnA)%ii@2alcOWU,`AB;#/Bj@(W`?*ue"MD59O>G\fkaQY5C[S.^-+ReWk-tAaE1t_77;o],?=lRIfN&[mf*1^]Xe*_!$5[.E!n9Z3r8R;gE=:^K)FQCK80sZJi`r(ku1\h5g=tF_h8[E*Y(!+gb".(M49tRYMRYK"db),5"T,c5pC<-))I""-oku2V+[.E9!W!L')#7?`4PfG=gM4.CY?"i.B3"+f/&_P*(co"8]Xt)BGlM3m`=OCA^EC\Y!0Oh4@W0"6@5@_+BqVbWe8#7o7n."pj4FCm,O\ohdq?XI-aqsN9%UlI!M6:%%Q-e5kTF1O^\[1M35;"0IR[&Gb>>%)`JO6PJu;nO5\1D!eLsea-^_f;OB7QNYYnC.=_3hpopYYJ,Xh$Rars-G'7J91!>_(71,hg=0>fUZN)ZuY?SJ2aLXp),0,]aU[Z8s#SL^J;56T3WSmmEFGO9qEh1[>X4mbZ3-_hJ7fibpjh9.F=VYP0g(#)^MU\R5-K$GBiW8JM->)/_KL1&:r#k0-`>8GjqAt"UGVLs7=Q$+lBG.]*8B@BUp/-4t59;R(t#QiPUFl/?L0CM[7@"DP.Mt;[0@f=3Bm.r`lQ9d"Q]3gc8rg'IP7Ur">V.&:R.g7++lSTgOUBlN519N\cN9V$J)9Ukci!"jBROp>pX32F0"_5PZp/a]g!8U@f*g:!A99fHQT9-LW;C&+O!-lFLhe9GJ-u_moCMQ8E8\OKKaYM8lR(8POIY4e+j[/fWM3Pes"BOYps]o.aY/>o%>8MU2TiXUmuY4](pl>j6+HokB9%h*M+B"3h7Ak429Fc*>Wb/!TR=!Cf3a"^hT$FbRj([!Fju"u%j+\t\5i`[K=kCJbaC83qDql9PoPl>%OmQ5!Ze9J9pJ,K#mgnM?fb%K//^qsE[qCZ8&bNHpsn4!qtK\3W[%ou^>-\XhS"8oe"8gP3oBQI_*nE0KSr^"j`$>omKH.o_OjVs_J,fMhfRUa+.]Oc(^Vl]'*rU7N$iWW/$A@ua31?F6?:nU(Shn/kqt99qVtDWscLsoDJGEj>b*Ai-<2icLg*/k/K'r9d\TTA>*ojm8,Z1X:5#g?I%_6(<2`N\2H-JHfsY`:-od805DGF/5<.#u9=0JLl&2-$6pq<(:j,&jS*<&TXG-Vp?'.]jsjRl86@jm1O%H)6Sg&ZKftW]sXmB'&c,CB]*0T^_[BgK3rI(3a9k"q89\UiVj=::"QWnA9j3K^d5TYj/T$//;Z`)A(F%7lh+i%^m5*S1bsJHs"+13RXhGNur"+'+\,:m5L(;aUN4N!t,\3JqATe]tI]V>T=b)`I<>9VG(-c5QM_S*BJ9Z0k(8p2nN\H)GTP7%Y!Ng$5kd?S5@qMF6DPt;B*QG3ctd*c%9Q[aK6We`lJNIA&jVkha9H!arcGY3ICJ$h9VkQB@!/P\h'BIrr%1SAE8^h2\$feY\ViC0/'LbB?p;Jq)s6,*7iA1T0@]%qA!VfGOOAl#6u>7I!F/>;401NP3c+Y8*D4Kc7Vk2i4snKl6qE:7'@G!,9IHu?!U_B_[#5;]:)cR$[;'rV5p/Y*'JVt<8\cYFs+Pk3,sPEifZ*@NugHo[4E%h;nQ(gc;"s,B?mSM-g2Udg%NCYr9V-q,k)YGZYV@=0A7+6&lZn8otY@#'Dp?gUg$Pt)O(.NChAY9ea$G7+*T,RV(qjW&2YVR)b=dn7]\<%`AkRq-P0&cMc-NZsB*bKH4puDB(g5&NMmYF$ll:1dNq5qg,M2BQN5O72F@VXGn"k05\76j\*;]H_q>Iecc4#PuD,Rn#Mk09q<+ke-->]Yf@1M.&*Z:0Ze`KNH+k)AO*8TQb)5])=L,f@fl0C>->a\,Kh3lSHVC:P_&)FJF6=fu%EpV>RpF2c*`K)H,s1l/h[\3EXflDs>6,;rd`!M`2N`K!O/0^CW?k0066SWu9\DAX`^?Vk;m-a7<<7Q>bgX@=Z)N3ZNcqtKR6ES@u\frJn4@0Cf)/q=pLREfL@U/@a(3Hja+?$0PTQi!b!gU9=qqMgWlJG&U.7>`gFnmp4Qlron>c#`r-'?68Z"263-4sP[$)[m%6+$Zo.WtpQ(e4Z,\an;NM*$]/CY8pdOWj?;2[LeDSV/R+m.r!.uJ,ZED.ZfR;qs?=KslHH(_mbhdo>/7FX8-VcQGe\f<&8t[k8#<(8!O(?;6,C\_UQMM>-;c9Dn+/#nnT-+DfuBKM[FFXAGSl?ChWI3`)_gETHh$`==B.d(FXF,`?No[YZ)Nr:mPM+TVY$fm&GKp@cW>nF^1*F-rJ6Rj;3Ei0T2:-q$1+GO?WEPNi?'Kj#"_N>jh9eJ*E-Yr%\)$cFigSTQS0Ek<43#S+Fc1Kl(#!t=#Haci3C<>_dWO!!iF[kD#%@Uio+'e>"TZ>.pieo-SFb_d,c,hns[_(5(RjN3Sjq$'.#;]ZI]G3sn%)""guhr.Zd>K#T[K_l@QS1Ss4U.(>[-h3Q6]1NKY0"=+'_Mm:uA?[WLS.rl'3C*HB@1e<8nm+KjhPbm05,XB*!lXFiZY6Ln!S!KnEn6GD=^[L1A,0[;qLB(oh7W58(V,Yuhr:og!].[L'&HBFkq=8e,+;i2-&gMGJ]W"i-:,4U<-j>cC%rgsl3A+Hjh>-d1f2(t*SND$fQ3#JuP6@1NDDBab[_Zg9k_:V(T4"gUD)qXeCH*)KZ#.jrbM.I>drtfL4iDPnh^h3HCpTI]A?Q#D07qVPupX?H=!_aWZZ[,i1C1=gFi6qX*%Hk8o%FdQOeicfgQa/20nJI(Z85(d!1Y4=24DmYaQ1"VYAD&YGp'11\H+&o[6q]bO#dc'pZ&<5`qlCMI&>>t?#QD;W'5q(51I&ut0P]t7P/+<]??Z14hsfI]Zg\@K.Q\i(O).rq"`"@4kWcCD`n$Pb-:RJ?[Rn&\l(P-Al^506]6cC>at3fY(\$.+4^:i9aP`30c#:af!d_Y9(@Git/F9a$+YC?=Db'=*q$bb%,We/B7MX,)B6!E`S@?==@SVdLbmXD9`MohCl3@;I"d>Ib*C%*T?<$Pt.n[J7[+\9Vi`o8^0.jb+d9Fm;rJ,(W@"SY"!6!'11qXY%>;_91Ne4)`ugb+CIF"i36[47c,Sm"r@\PPf@6rME#G5YRV%AVs_aP/`n(3H*fh`@nTeGkgd%G$,2U`5KSbrn=2A(NE#/4ZuM(PpoX$Y/&i]:>-n$1ODi%d0`FI,8D_0<&dZ1\Q^GWDr8:O_R&`#gQ5>q"[LnH>.(B1p&XI.WUo,g$ZS4GhRntmLt\t82sZE@-jR:5A,P/R4*P]uc^d.AjN[f,+!2Tm3EeX$ND##?'bJ^JHl4bSOMW3lY$F+f)8t8D+Q=l0U/.CFBiJ7TU2f55V?RWMDJG.B64l`HrXl\"JrM5WR7J2=/o4kr5\0WZblj%7-".7jbr'l$`A4;hR7*EE;]M$s0'--NiV1'r]__VC=H>u2%bfo)Ja/o5LESBMdhO;@Q+llX;F3t@Z)FfU=`*i#e$Z;=:j_!:f0Li6pRRBhKs\bn*dgEqeWlkp[7J9hL"+/4KglQGP3i!1[!!KcCDeLWsHD&[\0:D+gj&qj#X^_M^?I<%N@r)Zi'bLE@dK6"5o9WE]91)c=?hea+uLFGO86B3*T!COMD--Y&&ZiR;b.+9t$3I(%dI+sr?:b+8uP'm9,\X7]_N#AD#04@p0R[;GOeB`go!Q#WX0m@sgHVV%)Hi*O(FRLg]H1+JS'J;!j/iGUG5!C$UI?l%2O?Y36]68#q"(`V!(I7%"coQt+@9/R=9nX"8,;8cYh95;H2Jq.ng86aHb(uR?pue9!VNWC&4X\*4LcNKEJQj8bhnMt]J?5iRGhbB9eiq54A_XY1,@BBhj(%T9Lq%I.4Zi6/b*=JYWa:>SI!0ZkRc#ngGVFCB1-sJ46iic/)*Gp:68KJq(RM^UlS@8@f%(V\%N2[rNffS<6&+AN#N8nf?)W%$rrtXjRPelXCm-o&l;+ZJ>>*BU,mRmn8CQ4C:?_d+"+:n(!B)2V301,C`Rm-L*X1jJLtSS;(IT^97i9V+@,3B:5=%=S*FH27"Wi?'j21?^!_4di#T&DBX:)\a*%d6X1k=ipEqIt.+Sd:^dsZ$_%T4@NL[*$Ig;mFnu4Ec*?ZOEduq[:jhJ;ZS&*\?%D?11I2]2@$!R=7PkP;Vd[+a1ZioGc[%1;H-UPA&\r>QJB&oX)LY/.5tFTH[F4ud=KiZp(6dDBU$/-+L8>[Nu^)K:SPR_otF"F`lW-27G\BKQ*90T(s!:Aa3o#g9bRh[KL-H6:+"TD/J%:DpP^PdB#gOhq.@LSekt8?ip6!m:4dt_\^H+W?WpVO)]S,*k-emH)V+;2Cd>$3=asS,bXlS)@J&NuH%qo[PCkP`b:>qMV-P%7\+?X5tW'mY"7Le4h-kK+QBJ>+feWc\Tq?a:aFC6JNoKhfTe#,uWoQ2W8/:rM,[G9:dI/%['_I9dh5GU)iLbi\hi"h"I1gO0GTLXf0Vur,k2_fe'lI2YllGYg[Ep!)_gDZJ)!bf.0mdAB\.7Jb5BTf.a4:[c.;l7(7\>6%#CO3UmW[c-m.3g2()jH>WLI#J_+UfeO'\'-_CY?")GOOB'3nQ+$Jb&C&)`MXkDr+`YgRtHos8LU#f"Sl4aiVYhYG^12gaIY#hsbqS6CG5OIpVN:aZ2BPH!k#&DI!<1%V\R[m$A\@867kWAbb9D_h[^<^E)W(MTnUY[5;dVGim5[:W8hbFQtM%_7Uf+gNN=0Es[beSc3EU+5W2"sHq%>4DY.E7Dj^N]/'#7hm>c^A6__N@?L*`668f[GNm9jX4sflQrX@7$I)4`VI&SXk2jb*;u0#4Un=rXW:_l-5gTgg&!fqIJ@A]TP$aH]K42FR4r$H0a1J-Vn]>!dFp;rIfiW9:%8*Sig.K&#-Ogl'0O8@7E4<46'?HLr%2s-OGk5p$:5jbKcV<6e>?7o]`,DY(TV5-RU:sM?!ZC%OEtip$UYJk2tg.>.)f.M8891IJ``c23+KlpB&3/0d5!t`A?'gRAYpV[tSW*k/J<,Q`$99cWcCI$s0A+!e]BWbFTuPmDh+.'4iANXK8MNUIWdUX^fD3nWiTI+QsHjg"=r=08@hFq>b)nd)4I5;5dH4_AH,J%n4?C\H?fi$hMgTOnp7]F%'ZY"^erV)3d0CIW+K,R>o3kg%>p(o>d^b$E8&Aj?1"j1b8H9t(j#2P))InE:(+oJ++SK2Ui!$3Q#MJ=hL_O5:rr30kfd\9/<\rLE4@Nso0DZ^4SUf1%1e>ZAH^E3Kf"Jle%p%?;+92nB>(dZjHQ.p5'o]W"Fn)UfeJGq6@hE4+h=h&FEnup?acDl@$%M!)!Wj8pNoB+:+[WglXR?9'[PZ8?E6qp$8NgL2]u@d*N?!?iViuhRk$+(1m'-=0Gr0rqi9MHdii+q!hj+o@p0=T7DFlWI6:BrVEo?[m<@'CFaokPe48>hnG(SQUh[B4C*_4.riF5iII1We%9gB6@U[D0i@k*&2RtonDS0j7)P+VfU^7Vj2WHg3&)R"TgOSFC1SoH'.#[GAJFI"2fI^,,mFbq6cc6X$*d;LVjfm1n*a'?1PuXQjS7'fMgb6]&K=Y2Eo]c%N=-(#"KS.!T_4GBUE^`2LeF'eiRSD+c`LE\aNn$c<[*_S9qq">?+P,$DbVL1"@qj675H%i#eR;T9V"6;+0+s_)P&''0/'6HVb*ai[r1p5p7\1Rj9$hTKBi6ufeZi:gPHRk,$!I2GFpm:-M^c&d_tnod#O'/SAYaOe%Ko^/;t2^Idc'3)Mr^HC'bs/$Gf:h%I<'?`1;YSJM1W<]lRlJSeD&^sGqgK-X!s8p498O/:jlJoi(f-\`7JEi'4*IQ/#m[I%)9O?U7Rfi^'buCObg4VuG)OG_aRS<2X7m\]Q7lUJr6UK4_Cd\L$lbc=R=a#,PatX[o4:<[8(3I3JHH-4r%L;u?M3(N*qRJXg65cCO3S)k4$[QS)QA?N8\kT8B4DQ`.'iY,J9I.krQZV3-+(N(2i2?[VacbQ^>af$p#g2XWd]8TDs^dG0r*fs1e7&-`g"TL"50rVQWcb:e$^G4+ed;,L22$'@NA8V)E=gJj8YnF5pT#jSALO$EV79M?-k7T`dFW)9>RDOllN+OGN;/;/b41A!EigB@aijiWj1jcebtU&hXp!FiG;"#+G4"!0NfqoA<7T8c8"2DRp@$l\'GQ3A;b9Q;2N'l.U5Y%i4ETd`_hJU+o#H_M3=m=.N]`S9geNW_9gQugpqLc]TCMTo"bk=6\c-d;\'f)$Pk;Od),"_9q!mF3GpW/1Fjt+CMW6aqtA^tgE1afJHH/Nm+J^^gU?!hs*a=j\O2)[q;?l9fTZf:%X!a.r;9>TrKQ_i:RNsA[m35%a)Y8CdA'4#(5PGDo&kN&rO3?,jTY4NkKfc5DmD@/G3rHiJ&Yc",*[AA<"V>c:0:V#p[6j+GTt?k4$/@*EBm@I8FP'-'A_[i4F")*DTX/9UJlkNV?>A$<4-Mnf&m,[a?2LC3:LX+=Kll0:8ofFRD3a^`5H%\jlu%*aX<^:p0:S]h7GW-Tj9q7TS3U+'48=mWE`=`CW,2LLDfqKAM,m,W.m=\X.[M5q"aaUBQc4d_\,j,Quac6S7!'M1rJkVoc5_oJ8!9*F6Cj*hVPd-$OFd[J,Mh1d'moKMHcVom+]"1TrYA&]2m,G=0Gr4.&qapqJtJnW[VU5[VXVPQ<"0kJ'H6_'fk`GPEQ@]$7[MT#g506U-\f#(Ddl!&9.-s_6ILjZ74JTdZXQh#baPMP>:;%5Q6ICh*9TGg$\:rW7quKj7(%G_1POR3!$XqF;9PSI5>KZ^o^?CQui3W=gCHm>Gqb?E-6ruY^JfH:]ifT@cS;fZ%15UjE%LrtS]67bq;6slZV"<;n+a0U0XD:sA=]SQ=C-(G/Oo'3CG!:9H/99Y!f%*l&#-o4jQ5LRX]q-cH0X9VD`ALSABjEfWdf"qbEY@;,P'W[LD]OVG3QDg=G-;?3C;-a""b\-)e;2+G1Q=ib6oE)5TGRX'i<19h@peFmBed&"8Yka,WaS9+[a,d-Yh1gpdrC:6"&ag_MJF:s/\)_[fUcV5:"'(De"l3tgmbK)B975r0MXK0(#GWab(DhhhNbg]DTD1:<]Y#49/m.uR/khm$STE40!+6,pZ5Pn#=Pl9IT?.OlphSSd8uICOE>"Si3k7n9t^%r_FK?XM^JIesSL!8aE>k:9o5"9\k32iL@`%NW^(+$g(1?(]j'fO-fWR[fnlHkLVPW)8<[*=<;fV\=pdSM$[Bf;Rh56[40q@'\\60iMn+1=V]Xri/kO\i$kIJ`$T"m?l2B$DM1+5ESI!%m'X^7\:+o%!:@Rb1Os2>Ydr7>i"S`R:SU,9nGTL,q1L4TPI6AAmnaQ04rV[I]mTg?(2="5^N$b%`RGR_;]co$[NO#NH4[&&$_Os2IeF'DuMi1NH-1gm*(V0tLq=tFrSHArrKbbdN2f@CnYJ66UN:c-5U3/M;+15n9B&trM(L>8tO-,fs(l]TQS2kXm/hYM'?GCsfaH7^$Y(D9#pisCJK+8A$ib76jo$3XpP:#6("m?6$Dr7E305o^[_(CY4P*-G0;g%D+?4V%3NfM]S&JPurC/ho,nH>*'N=5Qr#ZVja<<][T!8@&2fe^2o0$Qqn8P)J^&RsF7n(p4_'jFY*6#NPEWo`d@c1=DS9ksG3p2Ns3RH,AJ^_ur94kiY63LoS8I6?\T>7arX2nILP1=77q&74b/t(e*P/c!#-^m0!33'!fKUM;[d4>e9MEZ#++6PU6DmSLj;$)SN@$t,bg"CPMZRE\7RdU0E\,9e@2JcLmp?e>-D;)L>@m`W$?G1YZSN:oZeucE!h+C4/&E+Q_&jmPe8k*/'VG3OL&C5\o)*ir`$O^b#Wg2;cNOkN;kAsMh9he>N`dIC?c'70B1h+q2:#t+oF=.k5,`mmS-W-br;N'8*0'XKoU7\E:*/t5.$EmdL9"q]G>`g"6'Dh);RZYeGT[1@0+XB>rXTP7*OY$JI%)lHH%'(c?/DJnlq#nmS'h6h$b`(s]E\8["lg!.bN[jXMiPa@^I*BKF1\0:Gr7%hN)Z8)q$O0N38C2",*6#.@(OaeeRq'/qA=M]?LJUcOs0IO@'J,oaOs"F!CC?AL(lnL=R'KRfOq:4%Thg?(M&gHO6[=R,A0Ui+\5Vou#;l25Z[&6]lnp]K'['Yf32tCD_#RhY1bhLlVUYMhj.7]M=jh9Z(JuM\H&mG20n%XACjGEGk*:l2AiPUHBfOok$OFl'PVP^6Oq^u6i*4_H@YVeYke&de$)1JX6@2"sng9jT;.RurtNYjL&6%cGIECNEPcna,1iSd'6L0QWS;1M&CLhD"YS.f0qW#[VV@H;\'a$K]N`l]UdqdUqk^<>1!*qLl$sk[r*30'?Zt6K+8k\nG;fn&Ho&ombPL.Q>,*^/T+F9'LC2.[*YHb:nN10)-SfbGWW997q5'dOoG%*?Z4`0dF[!:a%Qa"jlLTnHhZqK?ZuMV&/&*!"mCH4o--iDX]r7?bu2#g?/2.S.H9FL6oU?lU#ssZ+G[pJpD4iS[VS79UP+:'NP9LJ"J%cjIf6iCG6AIC5s_NQbqd]]=rqG.IlohUcsedb0G(?jeR"3s-N[@Ql;5J$_^u4W*0leSFG"8VW)[#f[uS^eg;^j6Ji[hQ1'jP?;oBnrTjWse*Y;T6hsok\@D=PM%e)LbNO&Y&3)X/OP9oI-pVh"jZtRX29s85B^nW'FJ+$=e0md<+Lo:`%Y`l5o.aH.Qu$FXWq@dMaPQBmhLc^kRO#`+=oaiVX:o4-.-*BOs-fZ3jCZY,=g?&5_](+lm2<[I.e[F:P!c2l(mJ6N^13I:Gf:$sBe(+nP?0'VWbc'gN=BWtFPY:<-],2S*1LPm9?BTQ6DBK_.mS=&2dP^tYoc=+#bZSh#7NupS5(IHE*=TPpV((RL:BYQdXj5YHJQ/Tq>K=Bo&WM&UDpbMIJ`^mf^Sb1lgq'4NhiHr3W\!ED\k]id-TZ)?gY1u=0EZKO5.L"+%u6H1G^h_!Hf?If/)S=+:o>*7p/AtC204rD('lXjfG#)@U`e5BSoQU3oLhX8.3T(E;\j9+@f0L@r6(bggO2];aYaH)WNpeUP%N0D2T/]6kCIh%*a]4\T4OU[lb7b8^EtkH)d1Spu\&a#Yd$^_?AYg!,4`ZkCZU#aqKcBaN2Gl2fBa$I!G,:]rnN@PiiSk&e`\@,!c89LT22OO+$cYGC3G_T%^SfdqL3`0,I-25bOAGTgg7rN,WubQXHBmNPb-c=')/n'6@eRr;HBIbiPMC5CWNTndf:D09KTik8Wa5B?d:^\&Ml#9H!P5jfm604%Ua:f1)@r\'g&eHUa^DL$MQFMI\>\)0SfR"#tD3=6ej#7]8%1!4F%1R1/[Om+>ck>Km!f;bjF?d.?[2#TNaMCN7#b;,p"R=L9USs*KV^H@6;J4+7-)saJSA:(]^tID/h"`+o%R=FabaIO@Z?GV=[a'C:CY#Rq?s+jPr:.4?SeF9(*R`.0HSd\B^8>f4RPTA]9[;3;6#g;PcY:4h4R@+q1Bn58PM!mX,ET>&/Nuj:@N^b7!\R?QX#Pu4(hS!uRFs]^M:bm+S9_KDVI=6P.b456#(T]@j#BC^d"hf6T&k@I?5g(cA41fRsc8djDS32'09i,\CD"d8NL]/SB+FqKP!C]FGM\e$1Gjlh_"nIT:`+IuFKt-4M#^R%(I../JkEl([6pMm9l)i)"kg>%Ek4$O9b#bcQ+`"E,lddXl[\3YFrqq%-6%MLgkR9H1fs>=]C8ir>Y@"1A^jB$V9_c-!b4tMe2*-4Q8SDe9_>B$=]Ef:/mbPK*Wr2+ZTAnEG'\1aaF5^juUI#`otG]Yqb,*'Sc&d*Rm0/8*;#j]o+.?R$5d2V8LGI!g=+op*$dc7mHX,a,;HO="[UBmomP-$PitM\fk`=EOE3BtBleg)5lKVbU(rE,fk07t?h\Mi/f-i1Pum^l1&FY4OYJX);%^cHaE]LOV3ufK_C`eui;:>9+ggcm8Y0M%c2@Q00FlnpQ'QGtVje[:mi.3ihUlXLUPU_]RNZ+15Y#kNt[/CV@o#Di%-j8jBAGC#r[a>Pq\om=2G/FC^:nl0N7n0lDLUOY"PQDtHO=HZdR11&k:i2i&:S4rjXn#DuN'`GXLPIB:hnOX_[h_0\^3r*!LbjSMl$s1F[r*3lIhqFET8eg>V19phSqnUV/s'RfZ?ZV2B"#kJPEM(sd)c[8='&IXMpYEkH)1X"@54O5N\3EN8'-;a#8fSEX]r8R$NpHi0H=@1D/1Fb!;qq?&90PJLsj^L67Xd\6TfDMLuK=0>7aXV5:Aj4a\b&!\ehd^jKd;:!%8^HFt?qV(+j,@ANCkYKnY6?aH.!e,GM'4VK>lhY6bXI'iQ8_FR7YB+oA205r17XXJ6?])3?pILCU0HhP0*ZNK&p/(hLs]2b-e(cIn5"Pn"fqW4#TCE%q*V[r:/]s"sPjhVPtfkK^S;E$RG(qMp=W,+B;rZm!"E@/$]Qis5[;fBZDG>9fLCP>&r,qu7oiOUs:K1:m]mB?jX5F%HW\jr8>oNhF!G.?:N(sLA(IX'QBkaQ6_PGD?.8s2ML)f^VRr?#IJ@);5*uNQBjFHgc4H!4+6sIGU3a](p-uLU?q7V)Di"4%%8l*KnZ'WEIqWFR"5a<51?+IbY1@`TJ`;":KCLsMLVn8YeVbekGbG[EH#l)FrpqbPVO<,/&(rP9?Ib%W)4eP_MjG4kQ[feYq]R%P!U%b:r1SV9,7K`\8c#t^VE,n5m[u0D:>AA=qBWTk([(h!!iXs'5>mj$!q%cH$OMlYtLE9GdU*MnmWk*3]\W98,7Yl]mGN=UMbZermtM,`.Jk2r]21Mk\t%hB34s+UDf]Mi'?9Gd2X^m$9Hi3Y&.gO/\E=-T8j@Ddi0V>V&A'L\qfK+C/]/PTEEV54cmB[3,.crNJ0<`\qG?[o>#*scs7DS6#m3.uq19'Xp*K3R(0":lc.>FOWGbI*4>_RQH,#\`mNo&NB.mK:_M+N5q*-V3=&+XK!'23buCeuaj7RcGT`),Xd[Di\+klp2"BL0TCBXK8KQ.OoD<"oseLf<:fWSHtrgVbUc2T7?i#DI$.Nk007S[Xo42S3`1Ncd-OZW);p;8)qUK+mq1[D[[^O>fofP_1Di$@;Xc-`N;dj6q9b2gF>'<'t5f`;,pVM*5Td_/(se0-!e*(O_LI]!8u)>M%f,CKG90Y^4#n"_Ras[Na%i<))Gk5TrfqS^5Q9\4K,?_I.?48RPek?p^U<,?b_W5.KCS@F6CiF)\/SgV.+s1&lHDmrG_(c-t-OmjQ9oB=TtHn*Y]m:f\9PCRD.otRD,t6\'H"18k_;8a*=]sRjE?cYOU7e/E;*oST3p"?'TE,%c%rBq)Kl5g>@7!DNYGtBj5.G`,(IF]*"g;7G_Q?HtT]PQRT7'1BUAFQKp[6jaqXj"k2f:a+qQuTUfB_%lZa-m(pK>&;\P\A--RU:hWWN6GZ+%3?F!@$?RCLfGPF\7=(=p3JHec1X%@K+u%=8VGmS>dT=.aiQit,dc@X125mH8WtQXc^d.Ap_!u8;?fj`kaY1kHou:hs-/h8P(e>ZiJ4pc8Xa;dZ#IS=rZH:#QR3]k04jVShH3B+PjVO,AVoJc>'%H>7]nrKu;3]NkpcA-8e%i+UM[%fRl68-%5qn!KlVLd]Qs,6l>#,&FI":MShTr%))GkiDHoI$-n6^@lgp#N0?1-^?T)`Q5Ul0GR5;@L8Y&;.(6RA=fWeqrFm1Z8KnZ!SD5%tJ6\c/*fSk?@;,pUbfAQrF*fO=Z^E@/TVpNZ3/35i'XK8Mc4_Tib)d-1_aN1#j\&?3QgsU;7q"T+)WD<[1R@=3WO3jA0g"De!MdF&@&[sRsi00`qHdWdB.I6qFpo0N5!G501H.6/[kn*CNJ.`Vd[=Pn`9o-,/EG_W%,M5pJ1^VR=0Gq-[SKe!&oME0!G,)`,=ddPecc&dZ%)e&3]e<%*K=:Z^Mn6<#4UL3^JKCErU.;di2*%O:sO[XeZ4I0(BEq/_kHaMp[7!@pFj^V0B_[l*#or;bK!C]=W(f2^u5H:(clae\acNcXr%.`iUuNgF;ENSc47=pJ"_h_bF[eUADB&X:LIQQA`LSr6P7tWB+MQ791hfqlN.'8aN_u+1VZkd:;s@'s$O8(Oq$HlO2ihZ'%!KBK:#h/Z[).SEjM*uQK$I!!;o(ujNp/$Df212I@?^tSX#K5il)9q8&q/^G:m+.N$1^(.Rccp\E2b+1*eVao]X]lEC.""eGH`84^OuN\*.I2KZ?_M2B'N:+FoMg/9iV[;4B59@HU1SifS^m3+iOi78&3Huf&RANKGKl04%/*F$mbM67Uk;,OjR8VNV%RXY53;7=ojLC\C*dl"eN]I96f,+&Bl7RTWISb_*QFXq?P)DG[@%*Da9J,UFs1^T;4R7[._6UO4\X4%Y1.kCA^h+QAFWMul,"Te[r0Ze>1(_o!]Q0G#hYhS"9&St:sS+K,kBC^P<\['VYS5<^I?Tgghd,n64k"M8([?6X]gE_*Eu-.8iRcF`JYPuiVB\Jo()7`qi7gR"q2=kQXISLEBJL8!%ffA2JgIF%gWM1mKI\OL(oF9lds1Z:'4\-C;kIc:Ra6O[sSSu(Dh;`gmOj=%NRT0<`XrZ-3Zqc:f,NID;/7$BYjMYW@(apj`lIDpOF3>OfIU!6UAP,Tg6UF+UD/I&`jr8.Y[$X+C90c94GO?I,-jU4i`3#%OBM%mWO$@Y+n$?ZQ`a&[/TXDf7n`/0.cg]o2Y@#&9QBikp2Dg1T.h3L;)s.m!"Bi3O*CT2soEU,,lW^f6_6$H7ct&Co@]`gKeZ+=-4uTFAX">kRfXKCi))E6Q*Q,e4H!dME-i!E&>NDoP/6Ti1f9=]<1,;0ri3uhh5iOJNo53?s3GrsXPFeA+X:XqL6\c0=hS":%eubDuBu4KWbB-Ai?X1-^Kq$a84F$Alp$:#O?bCWGR[T*R!LoCVXK9XhbDV46naZ.S\$qtnIX!+!%4A0Sob'&QOZU77H[.5"Uf3jOoR'XcC['Lb9[8'JM@#>d7bWji`ut^3l?:RAj'O)eAOj.Okc4$;sc"_Sa9>I=3+V*OfqB3dpksNZC3e'OY]l$Sb\YOa"-RZLqWuD8/+b6\:Elq%=jQ,C^a,d]Ff8^r&^m\iXQFXW>Vl-G&Ht@tK9bqp4`XQ1!!'mi#A7X&HAHrGFh!28@]"4?hj\2F=NF5CD96,)pdJSCBW`9,fUh\_sou;t1!s/NLoptrWT7/!J['I!S/IDKR#[PUGrr)`SQH#KDdaIU!s.7&GaX@b*UaRcF$k!G1$WscBi-^F[M_DeH]Qiu.bEq,!H%V\&mQ+3dm+=%Els[edi>)Rs;M8I_:/Ok#DKQqe0OY$8&IT'Y`[t"WW2ZaF/hTmj8O8rea2dAcPq,@b*3lr\hQUF@\[f8)KuKo`RquqY;'5E#nqr6ZaNDYg9AI_Rc_$DJ%W5,D+@XYeVDGZp^:q,-E?R(mP/2bnK8*SQ+9QY)ElaeAkjSBK+B&IT*_^9dkKK?H>8e=)eLfg,OA(_md>>8.'.Oj_ZU3iadO@-Odt\#-3dN&&HVfU4gF/tr;-HLqKP-if>WX&c?s[(;/30?,S<@m9_L'?[m[QnSQM1dFh&gprWqKl5e^NE[(s8!!@t1L6T,*+8.'.(P^9%;Fn:A*X;oT\r($2BB*"taG,Th0,"*lE\"Xg!J%!!ZtU2Mm?Q9+m+&.P)$acs6CC"&rhV.i1`70T4q5pRd(iYDg@K>i`b'06XlK*MCa(`=2gg>;>gE88ku^t@;,cAAoGh-.NI_#Q3(hnD7Io0?2'!)Q=%BIK_ESNhTfDJ:$In*eT,(hqBl77p/ZDN01BTj5pd-$gg:i2(MXcBPb=;X#6i@=FuJi510Ue^`3[Pl_R%/\MH2VJY(r\4$FK4J81`+#n3>[knQH]6CG^5>n[k]j%s`5qE_#bdMBC#eagJqXq?e!J!;2WMsUe\1si1Pu0Z`U7rj>:.34OUISn&c2rZR15)i)1Eul"(@L%m95/4G?b_V*RKeiaM_R"uaH.&_:-E7V67E:/2:F?>R(/AS#HOpu@Fr-SDU3\,[Wl\p*U<*`,S"1m.$i.PEH9Mi0qtnEA8p99q.)p=jLGqiMXG=s*p$]0c?\AS#G%IXYa8ildZA]tD"JS=K<>fs>GD.PrmDf<='J?[T]h_0,2$fu1g>qtBEU&C_A"]Qf!.)53atkeFTCfg>LuP:'/cD?'Zu.j6&ZPf)e;X]r<3nH55l^4-$,euW!or(*qn[D7jm$hEke8WcSgF*"[q[@K6p?FOh.3'8+.JN,XiTFKAI9qr\23YhbuR4Jj1V.%8r"U,(>[EB2iQplo@jM>,-?-s9mjN*J;=aHc$HhK#YV?-aC6PnHX`s,UbEA9Bse$j7&3:j;=MMd:u['ZL!T_%?mY?8&]]_tEjo]js7NXGl5G2_gQ<%\onDUl-+Y:17\bGOJ1Gq&?ZCs[`7un^WQBp.+?OmVV:.Ro@m]W:VTX_KK4n4De$FGbTl$daTO<$na8X+j,2n&T]#&_s*SIG.JXR+2WqX]j\d"J:@%L=2nkQ68,(gj&S]SW'ih!.Z,Bk&p(F[3L`>S_9TVm+=$E9j(.`%.6aW5[%?[]KVH>4$2J?1B7DW&KMld3JsFmI>V5I59NIaS=KNBeZ5pYY_\*kW:rE%ps@gOS;fBnDFf*`c^m;K^(AS_"UM:9?>t!u%Kc]W_P'>P.*&X=Di$"o.62nW4L7>C3d%HgGI`5'^&cf@IoTKKnaZ-FSih"6F$"jKpr8:49h\6lFQpZWp#grcD;)cU/-(bJBWb)Jd:h@IFh"9)6"+1F10eoZX`N[Ng(^^6W@,qB6`BEdJYrCd,6_b#kMbA3&e]dsHt`%miPL;&$Q!P]LgKJM"ot2;+X)DW6pH.u(q2=VTM.A>^sLGiF0W9d\]Sq<^9%\:34bkPCAIMN:XO(u@]q((-(R2G[U6duC5_ZRne/:[!!)N0eZ2b#a0e*a4O)!iTegIi]6<::AlVj]^juTQjiAVe(L!3MR57>X&)um>b'oIQ>$?76aq_L^/1iFWXW7BA6:5HPk0KZ\>F47r?TO>.r(Z7=?[bj(7n2tC042H;`dJgjI(6i%>gpR9S2ir!s"mI0(Q-in$efGD]YH\Za7!u:uK?Q)eEk0',)$LN#4k4-9HD;i#KjXp$1(lAa8?e:&rX._Sa8?a*;uZ4Dnk"iT9/iB.X^am`qr9X"<]![K'aKR$=-AK?h+>gBl#mgo$HhO6d7p[\X!dni:X/`1oCn)_?Npoq1!!!X?n`%OKOhQ#+>26]6L1+#HJoThjYq.@L,@eWG%1G\Iikr@SUo1+h2NA9NEreNj.5*?P4?DHdlAAdaDe*Hl14'RcO,o@UEaiNgJ,T%Ak&P4eW[0ukUebrK0P1,lB4p7j"onYLUo("eNq_c$B\_$\+?)6g?G1Z"SHs;nq4sg^.9!+B/Hde:_?A8d-=sj']d_\@3F^dl!!(rLTV*FuGXms4\Xsij.4Jue]!Y_bJ*PN4L-gn?3Prda.+l4[[qN1512(5hffhI3r=8o#(Wp8kaQ4"6M[r:.>\W5*k/hk/`OX"j=!rtS7[Vabg*qe+8f!ojBK]0/).bCh/UFTd7b*&eL*5s[eG<`@ud)`EY\Q/m02'*&#ujQG]Ur:.hgJY/O*Na!E+.P!%&)#Q*u`mC!4S=Ig>K,A:mp+IX8A,lQ,hVR*OZJ7huIY/!!!91jjC`,/R-A/!r:cj"#^@U_19/0]5r$;"t\VE]mfq6`5G&`0o*Q!o&@ZK)jIH-#=\\Y[u$!"+qOVAj2XeKit?p<7uss\p1U$k=2Me+#<=jXKThT5g#86]PT\kZ)Gs+>&ed&g))<*CirXbVoA[^so%=!@pYTuV;@aD^`meX3AC-UGF6?4t_Q=1G!5Z3ek72e4UU_[g?*p7r5"fB,'bs/?_Xls:[;ln=>eG;Yj9C_JPT/JfD;0eL(B=GEE:`3dZ3:LA$cB*)Q?267Z*EID>IL>$s,iG+Tr"Z[j0R&qPJuYe17k)/>*^j^i^@g>n=g?l!9rP+k!lcZEH-!.F\u(D?I%!!)]9NU5>SLjb@lc\K5:/Hfi-(1+[,ff?>@\toYf@&'^:q<4%D/mM0f]qqn(tacneO('jfAoZk09CMgY6LB!bJ5Y.DHZ&!.]:7PK?:R)G)i_hX]dO=k`R(A&])(qpqlR[Ib8G^A-[q>YUnT++O3.bEa`f.=lMfGO3s:^(^VK+:J,Fr!7J=;lA5L$GP7HhZrBkq^=RR5+qUCM8R!$G!^Xg(ZkKUC!h.!C./=8%9QpA4T-X"`@T[W6MJ?i;3-4M@\TaEH,63"YILfp)EGni/XN=rr2oN'Jb.8GX@l:)]SCF&-)\J&Jc-OYQg:<9p4W>\ql.JND+c,B$Ho2I>ZTVS=Kg(X&lLEh&%+tN`Ap[/N;dSEt(g530>kV!!()uf[s;X6'sTLSi$2FE]Ef%Df(["g<,KL0'e=6]U*_-26rTT4Y[KoErdp;a!sdh'#*'B6(Fs9p9f_8mZ*^n!9-aK;EhoA$TP)TBWb,\q\okMO;=jMK>CN+E#B7-Q7oV9sE"65NH%aYgabaB(!!((MA6#L%SZ6EB,TG#Q-RYffT0@k=$@7d6ghji\Vb`p7X2$_1Lm=5?\NsQ8HH!'e!!)(N9hc(#J>aBAh7Imk(.CqtCOceZ2^Ca2Z,^YG"$%K[q9@7ZF-XMQ3[+J[GR[+A:/2dL6QoQ+"QG_#_"h-:1'e3@lQi5Q(#'U4a1-:2':;TV*F/2:_cuOoM/M,/Q4hY$Ieb!gB7Khn=A\\jgXYE=o#O!!(*'daD$'@q2@S\8^C.DFI6`Q^:Y=*E()PkKakh:rYM.5dF6;$(.*IW628K]/JULAQZpQX=VnO:JOZf=0EZNo`kmB+CZVs!0A]h2E"1>EV]0:giCp6il-fd557Af?dPoZ2s&?f!Wq$SE9,*&jS8=E_oKfQ+FDY=D&3:_7t\?ta5PqHJphTo9pLN\WgPG)D07RQ#.[(/-^=Tc+=)dA'2h2)T.?YfNO@!!"-!o()@#pu)I3)3MlSeWQ(.p,T7&I!h/C6tVbHY7uBWeQ6G0O0PQmMMmD)G3qnf3cjFWe]W.)hQ?Y+Rl>7\SiiFOZ=oAPX&8ota;rfF.P`unjfj?ukAio36HVF-bQJ%Oi2S#Qm-O(>X]eSZI/NcEo!5;tY7ggq@))d)3i`0!!!%Ng[r:/)Qk]07\@&OB/JBP1jTHVgI&QrLEgIai!,p`,)1,hrW2M*KKuu&.QS)RlW+seZ:R>eB0E;(uaP41B5Pa@R"8N(_WiE'C6j=n-h07bUr^?!$254g6VW$Lm\>mZPH2mmBMT[h>T'>@uKr[ZC!9bmY,pdWpbX!#a_nuSc(:L/9;h^a:nm^[(1pXKgm+Sj?jP@RrH$Kc6/nA"JR@0J6SZVUdLFPB0mY(@m!!!;Ffs><#A2R;n['XAJR=tK1QS2]XDf5q=C=Geb@ocEfZVqq;?sr9LW>b/1*]@h:I!iR4q>gTCF$`5]%K:QqPE`&FW*hNTWkk?m.:kLqHhM:79Qb_cLgaN/bOI;HY^!i@#pS<'h%-e!!$D=hnFN_G+NY93=;pTE)nU.p#/$5qU[D/J?G\ULa!!$K5Ni()@[k.JE#TVjo@4XBDls$\.m:)<\lIn`J(84rP@?!'k`6$k++8E1f\/<23,)dF$@s/GAAZWu6eSM2C1lX>[.b\Phbe"onYM&]2H']6E_HW?E9:@YCU;8ki%11nQj=e##i]"VqmjCK_W`BR^-t!!#7h?k\EZba2[c=]AA=iHE8%*RjXegUD+!.rE+S"WYJP!kPcTXUY=2TF:Pipi*I0A&aJdG1>s)Rl;=)8%0*;$Obuk)NR",oLQUV#64ac0cVD*euD`nc-;7&m0X4/\_67TIee]'5U.KuD?]S:bC'No!!'TcVE8^7gpj'&f%+j$`c3farVH13Q^3u)a/q1Iq>'3G[+TV4l2ZbpAUbGOJiibN'8B7ao):!!!#["f4B[rV,4Fc#m>l<2@3mp@\))'W];U0-*/<4aCj#!!!#`6YQu#oCMdkbM'@>[5ZLoDsO/gO4M$II^sh"0#(*c!!"-QaN=F+5D]:/j\*<]1uZF-q!mD?.[`dZ?G+?t!s/H&8MbJ+:JoI+`.!'&F':2Xj^%^K=WA6$Pj!!;$:KD'g+8=0Gs#=MBu_'9C0/j,ZE*29t(8hE2S!00OXR84lM6YpBDN!$k*==rP6R"U52%3s!5(Ynl@%[1$,0$?Za1=^11t64.rV\7ku&[B_(WEDm>?dY,'Xd^3)W[R4ZkikZ+l\#1E8W.**lKA;o@59!<<,X"nI&4(J@b3=t5V.*^+hV;IOs#]KgZQLo*n9IeMH-P^d.Up>*?)UC0hh5-=d)!<<,XSVW(-RkhN/7^OO4-@\.b-\XnBFRsE=ihgkU3%e3-r=coUnje`UIM4h&/H%Ym@sgb!"^2^N<]t8XL)90V5;ti@9=GH^ANKZqDBoqf\"iD>A>`=nGN*'AV1[5([p(cMf?MXSNF6-XoJG%@Sp!"0lc2@L&'H4E?hqZrqPLa8qYg3It-##1AlTKDqD-4O/7[8C&pb%Pa%E&3d$=-6)RJKWiE(DGch#H!+LNGr8P\R'h0`:4IebFldi25[$dnmWN)<@\ogY2""ed47rm&,e#faSl)mTQ:?L`5!WW4VMh?Wa11GumL)`DAg=tAGmGX[er^jUN-722I)_GoMn)!Hlj$WV85p.9mJ>\//!!%P#=0GrO9V+@Lm58P%SDi]e!WW4.""cllJq>iX4u'$=n2%S!!!#[b3,CH:,%Wk_#pa14b!q&>LL[U>dU_LaR;f;?!!&\%\``^Cu2g-bXVa8!$DXTR1if5CrnBa:.\$nA]+$>]6ODW!9bO.aDuHIB"0fW1_c9&`s'BG$ig8-pkRp#R$3A**`NiBp?gTj+!)5M"q;Kha2a,3'EA+5j@aN61:!;Tj(W+;`dG%a=V9mH.Okc2#S?BHZY%H3/hRp;nGrUiF9#i-J,8CWKaB&\5Tt+7gc6q"@nc*T$`P"qQ/]mKKKfHpe&!75H8h;+2R4`]V>g+1:chAHS-%+N_BVl-FCDd?LK8^7jC-.f;*'=(mE!!)YFkic[^RV5k->[:W[1ULI$p.\Jng8PXKJ_/q(G9[H$O[aIXZ*K'cr!3H_2!2,B@77FJdfZ7)DXq(sNrUeQ7\X@lb(O!*7?G1Z).o90A9q)n;)_5e.!rr>b34ZT1CgL*jh\r1+^.+aWNYa?Tbg4TOX!%KD!;%(':JYSlChmfZp^(,hq"srL*^*\*o=eh]Rafhd8f;;RKTrQD]=)G&VVHQSZ*CR?ZZB_jVXSF,!!!#s+'D`Lbb=(op$5-D@2dDaDr/,eA]b^HXSr(moBA#F.4?c"IJ``?]=[ss]mCPH=>5!hi30lkWaWf"FmIUqd\KHi%NU#ni[(nCQ1_d)FJ3NT)!69N]'E~>endstream endobj -55 0 obj +56 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /Decode [ 0 1 ] /Filter [ /ASCII85Decode /FlateDecode ] /Height 523 /Length 102 /Subtype /Image /Type /XObject /Width 535 @@ -467,22 +475,12 @@ endobj stream Gb"0;0`_7S!5bE.WFlYNTE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz%La%hpV[~>endstream endobj -56 0 obj -<< -/Contents 139 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << -/FormXob.d3ecd28ca03f587d6940049748681018 3 0 R /FormXob.fc331aff86ff817ecac4c4ce4b2ecd3a 54 0 R ->> ->> /Rotate 0 /Trans << - ->> - /Type /Page ->> -endobj 57 0 obj << -/Contents 140 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 114 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/Contents 142 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.d3ecd28ca03f587d6940049748681018 3 0 R /FormXob.fc331aff86ff817ecac4c4ce4b2ecd3a 55 0 R +>> >> /Rotate 0 /Trans << >> @@ -491,302 +489,317 @@ endobj endobj 58 0 obj << -/Outlines 60 0 R /PageLabels 141 0 R /PageMode /UseNone /Pages 114 0 R /Type /Catalog +/Contents 143 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 116 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 59 0 obj << -/Author () /CreationDate (D:20260417205437-04'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260417205437-04'00') /Producer (ReportLab PDF Library - \(opensource\)) - /Subject (\(unspecified\)) /Title () /Trapped /False +/Outlines 61 0 R /PageLabels 144 0 R /PageMode /UseNone /Pages 116 0 R /Type /Catalog >> endobj 60 0 obj << -/Count 62 /First 61 0 R /Last 61 0 R /Type /Outlines +/Author () /CreationDate (D:20260418063437-04'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260418063437-04'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (\(unspecified\)) /Title () /Trapped /False >> endobj 61 0 obj << -/Count 52 /Dest [ 11 0 R /XYZ 57.02362 525.9477 0 ] /First 62 0 R /Last 113 0 R /Parent 60 0 R /Title (Lumbda) +/Count 63 /First 62 0 R /Last 62 0 R /Type /Outlines >> endobj 62 0 obj << -/Dest [ 11 0 R /XYZ 57.02362 346.4013 0 ] /Next 63 0 R /Parent 61 0 R /Title (Abstract) +/Count 53 /Dest [ 11 0 R /XYZ 57.02362 525.9477 0 ] /First 63 0 R /Last 115 0 R /Parent 61 0 R /Title (Lumbda) >> endobj 63 0 obj << -/Dest [ 12 0 R /XYZ 57.02362 303.0236 0 ] /Next 64 0 R /Parent 61 0 R /Prev 62 0 R /Title (1. The Problem: Interpreters That Cannot Feed Back) +/Dest [ 11 0 R /XYZ 57.02362 346.4013 0 ] /Next 64 0 R /Parent 62 0 R /Title (Abstract) >> endobj 64 0 obj << -/Count 2 /Dest [ 12 0 R /XYZ 57.02362 95.82362 0 ] /First 65 0 R /Last 66 0 R /Next 67 0 R /Parent 61 0 R - /Prev 63 0 R /Title (2. Architecture: One File, Two Evaluators) +/Dest [ 12 0 R /XYZ 57.02362 303.0236 0 ] /Next 65 0 R /Parent 62 0 R /Prev 63 0 R /Title (1. The Problem: Interpreters That Cannot Feed Back) >> endobj 65 0 obj << -/Dest [ 15 0 R /XYZ 57.02362 189.445 0 ] /Next 66 0 R /Parent 64 0 R /Title (2.1 Type System) +/Count 2 /Dest [ 12 0 R /XYZ 57.02362 95.82362 0 ] /First 66 0 R /Last 67 0 R /Next 68 0 R /Parent 62 0 R + /Prev 64 0 R /Title (2. Architecture: One File, Two Evaluators) >> endobj 66 0 obj << -/Dest [ 16 0 R /XYZ 57.02362 655.0236 0 ] /Parent 64 0 R /Prev 65 0 R /Title (2.2 The Bytecode) +/Dest [ 15 0 R /XYZ 57.02362 189.445 0 ] /Next 67 0 R /Parent 65 0 R /Title (2.1 Type System) >> endobj 67 0 obj << -/Dest [ 16 0 R /XYZ 57.02362 245.0236 0 ] /Next 68 0 R /Parent 61 0 R /Prev 64 0 R /Title (3. The Explicit Frame Stack) +/Dest [ 16 0 R /XYZ 57.02362 655.0236 0 ] /Parent 65 0 R /Prev 66 0 R /Title (2.2 The Bytecode) >> endobj 68 0 obj << -/Count 3 /Dest [ 17 0 R /XYZ 57.02362 566.6236 0 ] /First 69 0 R /Last 71 0 R /Next 72 0 R /Parent 61 0 R - /Prev 67 0 R /Title (4. Continuations: Feedback as a Data Structure) +/Dest [ 16 0 R /XYZ 57.02362 245.0236 0 ] /Next 69 0 R /Parent 62 0 R /Prev 65 0 R /Title (3. The Explicit Frame Stack) >> endobj 69 0 obj << -/Dest [ 17 0 R /XYZ 57.02362 159.0236 0 ] /Next 70 0 R /Parent 68 0 R /Title (4.1 Generators from Continuations) +/Count 3 /Dest [ 17 0 R /XYZ 57.02362 566.6236 0 ] /First 70 0 R /Last 72 0 R /Next 73 0 R /Parent 62 0 R + /Prev 68 0 R /Title (4. Continuations: Feedback as a Data Structure) >> endobj 70 0 obj << -/Dest [ 18 0 R /XYZ 57.02362 581.0236 0 ] /Next 71 0 R /Parent 68 0 R /Prev 69 0 R /Title (4.2 Why "Feedback Is All You Need") +/Dest [ 17 0 R /XYZ 57.02362 159.0236 0 ] /Next 71 0 R /Parent 69 0 R /Title (4.1 Generators from Continuations) >> endobj 71 0 obj << -/Dest [ 18 0 R /XYZ 57.02362 363.0236 0 ] /Parent 68 0 R /Prev 70 0 R /Title (4.3 Four Scopes of Feedback) +/Dest [ 18 0 R /XYZ 57.02362 581.0236 0 ] /Next 72 0 R /Parent 69 0 R /Prev 70 0 R /Title (4.2 Why "Feedback Is All You Need") >> endobj 72 0 obj << -/Count 3 /Dest [ 19 0 R /XYZ 57.02362 765.0236 0 ] /First 73 0 R /Last 75 0 R /Next 76 0 R /Parent 61 0 R - /Prev 68 0 R /Title (5. Optimizations) +/Dest [ 18 0 R /XYZ 57.02362 363.0236 0 ] /Parent 69 0 R /Prev 71 0 R /Title (4.3 Four Scopes of Feedback) >> endobj 73 0 obj << -/Dest [ 19 0 R /XYZ 57.02362 737.8236 0 ] /Next 74 0 R /Parent 72 0 R /Title (5.1 Peephole Optimizer) +/Count 3 /Dest [ 19 0 R /XYZ 57.02362 765.0236 0 ] /First 74 0 R /Last 76 0 R /Next 77 0 R /Parent 62 0 R + /Prev 69 0 R /Title (5. Optimizations) >> endobj 74 0 obj << -/Dest [ 19 0 R /XYZ 57.02362 591.8236 0 ] /Next 75 0 R /Parent 72 0 R /Prev 73 0 R /Title (5.2 Inline Cache) +/Dest [ 19 0 R /XYZ 57.02362 737.8236 0 ] /Next 75 0 R /Parent 73 0 R /Title (5.1 Peephole Optimizer) >> endobj 75 0 obj << -/Dest [ 19 0 R /XYZ 57.02362 391.8236 0 ] /Parent 72 0 R /Prev 74 0 R /Title (5.3 Constant Folding) +/Dest [ 19 0 R /XYZ 57.02362 591.8236 0 ] /Next 76 0 R /Parent 73 0 R /Prev 74 0 R /Title (5.2 Inline Cache) >> endobj 76 0 obj << -/Count 4 /Dest [ 19 0 R /XYZ 57.02362 231.8236 0 ] /First 77 0 R /Last 80 0 R /Next 81 0 R /Parent 61 0 R - /Prev 72 0 R /Title (6. Benchmarks: Three Evaluators vs CPython) +/Dest [ 19 0 R /XYZ 57.02362 391.8236 0 ] /Parent 73 0 R /Prev 75 0 R /Title (5.3 Constant Folding) >> endobj 77 0 obj << -/Dest [ 20 0 R /XYZ 57.02362 625.0236 0 ] /Next 78 0 R /Parent 76 0 R /Title (6.1 Raw Results) +/Count 5 /Dest [ 19 0 R /XYZ 57.02362 231.8236 0 ] /First 78 0 R /Last 82 0 R /Next 83 0 R /Parent 62 0 R + /Prev 73 0 R /Title (6. Benchmarks: Three Evaluators vs CPython) >> endobj 78 0 obj << -/Dest [ 20 0 R /XYZ 57.02362 359.0236 0 ] /Next 79 0 R /Parent 76 0 R /Prev 77 0 R /Title (6.2 Analysis) +/Dest [ 20 0 R /XYZ 57.02362 607.0236 0 ] /Next 79 0 R /Parent 77 0 R /Title (6.1 Raw Results) >> endobj 79 0 obj << -/Dest [ 20 0 R /XYZ 57.02362 153.0236 0 ] /Next 80 0 R /Parent 76 0 R /Prev 78 0 R /Title (6.3 What the Benchmarks Test) +/Dest [ 20 0 R /XYZ 57.02362 341.0236 0 ] /Next 80 0 R /Parent 77 0 R /Prev 78 0 R /Title (6.2 Analysis) >> endobj 80 0 obj << -/Dest [ 25 0 R /XYZ 57.02362 667.0236 0 ] /Parent 76 0 R /Prev 79 0 R /Title (6.4 Three Implementations Head-to-Head \(i5-8350U\)) +/Dest [ 20 0 R /XYZ 57.02362 135.0236 0 ] /Next 81 0 R /Parent 77 0 R /Prev 79 0 R /Title (6.3 What the Benchmarks Test) >> endobj 81 0 obj << -/Count 7 /Dest [ 27 0 R /XYZ 57.02362 711.0236 0 ] /First 82 0 R /Last 88 0 R /Next 89 0 R /Parent 61 0 R - /Prev 76 0 R /Title (7. Portal: Feedback Across Time) +/Dest [ 25 0 R /XYZ 57.02362 649.0236 0 ] /Next 82 0 R /Parent 77 0 R /Prev 80 0 R /Title (6.4 Three Implementations Head-to-Head \(i5-8350U\)) >> endobj 82 0 obj << -/Dest [ 27 0 R /XYZ 57.02362 507.8236 0 ] /Next 83 0 R /Parent 81 0 R /Title (7.1 S-Expression Portal \204 the Portable One) +/Dest [ 26 0 R /XYZ 57.02362 703.0236 0 ] /Parent 77 0 R /Prev 81 0 R /Title (6.5 Native Container Primitives: Moving Hot Loops Into Asm) >> endobj 83 0 obj << -/Dest [ 27 0 R /XYZ 57.02362 266.6236 0 ] /Next 84 0 R /Parent 81 0 R /Prev 82 0 R /Title (7.2 Cross-Implementation Exchange Matrix) +/Count 7 /Dest [ 26 0 R /XYZ 57.02362 259.0236 0 ] /First 84 0 R /Last 90 0 R /Next 91 0 R /Parent 62 0 R + /Prev 77 0 R /Title (7. Portal: Feedback Across Time) >> endobj 84 0 obj << -/Dest [ 28 0 R /XYZ 57.02362 765.0236 0 ] /Next 85 0 R /Parent 81 0 R /Prev 83 0 R /Title (7.3 JSON Portal \204 Graph-Aware, Continuation-Preserving) +/Dest [ 28 0 R /XYZ 57.02362 765.0236 0 ] /Next 85 0 R /Parent 83 0 R /Title (7.1 S-Expression Portal \204 the Portable One) >> endobj 85 0 obj << -/Dest [ 28 0 R /XYZ 57.02362 478.2236 0 ] /Next 86 0 R /Parent 81 0 R /Prev 84 0 R /Title (7.4 Binary Heap Dump \204 the Fast One) +/Dest [ 28 0 R /XYZ 57.02362 523.8236 0 ] /Next 86 0 R /Parent 83 0 R /Prev 84 0 R /Title (7.2 Cross-Implementation Exchange Matrix) >> endobj 86 0 obj << -/Dest [ 28 0 R /XYZ 57.02362 226.2236 0 ] /Next 87 0 R /Parent 81 0 R /Prev 85 0 R /Title (7.5 Cross-Process Benchmarks) +/Dest [ 28 0 R /XYZ 57.02362 323.8236 0 ] /Next 87 0 R /Parent 83 0 R /Prev 85 0 R /Title (7.3 JSON Portal \204 Graph-Aware, Continuation-Preserving) >> endobj 87 0 obj << -/Dest [ 29 0 R /XYZ 57.02362 601.0236 0 ] /Next 88 0 R /Parent 81 0 R /Prev 86 0 R /Title (7.6 Mismatch Cases: Graceful Degradation) +/Dest [ 29 0 R /XYZ 57.02362 739.0236 0 ] /Next 88 0 R /Parent 83 0 R /Prev 86 0 R /Title (7.4 Binary Heap Dump \204 the Fast One) >> endobj 88 0 obj << -/Dest [ 29 0 R /XYZ 57.02362 335.0236 0 ] /Parent 81 0 R /Prev 87 0 R /Title (7.7 Use Case: Distributed Primality Testing) +/Dest [ 29 0 R /XYZ 57.02362 487.0236 0 ] /Next 89 0 R /Parent 83 0 R /Prev 87 0 R /Title (7.5 Cross-Process Benchmarks) >> endobj 89 0 obj << -/Count 6 /Dest [ 29 0 R /XYZ 57.02362 134.2236 0 ] /First 90 0 R /Last 95 0 R /Next 96 0 R /Parent 61 0 R - /Prev 81 0 R /Title (8. The EML Universality Proof) +/Dest [ 29 0 R /XYZ 57.02362 173.0236 0 ] /Next 90 0 R /Parent 83 0 R /Prev 88 0 R /Title (7.6 Mismatch Cases: Graceful Degradation) >> endobj 90 0 obj << -/Dest [ 30 0 R /XYZ 57.02362 765.0236 0 ] /Next 91 0 R /Parent 89 0 R /Title (8.1 The Operator) +/Dest [ 30 0 R /XYZ 57.02362 601.0236 0 ] /Parent 83 0 R /Prev 89 0 R /Title (7.7 Use Case: Distributed Primality Testing) >> endobj 91 0 obj << -/Dest [ 30 0 R /XYZ 57.02362 688.2236 0 ] /Next 92 0 R /Parent 89 0 R /Prev 90 0 R /Title (8.2 Stage 1: Core Functions \(Depth 1--3\)) +/Count 6 /Dest [ 30 0 R /XYZ 57.02362 400.2236 0 ] /First 92 0 R /Last 97 0 R /Next 98 0 R /Parent 62 0 R + /Prev 83 0 R /Title (8. The EML Universality Proof) >> endobj 92 0 obj << -/Dest [ 30 0 R /XYZ 57.02362 568.2236 0 ] /Next 93 0 R /Parent 89 0 R /Prev 91 0 R /Title (8.3 Stage 2: Arithmetic) +/Dest [ 30 0 R /XYZ 57.02362 323.0236 0 ] /Next 93 0 R /Parent 91 0 R /Title (8.1 The Operator) >> endobj 93 0 obj << -/Dest [ 30 0 R /XYZ 57.02362 453.8236 0 ] /Next 94 0 R /Parent 89 0 R /Prev 92 0 R /Title (8.4 Stage 3: Complex Plane Access) +/Dest [ 30 0 R /XYZ 57.02362 246.2236 0 ] /Next 94 0 R /Parent 91 0 R /Prev 92 0 R /Title (8.2 Stage 1: Core Functions \(Depth 1--3\)) >> endobj 94 0 obj << -/Dest [ 30 0 R /XYZ 57.02362 345.8236 0 ] /Next 95 0 R /Parent 89 0 R /Prev 93 0 R /Title (8.5 Stage 4: Trigonometry via Euler) +/Dest [ 31 0 R /XYZ 57.02362 765.0236 0 ] /Next 95 0 R /Parent 91 0 R /Prev 93 0 R /Title (8.3 Stage 2: Arithmetic) >> endobj 95 0 obj << -/Dest [ 30 0 R /XYZ 57.02362 249.8236 0 ] /Parent 89 0 R /Prev 94 0 R /Title (8.6 Verification & Friction Analysis) +/Dest [ 31 0 R /XYZ 57.02362 650.6236 0 ] /Next 96 0 R /Parent 91 0 R /Prev 94 0 R /Title (8.4 Stage 3: Complex Plane Access) >> endobj 96 0 obj << -/Dest [ 32 0 R /XYZ 57.02362 567.0236 0 ] /Next 97 0 R /Parent 61 0 R /Prev 89 0 R /Title (9. Language Coverage) +/Dest [ 31 0 R /XYZ 57.02362 542.6236 0 ] /Next 97 0 R /Parent 91 0 R /Prev 95 0 R /Title (8.5 Stage 4: Trigonometry via Euler) >> endobj 97 0 obj << -/Dest [ 32 0 R /XYZ 57.02362 317.8236 0 ] /Next 98 0 R /Parent 61 0 R /Prev 96 0 R /Title (10. Relationship to Companion Papers) +/Dest [ 31 0 R /XYZ 57.02362 446.6236 0 ] /Parent 91 0 R /Prev 96 0 R /Title (8.6 Verification & Friction Analysis) >> endobj 98 0 obj << -/Count 6 /Dest [ 36 0 R /XYZ 57.02362 765.0236 0 ] /First 99 0 R /Last 104 0 R /Next 105 0 R /Parent 61 0 R - /Prev 97 0 R /Title (11. Four Implementation Tiers, One Language) +/Dest [ 34 0 R /XYZ 57.02362 765.0236 0 ] /Next 99 0 R /Parent 62 0 R /Prev 91 0 R /Title (9. Language Coverage) >> endobj 99 0 obj << -/Dest [ 38 0 R /XYZ 57.02362 118.41 0 ] /Next 100 0 R /Parent 98 0 R /Title (11.1 Test Coverage) +/Dest [ 34 0 R /XYZ 57.02362 515.8236 0 ] /Next 100 0 R /Parent 62 0 R /Prev 98 0 R /Title (10. Relationship to Companion Papers) >> endobj 100 0 obj << -/Dest [ 39 0 R /XYZ 57.02362 613.0236 0 ] /Next 101 0 R /Parent 98 0 R /Prev 99 0 R /Title (11.2 File I/O Parity) +/Count 6 /Dest [ 34 0 R /XYZ 57.02362 266.6236 0 ] /First 101 0 R /Last 106 0 R /Next 107 0 R /Parent 62 0 R + /Prev 99 0 R /Title (11. Four Implementation Tiers, One Language) >> endobj 101 0 obj << -/Dest [ 39 0 R /XYZ 57.02362 305.0236 0 ] /Next 102 0 R /Parent 98 0 R /Prev 100 0 R /Title (11.3 Sockets: One HTTP Server, Three Runtimes) +/Dest [ 39 0 R /XYZ 57.02362 313.0236 0 ] /Next 102 0 R /Parent 100 0 R /Title (11.1 Test Coverage) >> endobj 102 0 obj << -/Dest [ 42 0 R /XYZ 57.02362 332.4202 0 ] /Next 103 0 R /Parent 98 0 R /Prev 101 0 R /Title (11.4 S-expressions over Sockets: RPC, REPL, and Chains) +/Dest [ 39 0 R /XYZ 57.02362 107.0236 0 ] /Next 103 0 R /Parent 100 0 R /Prev 101 0 R /Title (11.2 File I/O Parity) >> endobj 103 0 obj << -/Dest [ 43 0 R /XYZ 57.02362 481.0236 0 ] /Next 104 0 R /Parent 98 0 R /Prev 102 0 R /Title (11.5 Portal over HTTP: State Transfer Between Machines) +/Dest [ 40 0 R /XYZ 57.02362 505.0236 0 ] /Next 104 0 R /Parent 100 0 R /Prev 102 0 R /Title (11.3 Sockets: One HTTP Server, Three Runtimes) >> endobj 104 0 obj << -/Dest [ 46 0 R /XYZ 57.02362 637.0236 0 ] /Parent 98 0 R /Prev 103 0 R /Title (11.6 heap-snapshot: The Arena Escape Hatch) +/Dest [ 43 0 R /XYZ 57.02362 540.4202 0 ] /Next 105 0 R /Parent 100 0 R /Prev 103 0 R /Title (11.4 S-expressions over Sockets: RPC, REPL, and Chains) >> endobj 105 0 obj << -/Count 3 /Dest [ 46 0 R /XYZ 57.02362 289.4236 0 ] /First 106 0 R /Last 108 0 R /Next 109 0 R /Parent 61 0 R - /Prev 98 0 R /Title (12. MOAD Audit: Fixing What We Built) +/Dest [ 44 0 R /XYZ 57.02362 685.0236 0 ] /Next 106 0 R /Parent 100 0 R /Prev 104 0 R /Title (11.5 Portal over HTTP: State Transfer Between Machines) >> endobj 106 0 obj << -/Dest [ 47 0 R /XYZ 57.02362 703.0236 0 ] /Next 107 0 R /Parent 105 0 R /Title (12.1 MOAD-0001: The Sedimentary Defect in Our Own Code) +/Dest [ 44 0 R /XYZ 57.02362 136.6236 0 ] /Parent 100 0 R /Prev 105 0 R /Title (11.6 heap-snapshot: The Arena Escape Hatch) >> endobj 107 0 obj << -/Dest [ 47 0 R /XYZ 57.02362 94.22362 0 ] /Next 108 0 R /Parent 105 0 R /Prev 106 0 R /Title (12.2 MOAD-0002: The Intertangle in Our Own Design) +/Count 3 /Dest [ 47 0 R /XYZ 57.02362 497.4236 0 ] /First 108 0 R /Last 110 0 R /Next 111 0 R /Parent 62 0 R + /Prev 100 0 R /Title (12. MOAD Audit: Fixing What We Built) >> endobj 108 0 obj << -/Dest [ 48 0 R /XYZ 57.02362 559.0236 0 ] /Parent 105 0 R /Prev 107 0 R /Title (12.3 Our Shared Infrastructure) +/Dest [ 47 0 R /XYZ 57.02362 210.2236 0 ] /Next 109 0 R /Parent 107 0 R /Title (12.1 MOAD-0001: The Sedimentary Defect in Our Own Code) >> endobj 109 0 obj << -/Dest [ 48 0 R /XYZ 57.02362 367.0236 0 ] /Next 110 0 R /Parent 61 0 R /Prev 105 0 R /Title (13. Future Work) +/Dest [ 48 0 R /XYZ 57.02362 284.2236 0 ] /Next 110 0 R /Parent 107 0 R /Prev 108 0 R /Title (12.2 MOAD-0002: The Intertangle in Our Own Design) >> endobj 110 0 obj << -/Dest [ 48 0 R /XYZ 57.02362 111.8236 0 ] /Next 111 0 R /Parent 61 0 R /Prev 109 0 R /Title (14. The Defect in the Model) +/Dest [ 51 0 R /XYZ 57.02362 715.0236 0 ] /Parent 107 0 R /Prev 109 0 R /Title (12.3 Our Shared Infrastructure) >> endobj 111 0 obj << -/Dest [ 53 0 R /XYZ 57.02362 135.0236 0 ] /Next 112 0 R /Parent 61 0 R /Prev 110 0 R /Title (Citation) +/Dest [ 51 0 R /XYZ 57.02362 523.0236 0 ] /Next 112 0 R /Parent 62 0 R /Prev 107 0 R /Title (13. Future Work) >> endobj 112 0 obj << -/Dest [ 56 0 R /XYZ 57.02362 765.0236 0 ] /Next 113 0 R /Parent 61 0 R /Prev 111 0 R /Title (References) +/Dest [ 51 0 R /XYZ 57.02362 267.8236 0 ] /Next 113 0 R /Parent 62 0 R /Prev 111 0 R /Title (14. The Defect in the Model) >> endobj 113 0 obj << -/Dest [ 56 0 R /XYZ 57.02362 683.8236 0 ] /Parent 61 0 R /Prev 112 0 R /Title (License) +/Dest [ 54 0 R /XYZ 57.02362 297.0236 0 ] /Next 114 0 R /Parent 62 0 R /Prev 112 0 R /Title (Citation) >> endobj 114 0 obj << -/Count 26 /Kids [ 11 0 R 12 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 25 0 R 27 0 R - 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 36 0 R 38 0 R 39 0 R 42 0 R 43 0 R - 46 0 R 47 0 R 48 0 R 53 0 R 56 0 R 57 0 R ] /Type /Pages +/Dest [ 54 0 R /XYZ 57.02362 215.8236 0 ] /Next 115 0 R /Parent 62 0 R /Prev 113 0 R /Title (References) >> endobj 115 0 obj << +/Dest [ 54 0 R /XYZ 57.02362 134.6236 0 ] /Parent 62 0 R /Prev 114 0 R /Title (License) +>> +endobj +116 0 obj +<< +/Count 27 /Kids [ 11 0 R 12 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 25 0 R 26 0 R + 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 34 0 R 38 0 R 39 0 R 40 0 R 43 0 R + 44 0 R 47 0 R 48 0 R 51 0 R 54 0 R 57 0 R 58 0 R ] /Type /Pages +>> +endobj +117 0 obj +<< /Length 5064 >> stream @@ -966,7 +979,7 @@ Q endstream endobj -116 0 obj +118 0 obj << /Length 7579 >> @@ -1076,7 +1089,7 @@ Q endstream endobj -117 0 obj +119 0 obj << /Length 5277 >> @@ -1280,7 +1293,7 @@ Q endstream endobj -118 0 obj +120 0 obj << /Length 6896 >> @@ -1596,7 +1609,7 @@ Q endstream endobj -119 0 obj +121 0 obj << /Length 8468 >> @@ -2076,7 +2089,7 @@ Q endstream endobj -120 0 obj +122 0 obj << /Length 9062 >> @@ -2518,9 +2531,9 @@ Q endstream endobj -121 0 obj +123 0 obj << -/Length 9133 +/Length 9151 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET @@ -2916,7 +2929,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (\2477.2 Cross-impl portal matrix: ) Tj /F5 10 Tf (make) Tj ( ) Tj (bench-portal-cross) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (\2476.5 asm native hash-set vs portable Scheme hash-set: ) Tj /F5 10 Tf (make) Tj ( ) Tj (bench-hashset) Tj T* ET Q Q q @@ -2929,9 +2942,9 @@ Q endstream endobj -122 0 obj +124 0 obj << -/Length 12867 +/Length 12847 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET @@ -2950,7 +2963,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (\2477.5 Portal save+load timings: ) Tj /F5 10 Tf (make) Tj ( ) Tj (bench-portal) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (\2477.2 Cross-impl portal matrix: ) Tj /F5 10 Tf (make) Tj ( ) Tj (bench-portal-cross) Tj T* ET Q Q q @@ -2975,7 +2988,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (\24711.3 HTTP server vs busybox / python http.server: ) Tj /F5 10 Tf (make) Tj ( ) Tj (bench-web) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (\2477.5 Portal save+load timings: ) Tj /F5 10 Tf (make) Tj ( ) Tj (bench-portal) Tj T* ET Q Q q @@ -3000,7 +3013,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (\24711.4 RPC chain \(Py ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( C relay ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( asm\): ) Tj /F5 10 Tf (make) Tj ( ) Tj (bench-rpc-chain) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (\24711.3 HTTP server vs busybox / python http.server: ) Tj /F5 10 Tf (make) Tj ( ) Tj (bench-web) Tj T* ET Q Q q @@ -3025,6 +3038,31 @@ Q q 1 0 0 1 23 -3 cm q +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (\24711.4 RPC chain \(Py ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( C relay ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( asm\): ) Tj /F5 10 Tf (make) Tj ( ) Tj (bench-rpc-chain) Tj T* ET +Q +Q +q +Q +Q +Q +q +1 0 0 1 57.02362 693.0236 cm +Q +q +1 0 0 1 57.02362 681.0236 cm +q +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 -3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL 8 0 Td (\177) Tj T* -8 0 Td ET +Q +Q +q +1 0 0 1 23 -3 cm +q BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Run everything: ) Tj /F5 10 Tf (make) Tj ( ) Tj (bench-all) Tj T* ET Q Q @@ -3033,25 +3071,25 @@ Q Q Q q -1 0 0 1 57.02362 681.0236 cm +1 0 0 1 57.02362 663.0236 cm Q q -1 0 0 1 57.02362 639.0236 cm +1 0 0 1 57.02362 621.0236 cm q BT 1 0 0 1 0 26 Tm .215522 Tw 12 TL /F1 10 Tf 0 0 0 rg (Each target's script lives under ) Tj /F5 10 Tf (tests/) Tj /F1 10 Tf ( and uses the six-layer safety envelope from ) Tj /F5 10 Tf (CLAUDE.md) Tj /F1 10 Tf ( \() Tj /F5 10 Tf (set) Tj ( ) Tj (-e) Tj /F1 10 Tf ( +) Tj T* 0 Tw .46213 Tw /F5 10 Tf (ulimit) Tj ( ) Tj (-v) Tj /F1 10 Tf ( kernel cap + ) Tj /F5 10 Tf (trap) Tj /F1 10 Tf ( on EXIT + ) Tj /F5 10 Tf (timeout) Tj /F1 10 Tf ( + explicit kill + ) Tj /F5 10 Tf (pgrep) Tj /F1 10 Tf ( straggler check\). No benchmark) Tj T* 0 Tw (leaves background processes alive.) Tj T* ET Q Q q -1 0 0 1 57.02362 613.0236 cm +1 0 0 1 57.02362 595.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (6.1 Raw Results) Tj T* ET Q Q q -1 0 0 1 57.02362 601.0236 cm +1 0 0 1 57.02362 583.0236 cm Q q -1 0 0 1 57.02362 403.0236 cm +1 0 0 1 57.02362 385.0236 cm q 1 1 1 rg n 0 198 481.2283 -18 re f* @@ -3491,79 +3529,54 @@ Q Q Q q -1 0 0 1 57.02362 403.0236 cm +1 0 0 1 57.02362 385.0236 cm Q q -1 0 0 1 57.02362 373.0236 cm +1 0 0 1 57.02362 355.0236 cm q BT 1 0 0 1 0 14 Tm 1.31189 Tw 12 TL /F3 10 Tf 0 0 0 rg (BC Speedup) Tj /F1 10 Tf ( = interpreter time / bytecode time. This measures the gain from compilation within Lumbda) Tj T* 0 Tw (itself.) Tj T* ET Q Q q -1 0 0 1 57.02362 347.0236 cm +1 0 0 1 57.02362 329.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (6.2 Analysis) Tj T* ET Q Q q -1 0 0 1 57.02362 293.0236 cm +1 0 0 1 57.02362 275.0236 cm q BT 1 0 0 1 0 38 Tm 2.646027 Tw 12 TL /F1 10 Tf 0 0 0 rg (The bytecode compiler delivers ) Tj /F3 10 Tf (7--12x speedups) Tj /F1 10 Tf ( on recursive & iterative workloads compared to the) Tj T* 0 Tw .139168 Tw (tree-walking interpreter. The largest gains appear in tight loops \() Tj /F5 10 Tf (sum-to) Tj /F1 10 Tf (: 11.4x\) & deep recursion \() Tj /F5 10 Tf (fib\(20\)) Tj /F1 10 Tf T* 0 Tw .224882 Tw (tree: 9.2x, ) Tj /F5 10 Tf (mergesort) Tj /F1 10 Tf (: 11.0x\), where the explicit frame stack & specialized opcodes eliminate the overhead) Tj T* 0 Tw (of AST traversal.) Tj T* ET Q Q q -1 0 0 1 57.02362 263.0236 cm +1 0 0 1 57.02362 245.0236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.762025 Tw (Hash table operations show a smaller speedup \(1.6x\) because the bottleneck sits in Python's dictionary) Tj T* 0 Tw (operations, not in Scheme evaluation overhead.) Tj T* ET Q Q q -1 0 0 1 57.02362 209.0236 cm +1 0 0 1 57.02362 191.0236 cm q BT 1 0 0 1 0 38 Tm 1.224168 Tw 12 TL /F1 10 Tf 0 0 0 rg (CPython remains 50--150x faster than the bytecode VM on most benchmarks. This is expected: CPython) Tj T* 0 Tw .86402 Tw (compiles to native bytecode with a C runtime, while Lumbda's bytecode VM is itself written in Python. The) Tj T* 0 Tw -0.007975 Tw (comparison establishes that Lumbda pays a known, bounded overhead for running a complete Scheme \(with) Tj T* 0 Tw (full ) Tj /F5 10 Tf (call/cc) Tj /F1 10 Tf (, exact rationals, & hygienic macros\) inside a host language.) Tj T* ET Q Q q -1 0 0 1 57.02362 167.0236 cm +1 0 0 1 57.02362 149.0236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 2.429873 Tw (The important comparison is not Lumbda vs CPython \(different languages\), but Lumbda interpreter vs) Tj T* 0 Tw 1.254395 Tw (Lumbda bytecode \(same language, same semantics, different execution strategy\). The bytecode compiler) Tj T* 0 Tw (proves that feedback-based architecture does not preclude efficient execution.) Tj T* ET Q Q q -1 0 0 1 57.02362 141.0236 cm +1 0 0 1 57.02362 123.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (6.3 What the Benchmarks Test) Tj T* ET Q Q q -1 0 0 1 57.02362 129.0236 cm -Q -q -1 0 0 1 57.02362 129.0236 cm -Q -q -1 0 0 1 57.02362 117.0236 cm -q -0 0 0 rg -BT /F1 10 Tf 12 TL ET -q -1 0 0 1 6 -3 cm -q -0 0 0 rg -BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL 8 0 Td (\177) Tj T* -8 0 Td ET -Q -Q -q -1 0 0 1 23 -3 cm -q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (fib\(35\) iterative) Tj /F1 10 Tf (: Named-let tail recursion. Tests ) Tj /F5 10 Tf (OP_TAIL_CALL) Tj /F1 10 Tf ( & ) Tj /F5 10 Tf (OP_ADD1) Tj T* ET -Q -Q -q -Q -Q +1 0 0 1 57.02362 111.0236 cm Q q 1 0 0 1 57.02362 111.0236 cm @@ -3583,7 +3596,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (fib\(20\) tree-recursive) Tj /F1 10 Tf (: Exponential call tree. Tests ) Tj /F5 10 Tf (OP_CALL) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (OP_RETURN) Tj /F1 10 Tf ( throughput) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (fib\(35\) iterative) Tj /F1 10 Tf (: Named-let tail recursion. Tests ) Tj /F5 10 Tf (OP_TAIL_CALL) Tj /F1 10 Tf ( & ) Tj /F5 10 Tf (OP_ADD1) Tj T* ET Q Q q @@ -3608,7 +3621,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (tak\(15,10,6\)) Tj /F1 10 Tf (: Takeuchi function. Deep mutual recursion with 3 arguments) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (fib\(20\) tree-recursive) Tj /F1 10 Tf (: Exponential call tree. Tests ) Tj /F5 10 Tf (OP_CALL) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (OP_RETURN) Tj /F1 10 Tf ( throughput) Tj T* ET Q Q q @@ -3633,7 +3646,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (sum-to\(50000\)) Tj /F1 10 Tf (: 50,000 tail-recursive iterations. Tests frame stack performance at scale) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (tak\(15,10,6\)) Tj /F1 10 Tf (: Takeuchi function. Deep mutual recursion with 3 arguments) Tj T* ET Q Q q @@ -3646,9 +3659,9 @@ Q endstream endobj -123 0 obj +125 0 obj << -/Length 9476 +/Length 9725 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET @@ -3667,7 +3680,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (ackermann\(3,4\)) Tj /F1 10 Tf (: Deeply nested recursion \(125 result, many thousands of calls\)) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (sum-to\(50000\)) Tj /F1 10 Tf (: 50,000 tail-recursive iterations. Tests frame stack performance at scale) Tj T* ET Q Q q @@ -3692,7 +3705,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (list ops) Tj /F1 10 Tf (: ) Tj /F5 10 Tf (iota) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (reverse) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (filter) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (map) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (fold-left) Tj /F1 10 Tf ( chain on 5,000 elements) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (ackermann\(3,4\)) Tj /F1 10 Tf (: Deeply nested recursion \(125 result, many thousands of calls\)) Tj T* ET Q Q q @@ -3717,7 +3730,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (mergesort) Tj /F1 10 Tf (: Recursive divide-and-conquer on 200 elements. Tests ) Tj /F5 10 Tf (cons) Tj /F1 10 Tf ( allocation throughput) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (list ops) Tj /F1 10 Tf (: ) Tj /F5 10 Tf (iota) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (reverse) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (filter) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (map) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (fold-left) Tj /F1 10 Tf ( chain on 5,000 elements) Tj T* ET Q Q q @@ -3742,6 +3755,31 @@ Q q 1 0 0 1 23 -3 cm q +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (mergesort) Tj /F1 10 Tf (: Recursive divide-and-conquer on 200 elements. Tests ) Tj /F5 10 Tf (cons) Tj /F1 10 Tf ( allocation throughput) Tj T* ET +Q +Q +q +Q +Q +Q +q +1 0 0 1 57.02362 693.0236 cm +Q +q +1 0 0 1 57.02362 681.0236 cm +q +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 -3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL 8 0 Td (\177) Tj T* -8 0 Td ET +Q +Q +q +1 0 0 1 23 -3 cm +q BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (hash-table) Tj /F1 10 Tf (: 1,000 ) Tj /F5 10 Tf (set!) Tj /F1 10 Tf ( + ) Tj /F5 10 Tf (ref) Tj /F1 10 Tf ( operations. Tests Python dict interop overhead) Tj T* ET Q Q @@ -3750,25 +3788,25 @@ Q Q Q q -1 0 0 1 57.02362 681.0236 cm +1 0 0 1 57.02362 663.0236 cm Q q -1 0 0 1 57.02362 655.0236 cm +1 0 0 1 57.02362 637.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (6.4 Three Implementations Head-to-Head \(i5-8350U\)) Tj T* ET Q Q q -1 0 0 1 57.02362 601.0236 cm +1 0 0 1 57.02362 583.0236 cm q BT 1 0 0 1 0 38 Tm 3.147362 Tw 12 TL /F1 10 Tf 0 0 0 rg (Same hardware, same workloads, in-process timing via ) Tj /F5 10 Tf (current-time-ms) Tj /F1 10 Tf (. Best of two runs. Each) Tj T* 0 Tw 1.886027 Tw (implementation is run in its high-performance configuration: Python with ) Tj /F5 10 Tf (--fast) Tj /F1 10 Tf ( \(bytecode VM\), C with) Tj T* 0 Tw .85402 Tw /F5 10 Tf (--fast) Tj /F1 10 Tf ( \(bytecode VM, also its mode for deep recursion\), asm in its native tree-walker mode \(asm has no) Tj T* 0 Tw (bytecode layer \227 it doesn't need one\).) Tj T* ET Q Q q -1 0 0 1 57.02362 595.0236 cm +1 0 0 1 57.02362 577.0236 cm Q q -1 0 0 1 57.02362 523.0236 cm +1 0 0 1 57.02362 505.0236 cm q 1 1 1 rg n 0 72 481.2283 -18 re f* @@ -3913,20 +3951,20 @@ Q Q Q q -1 0 0 1 57.02362 523.0236 cm +1 0 0 1 57.02362 505.0236 cm Q q -1 0 0 1 57.02362 505.0236 cm +1 0 0 1 57.02362 487.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (\(C fast is the fastest cell in every row \227 best of the three on this hardware.\)) Tj T* ET Q Q q -1 0 0 1 57.02362 497.0236 cm +1 0 0 1 57.02362 479.0236 cm Q q -1 0 0 1 57.02362 427.978 cm +1 0 0 1 57.02362 409.978 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -3949,13 +3987,13 @@ Q Q Q q -1 0 0 1 57.02362 419.978 cm +1 0 0 1 57.02362 401.978 cm Q q -1 0 0 1 57.02362 411.978 cm +1 0 0 1 57.02362 393.978 cm Q q -1 0 0 1 57.02362 343.6092 cm +1 0 0 1 57.02362 325.6092 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -3978,64 +4016,258 @@ Q Q Q q -1 0 0 1 57.02362 335.6092 cm +1 0 0 1 57.02362 317.6092 cm Q q -1 0 0 1 57.02362 305.6092 cm +1 0 0 1 57.02362 287.6092 cm q BT 1 0 0 1 0 14 Tm 3.825835 Tw 12 TL /F3 10 Tf 0 0 0 rg (Reproduce:) Tj /F1 10 Tf ( ) Tj /F5 10 Tf (make) Tj ( ) Tj (bench-3way) Tj /F1 10 Tf ( \(source: ) Tj /F5 10 Tf (tests/bench-3way.sh) Tj /F1 10 Tf (\). Prints the same table on your) Tj T* 0 Tw (hardware with best-of-two timings.) Tj T* ET Q Q q -1 0 0 1 57.02362 239.6092 cm +1 0 0 1 57.02362 221.6092 cm q BT 1 0 0 1 0 50 Tm .013432 Tw 12 TL /F1 10 Tf 0 0 0 rg (C wins every workload on this hardware. Its bytecode compiler + explicit frame stack \(and optional ) Tj /F5 10 Tf (--jit) Tj /F1 10 Tf ( for) Tj T* 0 Tw .885223 Tw (pattern-matched call forms\) gives a ~3\327 margin over asm on tail-recursive loops and deep recursion alike.) Tj T* 0 Tw 1.958241 Tw (asm's tree-walker is the narrowest Scheme of the three \227 no bytecode layer, no JIT \227 but still beats) Tj T* 0 Tw .566147 Tw (Python's bytecode VM by ~7\2268\327 because it pays no Python overhead \(no dict lookups, no object allocation) Tj T* 0 Tw (per VM op, no interpreter dispatch thunk\).) Tj T* ET Q Q q -1 0 0 1 57.02362 137.6092 cm +1 0 0 1 57.02362 119.6092 cm q BT 1 0 0 1 0 86 Tm 3.940642 Tw 12 TL /F3 10 Tf 0 0 0 rg (None of the three segfault on ackermann in their recommended mode.) Tj /F1 10 Tf ( Python ) Tj /F5 10 Tf (--fast) Tj /F1 10 Tf ( uses) Tj T* 0 Tw 2.150596 Tw /F5 10 Tf (OP_TAIL_CALL) Tj /F1 10 Tf ( with explicit frames. C ) Tj /F5 10 Tf (--fast) Tj /F1 10 Tf ( uses its bytecode VM, also with explicit frames. asm's) Tj T* 0 Tw 1.025522 Tw /F5 10 Tf (jmp) Tj /F1 10 Tf (-based TCO reuses the same host stack slot for tail calls. Only C's ) Tj /F5 10 Tf (default) Tj /F1 10 Tf ( tree-walker mode would) Tj T* 0 Tw -0.110555 Tw (exhaust the host C stack on deep recursion \227 by design; it uses the C call stack for each Scheme call. Either) Tj T* 0 Tw -0.056353 Tw (pass ) Tj /F5 10 Tf (-f) Tj /F1 10 Tf (/) Tj /F5 10 Tf (--fast) Tj /F1 10 Tf ( or ) Tj /F5 10 Tf (ulimit) Tj ( ) Tj (-s) Tj ( ) Tj (unlimited) Tj /F1 10 Tf ( when using the C tree-walker on deeply recursive code. The C) Tj T* 0 Tw -0.045877 Tw (binary's help text spells this out explicitly. \(A future refactor could spawn a worker pthread with a 64 MB stack) Tj T* 0 Tw 3.438556 Tw (and run eval there, making the tree-walker safe under any configuration \227 tracked as an optional) Tj T* 0 Tw (improvement, low priority given ) Tj /F5 10 Tf (--fast) Tj /F1 10 Tf ( is strictly faster anyway.\)) Tj T* ET Q Q q -1 0 0 1 57.02362 71.60924 cm +1 0 0 1 57.02362 65.60924 cm q -BT 1 0 0 1 0 50 Tm 1.376027 Tw 12 TL /F3 10 Tf 0 0 0 rg (asm's remaining bottleneck is allocation, not lookup.) Tj /F1 10 Tf ( Profiling ) Tj /F5 10 Tf (sum-to\(1M\)) Tj /F1 10 Tf ( shows ~170 MB RSS \227) Tj T* 0 Tw .036147 Tw (each tail call through ) Tj /F5 10 Tf (apply_closure) Tj /F1 10 Tf ( + ) Tj /F5 10 Tf (env_define) Tj /F1 10 Tf ( allocates 24 bytes per parameter \(sym / val / parent\),) Tj T* 0 Tw -0.083038 Tw (twice per ) Tj /F5 10 Tf (loop) Tj /F1 10 Tf ( iteration, for 48 MB total before the three ) Tj /F5 10 Tf (heap_grow) Tj /F1 10 Tf ( events that follow. A future optimization) Tj T* 0 Tw .258138 Tw (candidate is per-frame batched allocation \() Tj /F5 10 Tf (8) Tj ( ) Tj (+) Tj ( ) Tj (16N) Tj /F1 10 Tf ( bytes once per call instead of ) Tj /F5 10 Tf (24N) Tj /F1 10 Tf (\), or env-cell in-place) Tj T* 0 Tw .198241 Tw (reuse for self-tail-calls. An inline cache for env lookups \(ported from Python's VM\) turns out to help less than) Tj T* 0 Tw ET +BT 1 0 0 1 0 38 Tm 1.376027 Tw 12 TL /F3 10 Tf 0 0 0 rg (asm's remaining bottleneck is allocation, not lookup.) Tj /F1 10 Tf ( Profiling ) Tj /F5 10 Tf (sum-to\(1M\)) Tj /F1 10 Tf ( shows ~170 MB RSS \227) Tj T* 0 Tw .036147 Tw (each tail call through ) Tj /F5 10 Tf (apply_closure) Tj /F1 10 Tf ( + ) Tj /F5 10 Tf (env_define) Tj /F1 10 Tf ( allocates 24 bytes per parameter \(sym / val / parent\),) Tj T* 0 Tw -0.083038 Tw (twice per ) Tj /F5 10 Tf (loop) Tj /F1 10 Tf ( iteration, for 48 MB total before the three ) Tj /F5 10 Tf (heap_grow) Tj /F1 10 Tf ( events that follow. A future optimization) Tj T* 0 Tw .258138 Tw (candidate is per-frame batched allocation \() Tj /F5 10 Tf (8) Tj ( ) Tj (+) Tj ( ) Tj (16N) Tj /F1 10 Tf ( bytes once per call instead of ) Tj /F5 10 Tf (24N) Tj /F1 10 Tf (\), or env-cell in-place) Tj T* 0 Tw ET Q Q endstream endobj -124 0 obj +126 0 obj << -/Length 10083 +/Length 10836 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 729.0236 cm +1 0 0 1 57.02362 717.0236 cm q -BT 1 0 0 1 0 26 Tm 1.679272 Tw 12 TL /F1 10 Tf 0 0 0 rg (anticipated because asm's env chains are typically only 2 deep and each step is a pointer dereference;) Tj T* 0 Tw .173917 Tw (measured upper bound is ~5%. The ~3\327 gap to C is mostly the absence of a bytecode layer and the per-call) Tj T* 0 Tw (env allocation \227 not a lookup-path problem.) Tj T* ET +BT 1 0 0 1 0 38 Tm .198241 Tw 12 TL /F1 10 Tf 0 0 0 rg (reuse for self-tail-calls. An inline cache for env lookups \(ported from Python's VM\) turns out to help less than) Tj T* 0 Tw 1.679272 Tw (anticipated because asm's env chains are typically only 2 deep and each step is a pointer dereference;) Tj T* 0 Tw .173917 Tw (measured upper bound is ~5%. The ~3\327 gap to C is mostly the absence of a bytecode layer and the per-call) Tj T* 0 Tw (env allocation \227 not a lookup-path problem.) Tj T* ET Q Q q -1 0 0 1 57.02362 697.8236 cm +1 0 0 1 57.02362 691.0236 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (6.5 Native Container Primitives: Moving Hot Loops Into Asm) Tj T* ET +Q +Q +q +1 0 0 1 57.02362 625.0236 cm +q +BT 1 0 0 1 0 50 Tm .721147 Tw 12 TL /F1 10 Tf 0 0 0 rg (The proof-netspace server \(\2477\) needs a hash-set to dedupe proof hashes. asm had no native hash-set, so) Tj T* 0 Tw .241019 Tw (d88149a shipped a portable one in Lumbda itself: a fixed-size vector of alists, with the bucket walk written in) Tj T* 0 Tw .202397 Tw (Scheme. It works in every tier and matches the usual chained-hash-table algorithm. But the entire inner loop) Tj T* 0 Tw 2.469417 Tw (\227 ) Tj /F5 10 Tf (modulo) Tj /F1 10 Tf ( for bucket index, ) Tj /F5 10 Tf (car) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (cdr) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (=) Tj /F1 10 Tf ( to walk the chain, ) Tj /F5 10 Tf (cons) Tj /F1 10 Tf ( to insert \227 runs through asm's) Tj T* 0 Tw (tree-walker, one Scheme AST node at a time.) Tj T* ET +Q +Q +q +1 0 0 1 57.02362 571.0236 cm +q +BT 1 0 0 1 0 38 Tm 1.109882 Tw 12 TL /F1 10 Tf 0 0 0 rg (A native hash-set moves the same algorithm into asm: ) Tj /F5 10 Tf (bi_hash_set_add) Tj /F1 10 Tf ( is one ) Tj /F5 10 Tf (hash_value) Tj /F1 10 Tf ( call, one) Tj T* 0 Tw .366556 Tw /F5 10 Tf (AND) Tj /F1 10 Tf ( mask, one bucket-slot load, one ) Tj /F5 10 Tf (hs_chain_find) Tj /F1 10 Tf ( loop over raw tagged pairs, and one ) Tj /F5 10 Tf (make_pair) Tj /F1 10 Tf ( on) Tj T* 0 Tw 3.403223 Tw (miss. No environment lookups, no frame allocation, no tree-walk dispatch \227 the entire hot path is) Tj T* 0 Tw (straight-line machine code.) Tj T* ET +Q +Q +q +1 0 0 1 57.02362 565.0236 cm +Q +q +1 0 0 1 57.02362 493.0236 cm +q +1 1 1 rg +n 0 72 481.2283 -18 re f* +.878431 .878431 .878431 rg +n 0 54 481.2283 -18 re f* +1 1 1 rg +n 0 36 481.2283 -18 re f* +.878431 .878431 .878431 rg +n 0 18 481.2283 -18 re f* +0 0 0 rg +BT /F3 10 Tf 12 TL ET +q +1 0 0 1 6 57 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 11.66654 0 Td (Phase \(N=5,000 integers\)) Tj T* -11.66654 0 Td ET +Q +Q +q +1 0 0 1 159.9931 57 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 15.26512 0 Td (portable \(ms\)) Tj T* -15.26512 0 Td ET +Q +Q +q +1 0 0 1 265.8633 57 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 20.54012 0 Td (native \(ms\)) Tj T* -20.54012 0 Td ET +Q +Q +q +1 0 0 1 371.7335 57 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 30.6324 0 Td (Speedup) Tj T* -30.6324 0 Td ET +Q +Q +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 39 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (insert-N) Tj T* ET +Q +Q +q +1 0 0 1 159.9931 39 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (129) Tj T* ET +Q +Q +q +1 0 0 1 265.8633 39 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (6) Tj T* ET +Q +Q +q +1 0 0 1 371.7335 39 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (21\327) Tj T* ET +Q +Q +q +1 0 0 1 6 21 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (hit-lookup-N) Tj T* ET +Q +Q +q +1 0 0 1 159.9931 21 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (124) Tj T* ET +Q +Q +q +1 0 0 1 265.8633 21 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (8) Tj T* ET +Q +Q +q +1 0 0 1 371.7335 21 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (15\327) Tj T* ET +Q +Q +q +1 0 0 1 6 3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (miss-lookup-N) Tj T* ET +Q +Q +q +1 0 0 1 159.9931 3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (238) Tj T* ET +Q +Q +q +1 0 0 1 265.8633 3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (12) Tj T* ET +Q +Q +q +1 0 0 1 371.7335 3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (19\327) Tj T* ET +Q +Q +q +1 J +1 j +0 0 0 RG +.25 w +n 0 54 m 481.2283 54 l S +n 0 36 m 481.2283 36 l S +n 0 18 m 481.2283 18 l S +n 153.9931 0 m 153.9931 72 l S +n 259.8633 0 m 259.8633 72 l S +n 365.7335 0 m 365.7335 72 l S +n 0 72 m 481.2283 72 l S +n 0 0 m 481.2283 0 l S +n 0 0 m 0 72 l S +n 481.2283 0 m 481.2283 72 l S +Q +Q +Q +q +1 0 0 1 57.02362 493.0236 cm +Q +q +1 0 0 1 57.02362 439.0236 cm +q +BT 1 0 0 1 0 38 Tm 2.58789 Tw 12 TL /F1 10 Tf 0 0 0 rg (Same hash function \(key value for ints, djb2 for strings, identity for everything else\), same 64-bucket) Tj T* 0 Tw 1.194897 Tw (chaining, same load factor. The 15\22621\327 factor is ) Tj /F3 10 Tf (purely the cost of interpretation on the bucket walk) Tj /F1 10 Tf (:) Tj T* 0 Tw 1.291079 Tw (each Scheme-level ) Tj /F5 10 Tf (car) Tj /F1 10 Tf ( pays a tag check plus an eval dispatch, while the asm-level loop is two memory) Tj T* 0 Tw (loads and a compare per step.) Tj T* ET +Q +Q +q +1 0 0 1 57.02362 373.0236 cm +q +0 0 0 rg +BT 1 0 0 1 0 50 Tm /F1 10 Tf 12 TL 17.94283 Tw (This matters beyond one data structure. Every container that lives in) Tj T* 0 Tw 4.560927 Tw (Lumbda-the-language-on-asm-the-interpreter pays the same overhead. For a server that processes) Tj T* 0 Tw .026962 Tw (thousands of proofs per minute, pulling the hash-set into the asm primitive layer erases a dominant cost. The) Tj T* 0 Tw 1.349897 Tw (same pattern applies to any structure with a tight inner loop: vector sort, string search, rolling checksum.) Tj T* 0 Tw (Asm's tree-walker is slow on user code; asm's builtins run at the speed of the host CPU.) Tj T* ET +Q +Q +q +1 0 0 1 57.02362 319.0236 cm +q +BT 1 0 0 1 0 38 Tm .622256 Tw 12 TL /F1 10 Tf 0 0 0 rg (The layout reuses vector tag 7 with a negative sentinel at offset 0 \(hash-table: ) Tj /F5 10 Tf (-1) Tj /F1 10 Tf (, hash-set: ) Tj /F5 10 Tf (-2) Tj /F1 10 Tf (\). ) Tj /F5 10 Tf (vector?) Tj /F1 10 Tf T* 0 Tw .303797 Tw (and the printer check the sentinel to stay disjoint from real vectors. No additional tag bits were consumed \227) Tj T* 0 Tw 1.122397 Tw (the seven-way tag mask \() Tj /F5 10 Tf (TAG_MASK) Tj ( ) Tj (=) Tj ( ) Tj (7) Tj /F1 10 Tf (\) still has room for only heap-level containers, and nothing new) Tj T* 0 Tw (needs tagging because the sentinel carries the discrimination.) Tj T* ET +Q +Q +q +1 0 0 1 57.02362 277.0236 cm +q +BT 1 0 0 1 0 26 Tm .314261 Tw 12 TL /F3 10 Tf 0 0 0 rg (Reproduce:) Tj /F1 10 Tf ( ) Tj /F5 10 Tf (make) Tj ( ) Tj (bench-hashset) Tj /F1 10 Tf ( \(source: ) Tj /F5 10 Tf (tests/bench-hashset.sh) Tj /F1 10 Tf (\). Asm-only: C and Python tiers) Tj T* 0 Tw 2.919168 Tw (supply ) Tj /F5 10 Tf (hash-table) Tj /F1 10 Tf ( but not ) Tj /F5 10 Tf (hash-set) Tj /F1 10 Tf ( \227 the speedup shown here is intra-asm, native primitive vs) Tj T* 0 Tw (Scheme-level implementation, not cross-tier.) Tj T* ET +Q +Q +q +1 0 0 1 57.02362 245.8236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (7. Portal: Feedback Across Time) Tj T* ET Q Q q -1 0 0 1 57.02362 653.8236 cm +1 0 0 1 57.02362 201.8236 cm q BT 1 0 0 1 0 26 Tm .17989 Tw 12 TL /F1 10 Tf 0 0 0 rg (A continuation is feedback within a process. A portal is feedback across processes. Same primitive, different) Tj T* 0 Tw 1.06631 Tw (scope: capture machine state, serialize it, reload it elsewhere, resume. Lumbda ships three portal formats) Tj T* 0 Tw (with different tradeoffs & constituencies.) Tj T* ET Q Q q -1 0 0 1 57.02362 647.8236 cm +1 0 0 1 57.02362 195.8236 cm Q q -1 0 0 1 57.02362 551.8236 cm +1 0 0 1 57.02362 99.82362 cm q 1 1 1 rg n 0 96 481.2283 -18 re f* @@ -4238,29 +4470,38 @@ Q Q Q q -1 0 0 1 57.02362 551.8236 cm +1 0 0 1 57.02362 99.82362 cm Q q -1 0 0 1 57.02362 521.8236 cm +1 0 0 1 57.02362 69.82362 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .49713 Tw (Times measured on a 4-binding workload \(int + list + string + fib\(30\) result\) excluding process startup. "k" =) Tj T* 0 Tw (continuation.) Tj T* ET Q Q + +endstream +endobj +127 0 obj +<< +/Length 9354 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 495.8236 cm +1 0 0 1 57.02362 753.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (7.1 S-Expression Portal \227 the Portable One) Tj T* ET Q Q q -1 0 0 1 57.02362 477.8236 cm +1 0 0 1 57.02362 735.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The most boring format is the most portable. An S-expression portal is a sequence of ) Tj /F5 10 Tf (define) Tj /F1 10 Tf ( forms:) Tj T* ET Q Q q -1 0 0 1 57.02362 408.6236 cm +1 0 0 1 57.02362 665.8236 cm q q 1 0 0 1 0 0 cm @@ -4281,35 +4522,35 @@ Q Q Q q -1 0 0 1 57.02362 376.6236 cm +1 0 0 1 57.02362 633.8236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .550522 Tw (Every Scheme implementation in the world can already read this. No schema, no decoder, no version field.) Tj T* 0 Tw (The file is a Scheme program; loading it is evaluating it.) Tj T* ET Q Q q -1 0 0 1 57.02362 322.6236 cm +1 0 0 1 57.02362 579.8236 cm q BT 1 0 0 1 0 38 Tm .702256 Tw 12 TL /F3 10 Tf 0 0 0 rg (The key insight: the language IS the interchange format.) Tj /F1 10 Tf ( We did not design this. R. Kent Dybvig didn't.) Tj T* 0 Tw 1.188726 Tw (John McCarthy didn't. It is a structural consequence of homoiconicity: if the syntax of the language is the) Tj T* 0 Tw 5.458196 Tw (syntax of its data structures, then data serialization is language serialization. Portability across) Tj T* 0 Tw (implementations is free \227 it arrives with the parser.) Tj T* ET Q Q q -1 0 0 1 57.02362 280.6236 cm +1 0 0 1 57.02362 537.8236 cm q BT 1 0 0 1 0 26 Tm .511772 Tw 12 TL /F1 10 Tf 0 0 0 rg (Producer side: assemble the file with ) Tj /F5 10 Tf (\(display) Tj ( ) Tj (...\)) Tj /F1 10 Tf ( & ) Tj /F5 10 Tf (\(write) Tj ( ) Tj (...\)) Tj /F1 10 Tf ( to an output port. Consumer side:) Tj T* 0 Tw 3.693453 Tw /F5 10 Tf (\(load) Tj ( ) Tj ("file.sexp"\)) Tj /F1 10 Tf (. Both sides exist in every implementation, giving us a 3\3273 matrix of valid) Tj T* 0 Tw (exchanges.) Tj T* ET Q Q q -1 0 0 1 57.02362 254.6236 cm +1 0 0 1 57.02362 511.8236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (7.2 Cross-Implementation Exchange Matrix) Tj T* ET Q Q q -1 0 0 1 57.02362 242.6236 cm +1 0 0 1 57.02362 499.8236 cm Q q -1 0 0 1 57.02362 152.6236 cm +1 0 0 1 57.02362 409.8236 cm q 1 1 1 rg n 0 90 481.2283 -18 re f* @@ -4464,50 +4705,41 @@ Q Q Q q -1 0 0 1 57.02362 152.6236 cm +1 0 0 1 57.02362 409.8236 cm Q q -1 0 0 1 57.02362 122.6236 cm +1 0 0 1 57.02362 379.8236 cm q BT 1 0 0 1 0 14 Tm 3.901835 Tw 12 TL /F1 10 Tf 0 0 0 rg (9 of 9. Verified by ) Tj /F5 10 Tf (tests/portal-cross-test.sh) Tj /F1 10 Tf ( \() Tj /F3 10 Tf (make bench-portal-cross) Tj /F1 10 Tf (\). Same file, same) Tj T* 0 Tw (semantics, regardless of which process produced it.) Tj T* ET Q Q q -1 0 0 1 57.02362 80.62362 cm +1 0 0 1 57.02362 337.8236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .526019 Tw (This matters because it defeats the "version lock-in" trap. If the JSON portal were the only option, a Python) Tj T* 0 Tw 2.478453 Tw (3.15 producer could emit structures a C consumer couldn't parse. With S-expression portals, the only) Tj T* 0 Tw (dependency is a parser that handles the subset of forms in the file. Every implementation already has one.) Tj T* ET Q Q - -endstream -endobj -125 0 obj -<< -/Length 8338 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 753.0236 cm +1 0 0 1 57.02362 311.8236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (7.3 JSON Portal \227 Graph-Aware, Continuation-Preserving) Tj T* ET Q Q q -1 0 0 1 57.02362 723.0236 cm +1 0 0 1 57.02362 281.8236 cm q BT 1 0 0 1 0 14 Tm .373453 Tw 12 TL /F1 10 Tf 0 0 0 rg (When you need to preserve shared references, cycles, closures, or a ) Tj /F4 10 Tf (live continuation) Tj /F1 10 Tf (, S-expressions aren't) Tj T* 0 Tw (enough. The JSON portal \(Python & C\) performs graph-aware serialization:) Tj T* ET Q Q q -1 0 0 1 57.02362 717.0236 cm +1 0 0 1 57.02362 275.8236 cm Q q -1 0 0 1 57.02362 717.0236 cm +1 0 0 1 57.02362 275.8236 cm Q q -1 0 0 1 57.02362 705.0236 cm +1 0 0 1 57.02362 263.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -4529,10 +4761,10 @@ Q Q Q q -1 0 0 1 57.02362 699.0236 cm +1 0 0 1 57.02362 257.8236 cm Q q -1 0 0 1 57.02362 687.0236 cm +1 0 0 1 57.02362 245.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -4555,10 +4787,10 @@ Q Q Q q -1 0 0 1 57.02362 681.0236 cm +1 0 0 1 57.02362 239.8236 cm Q q -1 0 0 1 57.02362 669.0236 cm +1 0 0 1 57.02362 227.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -4580,10 +4812,10 @@ Q Q Q q -1 0 0 1 57.02362 663.0236 cm +1 0 0 1 57.02362 221.8236 cm Q q -1 0 0 1 57.02362 651.0236 cm +1 0 0 1 57.02362 209.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -4606,10 +4838,10 @@ Q Q Q q -1 0 0 1 57.02362 645.0236 cm +1 0 0 1 57.02362 203.8236 cm Q q -1 0 0 1 57.02362 633.0236 cm +1 0 0 1 57.02362 191.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -4632,22 +4864,22 @@ Q Q Q q -1 0 0 1 57.02362 615.0236 cm +1 0 0 1 57.02362 173.8236 cm Q q -1 0 0 1 57.02362 585.0236 cm +1 0 0 1 57.02362 143.8236 cm q BT 1 0 0 1 0 14 Tm 2.974168 Tw 12 TL /F1 10 Tf 0 0 0 rg (Deserialization is two-pass: shell pass creates empty object shells & assigns reference IDs, fill pass) Tj T* 0 Tw (populates pointers & values. This handles the closure-that-captures-itself pattern cleanly.) Tj T* ET Q Q q -1 0 0 1 57.02362 543.0236 cm +1 0 0 1 57.02362 101.8236 cm q BT 1 0 0 1 0 26 Tm 4.719816 Tw 12 TL /F1 10 Tf 0 0 0 rg (During VM execution, ) Tj /F5 10 Tf (portal-checkpoint!) Tj /F1 10 Tf ( triggers at ) Tj /F5 10 Tf (OP_JUMP) Tj /F1 10 Tf ( & ) Tj /F5 10 Tf (OP_TAIL_CALL) Tj /F1 10 Tf ( instructions,) Tj T* 0 Tw 1.439168 Tw (capturing the current continuation, serializing it to a ) Tj /F5 10 Tf (.portal) Tj /F1 10 Tf ( file, & continuing. Resumption restores the) Tj T* 0 Tw (saved state & continues execution from the exact instruction where the checkpoint occurred.) Tj T* ET Q Q q -1 0 0 1 57.02362 512.2236 cm +1 0 0 1 57.02362 71.02362 cm q q 1 0 0 1 0 0 cm @@ -4667,27 +4899,36 @@ Q Q Q Q + +endstream +endobj +128 0 obj +<< +/Length 9310 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 492.2236 cm +1 0 0 1 57.02362 753.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The computation does not need to restart from the beginning.) Tj T* ET Q Q q -1 0 0 1 57.02362 466.2236 cm +1 0 0 1 57.02362 727.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (7.4 Binary Heap Dump \227 the Fast One) Tj T* ET Q Q q -1 0 0 1 57.02362 436.2236 cm +1 0 0 1 57.02362 697.0236 cm q BT 1 0 0 1 0 14 Tm .755197 Tw 12 TL /F1 10 Tf 0 0 0 rg (The asm implementation ships a direct-dump portal: write the raw heap bytes, the ) Tj /F5 10 Tf (r14) Tj /F1 10 Tf ( \(env\) & ) Tj /F5 10 Tf (r15) Tj /F1 10 Tf ( \(bump) Tj T* 0 Tw (pointer\) registers, the heap base address, & a magic header. No parsing, no encoding.) Tj T* ET Q Q q -1 0 0 1 57.02362 338.2236 cm +1 0 0 1 57.02362 599.0236 cm q q 1 0 0 1 0 0 cm @@ -4708,36 +4949,48 @@ Q Q Q q -1 0 0 1 57.02362 294.2236 cm +1 0 0 1 57.02362 555.0236 cm q BT 1 0 0 1 0 26 Tm 1.387739 Tw 12 TL /F1 10 Tf 0 0 0 rg (Sub-millisecond save & resume. The MAP_FIXED trick is why it works across processes: because every) Tj T* 0 Tw 1.474556 Tw (pointer inside the heap is an absolute address, resuming at a different address would require relocation.) Tj T* 0 Tw (Mapping at the same address keeps pointers live.) Tj T* ET Q Q q -1 0 0 1 57.02362 240.2236 cm +1 0 0 1 57.02362 501.0236 cm q BT 1 0 0 1 0 38 Tm 1.067739 Tw 12 TL /F1 10 Tf 0 0 0 rg (Constraints: same architecture, same binary layout, same process model. An asm binary portal written on) Tj T* 0 Tw .022545 Tw (one box resumes on another x86_64 Linux box running the same asm binary. It does not resume on a rebuilt) Tj T* 0 Tw 1.065522 Tw (binary \227 the BSS-resident symbol table ) Tj /F5 10 Tf (sym_table) Tj /F1 10 Tf ( is not in the heap dump, so interned symbols would) Tj T* 0 Tw (need to be reinterned. That's the price of trivial serialization.) Tj T* ET Q Q q -1 0 0 1 57.02362 214.2236 cm +1 0 0 1 57.02362 475.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (7.5 Cross-Process Benchmarks) Tj T* ET Q Q q -1 0 0 1 57.02362 172.2236 cm +1 0 0 1 57.02362 433.0236 cm q BT 1 0 0 1 0 26 Tm 2.703647 Tw 12 TL /F1 10 Tf 0 0 0 rg (Producer process A saves state to a file; consumer process B starts fresh, loads the file, continues.) Tj T* 0 Tw 10.67759 Tw (Wall-clock time for both processes end-to-end, 50 iterations, same-laptop. ) Tj /F3 10 Tf (Reproduce:) Tj /F1 10 Tf T* 0 Tw /F5 10 Tf (make) Tj ( ) Tj (bench-portal) Tj /F1 10 Tf ( \(source: ) Tj /F5 10 Tf (tests/portal-benchmark.sh) Tj /F1 10 Tf (\).) Tj T* ET Q Q q -1 0 0 1 57.02362 166.2236 cm +1 0 0 1 57.02362 427.0236 cm Q q -1 0 0 1 57.02362 76.22362 cm +1 0 0 1 57.02362 229.0236 cm q 1 1 1 rg +n 0 198 481.2283 -18 re f* +.878431 .878431 .878431 rg +n 0 180 481.2283 -18 re f* +1 1 1 rg +n 0 162 481.2283 -18 re f* +.878431 .878431 .878431 rg +n 0 144 481.2283 -18 re f* +1 1 1 rg +n 0 126 481.2283 -18 re f* +.878431 .878431 .878431 rg +n 0 108 481.2283 -18 re f* +1 1 1 rg n 0 90 481.2283 -18 re f* .878431 .878431 .878431 rg n 0 72 481.2283 -18 re f* @@ -4750,14 +5003,14 @@ n 0 18 481.2283 -18 re f* 0 0 0 rg BT /F3 10 Tf 12 TL ET q -1 0 0 1 6 75 cm +1 0 0 1 6 183 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 93.12904 0 Td (Pair \(producer ) Tj /F6 10 Tf 12 TL (\256) Tj /F3 10 Tf 12 TL ( consumer\)) Tj T* -93.12904 0 Td ET Q Q q -1 0 0 1 339.1581 75 cm +1 0 0 1 339.1581 183 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 47.19513 0 Td (Time/iter) Tj T* -47.19513 0 Td ET @@ -4766,105 +5019,62 @@ Q 0 0 0 rg BT /F1 10 Tf 12 TL ET q -1 0 0 1 6 57 cm +1 0 0 1 6 165 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Python ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( Python \(sexp\)) Tj T* ET Q Q q -1 0 0 1 339.1581 57 cm +1 0 0 1 339.1581 165 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (260 ms) Tj T* ET Q Q q -1 0 0 1 6 39 cm +1 0 0 1 6 147 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (C ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( C \(sexp\)) Tj T* ET Q Q q -1 0 0 1 339.1581 39 cm +1 0 0 1 339.1581 147 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (6 ms) Tj T* ET Q Q q -1 0 0 1 6 21 cm +1 0 0 1 6 129 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (asm ) Tj /F6 10 Tf 12 TL (\256) Tj /F3 10 Tf 12 TL ( asm \(sexp\)) Tj T* ET Q Q q -1 0 0 1 339.1581 21 cm +1 0 0 1 339.1581 129 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (1.6 ms) Tj T* ET Q Q q -1 0 0 1 6 3 cm +1 0 0 1 6 111 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (asm ) Tj /F6 10 Tf 12 TL (\256) Tj /F3 10 Tf 12 TL ( asm \(binary portal\)) Tj T* ET Q Q q -1 0 0 1 339.1581 3 cm +1 0 0 1 339.1581 111 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (1.5 ms) Tj T* ET Q Q q -1 J -1 j -0 0 0 RG -.25 w -n 0 0 m 481.2283 0 l S -n 0 72 m 481.2283 72 l S -n 0 54 m 481.2283 54 l S -n 0 36 m 481.2283 36 l S -n 0 18 m 481.2283 18 l S -n 333.1581 0 m 333.1581 90 l S -n 0 90 m 481.2283 90 l S -n 0 0 m 0 90 l S -n 481.2283 0 m 481.2283 90 l S -Q -Q -Q - -endstream -endobj -126 0 obj -<< -/Length 9560 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET -q -1 0 0 1 57.02362 657.0236 cm -q -1 1 1 rg -n 0 108 481.2283 -18 re f* -.878431 .878431 .878431 rg -n 0 90 481.2283 -18 re f* -1 1 1 rg -n 0 72 481.2283 -18 re f* -.878431 .878431 .878431 rg -n 0 54 481.2283 -18 re f* -1 1 1 rg -n 0 36 481.2283 -18 re f* -.878431 .878431 .878431 rg -n 0 18 481.2283 -18 re f* -0 0 0 rg -BT /F1 10 Tf 12 TL ET -q 1 0 0 1 6 93 cm q 0 0 0 rg @@ -4953,86 +5163,83 @@ q 1 j 0 0 0 RG .25 w +n 0 180 m 481.2283 180 l S +n 0 162 m 481.2283 162 l S +n 0 144 m 481.2283 144 l S +n 0 126 m 481.2283 126 l S n 0 108 m 481.2283 108 l S n 0 90 m 481.2283 90 l S n 0 72 m 481.2283 72 l S n 0 54 m 481.2283 54 l S n 0 36 m 481.2283 36 l S n 0 18 m 481.2283 18 l S -n 333.1581 0 m 333.1581 108 l S -n 0 0 m 0 108 l S -n 481.2283 0 m 481.2283 108 l S +n 333.1581 0 m 333.1581 198 l S +n 0 198 m 481.2283 198 l S n 0 0 m 481.2283 0 l S +n 0 0 m 0 198 l S +n 481.2283 0 m 481.2283 198 l S Q Q Q q -1 0 0 1 57.02362 657.0236 cm +1 0 0 1 57.02362 229.0236 cm Q q -1 0 0 1 57.02362 615.0236 cm +1 0 0 1 57.02362 187.0236 cm q BT 1 0 0 1 0 26 Tm .698334 Tw 12 TL /F1 10 Tf 0 0 0 rg (The asm) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL (asm cross-process is ~160\327 faster than Python) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL (Python. The binary & S-expression portals are) Tj T* 0 Tw .812256 Tw (within 10% of each other on this workload \227 the bottleneck is process startup, not serialization. For larger) Tj T* 0 Tw (heaps the binary format pulls further ahead; for portability, S-expression always wins.) Tj T* ET Q Q q -1 0 0 1 57.02362 589.0236 cm +1 0 0 1 57.02362 161.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (7.6 Mismatch Cases: Graceful Degradation) Tj T* ET Q Q q -1 0 0 1 57.02362 571.0236 cm +1 0 0 1 57.02362 143.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (A usable persistence layer fails well. What happens when the consumer meets unexpected input?) Tj T* ET Q Q q -1 0 0 1 57.02362 565.0236 cm +1 0 0 1 57.02362 137.0236 cm Q q -1 0 0 1 57.02362 415.0236 cm +1 0 0 1 57.02362 71.02362 cm q 1 1 1 rg -n 0 150 481.2283 -18 re f* +n 0 66 481.2283 -18 re f* .878431 .878431 .878431 rg -n 0 132 481.2283 -18 re f* +n 0 48 481.2283 -18 re f* 1 1 1 rg -n 0 114 481.2283 -30 re f* -.878431 .878431 .878431 rg -n 0 84 481.2283 -30 re f* -1 1 1 rg -n 0 54 481.2283 -18 re f* -.878431 .878431 .878431 rg -n 0 36 481.2283 -18 re f* -1 1 1 rg -n 0 18 481.2283 -18 re f* +n 0 30 481.2283 -30 re f* 0 0 0 rg BT /F3 10 Tf 12 TL ET q -1 0 0 1 6 135 cm +1 0 0 1 6 51 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 96.07173 0 Td (Input) Tj T* -96.07173 0 Td ET Q Q q -1 0 0 1 234.5835 135 cm +1 0 0 1 234.5835 51 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 19.16248 0 Td (Python) Tj T* -19.16248 0 Td ET Q Q q -1 0 0 1 318.7984 135 cm +1 0 0 1 318.7984 51 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 32.49748 0 Td (C) Tj T* -32.49748 0 Td ET Q Q q -1 0 0 1 403.0134 135 cm +1 0 0 1 403.0134 51 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 26.10248 0 Td (asm) Tj T* -26.10248 0 Td ET @@ -5041,60 +5248,99 @@ Q 0 0 0 rg BT /F1 10 Tf 12 TL ET q -1 0 0 1 6 117 cm +1 0 0 1 6 33 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Empty file) Tj T* ET Q Q q -1 0 0 1 234.5835 117 cm +1 0 0 1 234.5835 33 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (continue) Tj T* ET Q Q q -1 0 0 1 318.7984 117 cm +1 0 0 1 318.7984 33 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (continue) Tj T* ET Q Q q -1 0 0 1 403.0134 117 cm +1 0 0 1 403.0134 33 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (continue) Tj T* ET Q Q q -1 0 0 1 6 99 cm +1 0 0 1 6 15 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Missing file) Tj T* ET Q Q q -1 0 0 1 234.5835 87 cm +1 0 0 1 234.5835 3 cm q BT 1 0 0 1 0 14 Tm 12 TL /F5 10 Tf 0 0 0 rg (file) Tj ( ) Tj (not) Tj T* (found:) Tj ( ) Tj (\205) Tj T* ET Q Q q -1 0 0 1 318.7984 99 cm +1 0 0 1 318.7984 15 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL (error: \205) Tj T* ET Q Q q -1 0 0 1 403.0134 99 cm +1 0 0 1 403.0134 15 cm q BT 1 0 0 1 0 2 Tm 12 TL /F5 10 Tf 0 0 0 rg (#f) Tj /F1 10 Tf ( + continue) Tj T* ET Q Q q +1 J +1 j +0 0 0 RG +.25 w +n 0 0 m 481.2283 0 l S +n 0 48 m 481.2283 48 l S +n 0 30 m 481.2283 30 l S +n 228.5835 0 m 228.5835 66 l S +n 312.7984 0 m 312.7984 66 l S +n 397.0134 0 m 397.0134 66 l S +n 0 66 m 481.2283 66 l S +n 0 0 m 0 66 l S +n 481.2283 0 m 481.2283 66 l S +Q +Q +Q + +endstream +endobj +129 0 obj +<< +/Length 7061 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 57.02362 681.0236 cm +q +1 1 1 rg +n 0 84 481.2283 -30 re f* +.878431 .878431 .878431 rg +n 0 54 481.2283 -18 re f* +1 1 1 rg +n 0 36 481.2283 -18 re f* +.878431 .878431 .878431 rg +n 0 18 481.2283 -18 re f* +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q 1 0 0 1 6 69 cm q BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Truncated sexp \() Tj /F5 10 Tf (\(define) Tj ( ) Tj (x) Tj /F1 10 Tf (\)) Tj T* ET @@ -5208,39 +5454,36 @@ q 1 j 0 0 0 RG .25 w -n 0 132 m 481.2283 132 l S -n 0 114 m 481.2283 114 l S n 0 84 m 481.2283 84 l S n 0 54 m 481.2283 54 l S n 0 36 m 481.2283 36 l S n 0 18 m 481.2283 18 l S -n 228.5835 0 m 228.5835 150 l S -n 312.7984 0 m 312.7984 150 l S -n 397.0134 0 m 397.0134 150 l S -n 0 150 m 481.2283 150 l S +n 228.5835 0 m 228.5835 84 l S +n 312.7984 0 m 312.7984 84 l S +n 397.0134 0 m 397.0134 84 l S +n 0 0 m 0 84 l S +n 481.2283 0 m 481.2283 84 l S n 0 0 m 481.2283 0 l S -n 0 0 m 0 150 l S -n 481.2283 0 m 481.2283 150 l S Q Q Q q -1 0 0 1 57.02362 415.0236 cm +1 0 0 1 57.02362 681.0236 cm Q q -1 0 0 1 57.02362 349.0236 cm +1 0 0 1 57.02362 615.0236 cm q BT 1 0 0 1 0 50 Tm 1.476556 Tw 12 TL /F1 10 Tf 0 0 0 rg (All defects surfaced & fixed during benchmark development: an asm segfault on ) Tj /F5 10 Tf (\(define) Tj ( ) Tj (x\)) Tj /F1 10 Tf ( without a) Tj T* 0 Tw 1.838453 Tw (value \(now binds to ) Tj /F5 10 Tf (VOID) Tj /F1 10 Tf (\), an asm portal-resume that accepted short headers \(now verifies ) Tj /F5 10 Tf (sys_read) Tj /F1 10 Tf T* 0 Tw 1.204272 Tw (returned a full 48 bytes & sanity-checks heap metadata\), a Python ) Tj /F5 10 Tf (file) Tj ( ) Tj (not) Tj ( ) Tj (found) Tj /F1 10 Tf ( error reporting the) Tj T* 0 Tw 1.304862 Tw (outer script path instead of the inner missing file \(now uses ) Tj /F5 10 Tf (FileNotFoundError.filename) Tj /F1 10 Tf (\). Graceful) Tj T* 0 Tw (degradation is not free; it is tested.) Tj T* ET Q Q q -1 0 0 1 57.02362 323.0236 cm +1 0 0 1 57.02362 589.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (7.7 Use Case: Distributed Primality Testing) Tj T* ET Q Q q -1 0 0 1 57.02362 196.2236 cm +1 0 0 1 57.02362 462.2236 cm q q 1 0 0 1 0 0 cm @@ -5260,47 +5503,38 @@ Q Q Q q -1 0 0 1 57.02362 152.2236 cm +1 0 0 1 57.02362 418.2236 cm q BT 1 0 0 1 0 26 Tm 1.105522 Tw 12 TL /F1 10 Tf 0 0 0 rg (Machine A starts the computation. Every 10,000 iterations, it writes a checkpoint. Machine B picks up the) Tj T* 0 Tw 2.790642 Tw /F5 10 Tf (.portal) Tj /F1 10 Tf ( file & continues from the last checkpoint. The computation migrates without either machine) Tj T* 0 Tw (needing to know about the other. Feedback \227 the continuation \227 carries the entire execution context.) Tj T* ET Q Q q -1 0 0 1 57.02362 121.0236 cm +1 0 0 1 57.02362 387.0236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (8. The EML Universality Proof) Tj T* ET Q Q q -1 0 0 1 57.02362 89.02362 cm +1 0 0 1 57.02362 355.0236 cm q BT 1 0 0 1 0 14 Tm 3.669104 Tw 12 TL /F1 10 Tf 0 0 0 rg (Lumbda ships with a mathematical proof that a single operator generates all elementary functions:) Tj T* 0 Tw /F5 10 Tf (eml\(x,) Tj ( ) Tj (y\)) Tj ( ) Tj (=) Tj ( ) Tj (exp\(x\)) Tj ( ) Tj (-) Tj ( ) Tj (ln\(y\)) Tj /F1 10 Tf (.) Tj T* ET Q Q q -1 0 0 1 57.02362 71.02362 cm +1 0 0 1 57.02362 337.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Reference: "All elementary functions from a single operator" \(arXiv:2603.21852v2\).) Tj T* ET Q Q - -endstream -endobj -127 0 obj -<< -/Length 8367 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 753.0236 cm +1 0 0 1 57.02362 311.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (8.1 The Operator) Tj T* ET Q Q q -1 0 0 1 57.02362 722.2236 cm +1 0 0 1 57.02362 280.2236 cm q q 1 0 0 1 0 0 cm @@ -5321,19 +5555,19 @@ Q Q Q q -1 0 0 1 57.02362 702.2236 cm +1 0 0 1 57.02362 260.2236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (With this operator & the constant ) Tj /F5 10 Tf (1) Tj /F1 10 Tf (, the following derivation chain constructs every elementary function:) Tj T* ET Q Q q -1 0 0 1 57.02362 676.2236 cm +1 0 0 1 57.02362 234.2236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (8.2 Stage 1: Core Functions \(Depth 1--3\)) Tj T* ET Q Q q -1 0 0 1 57.02362 626.2236 cm +1 0 0 1 57.02362 184.2236 cm q q 1 0 0 1 0 0 cm @@ -5354,19 +5588,28 @@ Q Q Q q -1 0 0 1 57.02362 582.2236 cm +1 0 0 1 57.02362 140.2236 cm q BT 1 0 0 1 0 26 Tm 16.01403 Tw 12 TL /F3 10 Tf 0 0 0 rg (Proof of ln recovery) Tj /F1 10 Tf (: Let ) Tj /F5 10 Tf (a) Tj ( ) Tj (=) Tj ( ) Tj (eml\(1,x\)) Tj ( ) Tj (=) Tj ( ) Tj (e) Tj ( ) Tj (-) Tj ( ) Tj (ln\(x\)) Tj /F1 10 Tf (. Then) Tj T* 0 Tw 28.85979 Tw /F5 10 Tf (eml\(a,) Tj ( ) Tj (1\)) Tj ( ) Tj (=) Tj ( ) Tj (exp\(e) Tj ( ) Tj (-) Tj ( ) Tj (ln\(x\)\)) Tj ( ) Tj (=) Tj ( ) Tj (exp\(e\)/x) Tj /F1 10 Tf (. Then) Tj T* 0 Tw /F5 10 Tf (eml\(1,) Tj ( ) Tj (exp\(e\)/x\)) Tj ( ) Tj (=) Tj ( ) Tj (e) Tj ( ) Tj (-) Tj ( ) Tj (ln\(exp\(e\)/x\)) Tj ( ) Tj (=) Tj ( ) Tj (e) Tj ( ) Tj (-) Tj ( ) Tj (e) Tj ( ) Tj (+) Tj ( ) Tj (ln\(x\)) Tj ( ) Tj (=) Tj ( ) Tj (ln\(x\)) Tj /F1 10 Tf (.) Tj T* ET Q Q + +endstream +endobj +130 0 obj +<< +/Length 9324 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 556.2236 cm +1 0 0 1 57.02362 753.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (8.3 Stage 2: Arithmetic) Tj T* ET Q Q q -1 0 0 1 57.02362 467.8236 cm +1 0 0 1 57.02362 664.6236 cm q q 1 0 0 1 0 0 cm @@ -5386,13 +5629,13 @@ Q Q Q q -1 0 0 1 57.02362 441.8236 cm +1 0 0 1 57.02362 638.6236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (8.4 Stage 3: Complex Plane Access) Tj T* ET Q Q q -1 0 0 1 57.02362 391.8236 cm +1 0 0 1 57.02362 588.6236 cm q q 1 0 0 1 0 0 cm @@ -5413,19 +5656,19 @@ Q Q Q q -1 0 0 1 57.02362 359.8236 cm +1 0 0 1 57.02362 556.6236 cm q BT 1 0 0 1 0 14 Tm .253071 Tw 12 TL /F1 10 Tf 0 0 0 rg (The key insight: ) Tj /F5 10 Tf (ln) Tj /F1 10 Tf ( of a negative number enters the complex plane. Since we can construct ) Tj /F5 10 Tf (-1) Tj /F1 10 Tf ( from eml via) Tj T* 0 Tw (the subtraction chain, ) Tj /F5 10 Tf (ln\(-1\)) Tj /F1 10 Tf ( yields ) Tj /F5 10 Tf (i) Tj /F6 10 Tf 12 TL (p) Tj /F5 10 Tf 12 TL /F1 10 Tf (, from which ) Tj /F5 10 Tf /F6 10 Tf 12 TL (p) Tj /F5 10 Tf 12 TL /F1 10 Tf ( & ) Tj /F5 10 Tf (i) Tj /F1 10 Tf ( follow.) Tj T* ET Q Q q -1 0 0 1 57.02362 333.8236 cm +1 0 0 1 57.02362 530.6236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (8.5 Stage 4: Trigonometry via Euler) Tj T* ET Q Q q -1 0 0 1 57.02362 283.8236 cm +1 0 0 1 57.02362 480.6236 cm q q 1 0 0 1 0 0 cm @@ -5446,29 +5689,29 @@ Q Q Q q -1 0 0 1 57.02362 263.8236 cm +1 0 0 1 57.02362 460.6236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (All trigonometric functions follow from complex exponentials, which follow from ) Tj /F5 10 Tf (exp) Tj /F1 10 Tf (, which follows from ) Tj /F5 10 Tf (eml) Tj /F1 10 Tf (.) Tj T* ET Q Q q -1 0 0 1 57.02362 237.8236 cm +1 0 0 1 57.02362 434.6236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (8.6 Verification & Friction Analysis) Tj T* ET Q Q q -1 0 0 1 57.02362 219.8236 cm +1 0 0 1 57.02362 416.6236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The proof is verified at three levels, with dramatically different friction:) Tj T* ET Q Q q -1 0 0 1 57.02362 213.8236 cm +1 0 0 1 57.02362 410.6236 cm Q q -1 0 0 1 57.02362 141.8236 cm +1 0 0 1 57.02362 338.6236 cm q 1 1 1 rg n 0 72 481.2283 -18 re f* @@ -5612,49 +5855,34 @@ Q Q Q q -1 0 0 1 57.02362 141.8236 cm +1 0 0 1 57.02362 338.6236 cm Q q -1 0 0 1 57.02362 99.82362 cm +1 0 0 1 57.02362 296.6236 cm q BT 1 0 0 1 0 26 Tm .395596 Tw 12 TL /F3 10 Tf 0 0 0 rg (The formal proof is 40x faster than the brute-force search & provides mathematical certainty instead) Tj T* 0 Tw 1.066027 Tw (of floating-point tolerance.) Tj /F1 10 Tf ( This is MOAD-0001 \(the sedimentary defect\) at the proof methodology layer:) Tj T* 0 Tw (O\(N\262\) search friction where O\(1\) algebraic reasoning suffices.) Tj T* ET Q Q q -1 0 0 1 57.02362 69.82362 cm +1 0 0 1 57.02362 242.6236 cm q -BT 1 0 0 1 0 14 Tm 2.309862 Tw 12 TL /F1 10 Tf 0 0 0 rg (The numerical approaches enumerate all pairwise EML compositions at each depth, comparing results) Tj T* 0 Tw .653022 Tw (against target functions. This grows quadratically with the number of known values. The Lean proof does 5) Tj T* 0 Tw ET -Q -Q - -endstream -endobj -128 0 obj -<< -/Length 9908 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET -q -1 0 0 1 57.02362 741.0236 cm -q -BT 1 0 0 1 0 14 Tm .327397 Tw 12 TL /F1 10 Tf 0 0 0 rg (algebraic rewrites, each applying an axiom \() Tj /F5 10 Tf (exp\(ln\(x\)\)) Tj ( ) Tj (=) Tj ( ) Tj (x) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (ln\(exp\(x\)\)) Tj ( ) Tj (=) Tj ( ) Tj (x) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (ln\(1\)) Tj ( ) Tj (=) Tj ( ) Tj (0) Tj /F1 10 Tf (\). The type) Tj T* 0 Tw (checker confirms each rewrite in microseconds. No search. No tolerance. No conjecture dependency.) Tj T* ET +BT 1 0 0 1 0 38 Tm 2.309862 Tw 12 TL /F1 10 Tf 0 0 0 rg (The numerical approaches enumerate all pairwise EML compositions at each depth, comparing results) Tj T* 0 Tw .653022 Tw (against target functions. This grows quadratically with the number of known values. The Lean proof does 5) Tj T* 0 Tw .327397 Tw (algebraic rewrites, each applying an axiom \() Tj /F5 10 Tf (exp\(ln\(x\)\)) Tj ( ) Tj (=) Tj ( ) Tj (x) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (ln\(exp\(x\)\)) Tj ( ) Tj (=) Tj ( ) Tj (x) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (ln\(1\)) Tj ( ) Tj (=) Tj ( ) Tj (0) Tj /F1 10 Tf (\). The type) Tj T* 0 Tw (checker confirms each rewrite in microseconds. No search. No tolerance. No conjecture dependency.) Tj T* ET Q Q q -1 0 0 1 57.02362 687.0236 cm +1 0 0 1 57.02362 188.6236 cm q BT 1 0 0 1 0 38 Tm 3.571147 Tw 12 TL /F3 10 Tf 0 0 0 rg (Lesson) Tj /F1 10 Tf (: The fastest path to truth is not computation \227 it is understanding. When you know ) Tj /F4 10 Tf (why) Tj /F1 10 Tf T* 0 Tw .96189 Tw /F5 10 Tf (eml\(1,) Tj ( ) Tj (eml\(eml\(1,x\),) Tj ( ) Tj (1\)\)) Tj ( ) Tj (=) Tj ( ) Tj (ln\(x\)) Tj /F1 10 Tf (, you verify it in microseconds. When you don't, you search for) Tj T* 0 Tw 1.513223 Tw (hours. Proof assistants eliminate the quadratic friction of verification. They are the hash set to numerical) Tj T* 0 Tw (analysis's nested loop.) Tj T* ET Q Q q -1 0 0 1 57.02362 681.0236 cm +1 0 0 1 57.02362 182.6236 cm Q q -1 0 0 1 57.02362 681.0236 cm +1 0 0 1 57.02362 182.6236 cm Q q -1 0 0 1 57.02362 645.0236 cm +1 0 0 1 57.02362 146.6236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -5676,10 +5904,10 @@ Q Q Q q -1 0 0 1 57.02362 639.0236 cm +1 0 0 1 57.02362 140.6236 cm Q q -1 0 0 1 57.02362 603.0236 cm +1 0 0 1 57.02362 104.6236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -5701,10 +5929,10 @@ Q Q Q q -1 0 0 1 57.02362 597.0236 cm +1 0 0 1 57.02362 98.62362 cm Q q -1 0 0 1 57.02362 573.0236 cm +1 0 0 1 57.02362 74.62362 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -5726,10 +5954,19 @@ Q Q Q q -1 0 0 1 57.02362 573.0236 cm +1 0 0 1 57.02362 74.62362 cm Q + +endstream +endobj +131 0 obj +<< +/Length 8943 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 503.8236 cm +1 0 0 1 57.02362 703.8236 cm q q 1 0 0 1 0 0 cm @@ -5750,19 +5987,19 @@ Q Q Q q -1 0 0 1 57.02362 459.8236 cm +1 0 0 1 57.02362 659.8236 cm q BT 1 0 0 1 0 26 Tm 4.138556 Tw 12 TL /F1 10 Tf 0 0 0 rg (The Lean proof operates over abstract ) Tj /F5 10 Tf (exp) Tj /F1 10 Tf ( & ) Tj /F5 10 Tf (ln) Tj /F1 10 Tf ( functions with the axioms ) Tj /F5 10 Tf (exp\(ln\(x\)\)) Tj ( ) Tj (=) Tj ( ) Tj (x) Tj /F1 10 Tf (,) Tj T* 0 Tw 2.484897 Tw /F5 10 Tf (ln\(exp\(x\)\)) Tj ( ) Tj (=) Tj ( ) Tj (x) Tj /F1 10 Tf (, & ) Tj /F5 10 Tf (ln\(1\)) Tj ( ) Tj (=) Tj ( ) Tj (0) Tj /F1 10 Tf (. This makes the result independent of any particular real number) Tj T* 0 Tw (implementation.) Tj T* ET Q Q q -1 0 0 1 57.02362 453.8236 cm +1 0 0 1 57.02362 653.8236 cm Q q -1 0 0 1 57.02362 453.8236 cm +1 0 0 1 57.02362 653.8236 cm Q q -1 0 0 1 57.02362 369.8236 cm +1 0 0 1 57.02362 569.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -5784,10 +6021,10 @@ Q Q Q q -1 0 0 1 57.02362 369.8236 cm +1 0 0 1 57.02362 569.8236 cm Q q -1 0 0 1 57.02362 291.0236 cm +1 0 0 1 57.02362 491.0236 cm q q 1 0 0 1 0 0 cm @@ -5808,16 +6045,16 @@ Q Q Q q -1 0 0 1 57.02362 223.0236 cm +1 0 0 1 57.02362 423.0236 cm q BT 1 0 0 1 0 50 Tm 4.101411 Tw 12 TL /F3 10 Tf 0 0 0 rg (Verification speed: Lean vs Lumbda tiers, both cold and cached.) Tj /F1 10 Tf ( Same five theorems, same) Tj T* 0 Tw 1.757362 Tw (symbolic-rewrite strategy. The Lumbda checker now implements its own cached-replay path that mirrors) Tj T* 0 Tw .258797 Tw (Lean's: write a small artifact after a successful run; on subsequent runs, trust the artifact if the magic header) Tj T* 0 Tw .759029 Tw (matches and skip re-verification. ) Tj /F5 10 Tf (rm) Tj ( ) Tj (-f) Tj ( ) Tj (/tmp/lumbda-eml.cache) Tj /F1 10 Tf ( forces a cold re-check \(analogous to) Tj T* 0 Tw /F5 10 Tf (lake) Tj ( ) Tj (clean) Tj /F1 10 Tf (\). Best of 3 on the i5-8350U:) Tj T* ET Q Q q -1 0 0 1 57.02362 217.0236 cm +1 0 0 1 57.02362 417.0236 cm Q q -1 0 0 1 57.02362 109.0236 cm +1 0 0 1 57.02362 309.0236 cm q 1 1 1 rg n 0 108 481.2283 -18 re f* @@ -6001,102 +6238,96 @@ Q Q Q q -1 0 0 1 57.02362 109.0236 cm +1 0 0 1 57.02362 309.0236 cm Q q -1 0 0 1 57.02362 67.02362 cm +1 0 0 1 57.02362 243.0236 cm q -BT 1 0 0 1 0 26 Tm .204897 Tw 12 TL /F1 10 Tf 0 0 0 rg (Two comparisons matter. ) Tj /F3 10 Tf (Cold vs cold) Tj /F1 10 Tf ( is the honest end-to-end compare: Lumbda asm \(46 ms\) verifies the) Tj T* 0 Tw -0.127156 Tw (proof ) Tj /F3 10 Tf (~16\327 faster than Lean's cold rebuild) Tj /F1 10 Tf ( \(722 ms\) on the same hardware, because Lumbda doesn't link a) Tj T* 0 Tw .315636 Tw (compiled binary or spin up a kernel \227 it just runs a rewriter over five small terms. ) Tj /F3 10 Tf (Cached vs cached) Tj /F1 10 Tf ( is the) Tj T* 0 Tw ET -Q -Q - -endstream -endobj -129 0 obj -<< -/Length 9243 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET -q -1 0 0 1 57.02362 741.0236 cm -q -BT 1 0 0 1 0 14 Tm 1.150966 Tw 12 TL /F1 10 Tf 0 0 0 rg (throwaway benchmark but still interesting: Lumbda asm at 7 ms vs Lean at 5 ms, within 1.5\327, on what is) Tj T* 0 Tw (essentially "read a file and print five lines.") Tj T* ET +BT 1 0 0 1 0 50 Tm .204897 Tw 12 TL /F1 10 Tf 0 0 0 rg (Two comparisons matter. ) Tj /F3 10 Tf (Cold vs cold) Tj /F1 10 Tf ( is the honest end-to-end compare: Lumbda asm \(46 ms\) verifies the) Tj T* 0 Tw -0.127156 Tw (proof ) Tj /F3 10 Tf (~16\327 faster than Lean's cold rebuild) Tj /F1 10 Tf ( \(722 ms\) on the same hardware, because Lumbda doesn't link a) Tj T* 0 Tw .315636 Tw (compiled binary or spin up a kernel \227 it just runs a rewriter over five small terms. ) Tj /F3 10 Tf (Cached vs cached) Tj /F1 10 Tf ( is the) Tj T* 0 Tw 1.150966 Tw (throwaway benchmark but still interesting: Lumbda asm at 7 ms vs Lean at 5 ms, within 1.5\327, on what is) Tj T* 0 Tw (essentially "read a file and print five lines.") Tj T* ET Q Q q -1 0 0 1 57.02362 675.0236 cm +1 0 0 1 57.02362 177.0236 cm q BT 1 0 0 1 0 50 Tm .526772 Tw 12 TL /F3 10 Tf 0 0 0 rg (All four Lumbda tiers verify the proof.) Tj /F1 10 Tf ( A C ) Tj /F5 10 Tf (--fast) Tj /F1 10 Tf ( bytecode-compiler bug originally caused the final tier) Tj T* 0 Tw 10.06986 Tw (to hang on the rewriter's named-let loop; narrowed to a minimal reproduction \(see) Tj T* 0 Tw 1.693196 Tw /F5 10 Tf (c/TODO-named-let-bytecode.md) Tj /F1 10 Tf (\) and worked around in the proof file by using an internal recursive) Tj T* 0 Tw .558138 Tw /F5 10 Tf (define) Tj /F1 10 Tf ( in place of the offending named-let. All four tiers now complete in under 100 ms cold. ) Tj /F3 10 Tf (Reproduce:) Tj /F1 10 Tf T* 0 Tw /F5 10 Tf (make) Tj ( ) Tj (bench-proof) Tj /F1 10 Tf ( \(source: ) Tj /F5 10 Tf (tests/bench-proof.sh) Tj /F1 10 Tf (\).) Tj T* ET Q Q q -1 0 0 1 57.02362 585.0236 cm +1 0 0 1 57.02362 87.02362 cm q BT 1 0 0 1 0 74 Tm 2.513543 Tw 12 TL /F3 10 Tf 0 0 0 rg (First machine-checked treatment.) Tj /F1 10 Tf ( The original paper \(Odrzywo) Tj /F7 10 Tf 12 TL (n) Tj /F1 10 Tf 12 TL (ek, arXiv:2603.21852v2, 2026-04-04\)) Tj T* 0 Tw .313453 Tw (presents the EML universality claim analytically \227 pure LaTeX mathematics, no formal tool. The companion) Tj T* 0 Tw .549873 Tw (Zenodo artifact is symbolic-regression / gradient-optimization code, not a verification. To our knowledge the) Tj T* 0 Tw 1.856373 Tw (Lean 4 proof shipped in this repo is the first machine-checked treatment of the EML identities, and the) Tj T* 0 Tw .247122 Tw (accompanying Lumbda-native checker is the first self-hosted machine-checked version. Five theorems, zero) Tj T* 0 Tw .234556 Tw /F5 10 Tf (sorry) Tj /F1 10 Tf (, no Mathlib dependency \227 40\327 faster than the brute-force numerical search it replaced, and carrying) Tj T* 0 Tw (the additional guarantee that no implementation quirk of floating point can ever break the conclusion.) Tj T* ET Q Q + +endstream +endobj +132 0 obj +<< +/Length 8391 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 553.8236 cm +1 0 0 1 57.02362 751.8236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (9. Language Coverage) Tj T* ET Q Q q -1 0 0 1 57.02362 533.8236 cm +1 0 0 1 57.02362 731.8236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Lumbda implements a near-complete R7RS-small Scheme:) Tj T* ET Q Q q -1 0 0 1 57.02362 479.8236 cm +1 0 0 1 57.02362 677.8236 cm q BT 1 0 0 1 0 38 Tm 1.369223 Tw 12 TL /F3 10 Tf 0 0 0 rg (Special forms) Tj /F1 10 Tf ( \(32\): ) Tj /F5 10 Tf (define) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (set!) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (lambda) Tj /F1 10 Tf (, ) Tj /F5 10 Tf /F6 10 Tf 12 TL (l) Tj /F5 10 Tf 12 TL /F1 10 Tf (, ) Tj /F5 10 Tf (if) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (cond) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (case) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (and) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (or) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (when) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (unless) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (begin) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (let) Tj /F1 10 Tf (,) Tj T* 0 Tw 10.15262 Tw /F5 10 Tf (let*) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (letrec) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (letrec*) Tj /F1 10 Tf (, named-let, ) Tj /F5 10 Tf (do) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (quasiquote) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (define-macro) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (define-syntax) Tj /F1 10 Tf (,) Tj T* 0 Tw 3.646907 Tw /F5 10 Tf (syntax-rules) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (let-syntax) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (letrec-syntax) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (apply) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (values) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (call/cc) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (dynamic-wind) Tj /F1 10 Tf (,) Tj T* 0 Tw /F5 10 Tf (guard) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (parameterize) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (load) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (error) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (module) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (import) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (define-record-type) Tj /F1 10 Tf (.) Tj T* ET Q Q q -1 0 0 1 57.02362 449.8236 cm +1 0 0 1 57.02362 647.8236 cm q BT 1 0 0 1 0 14 Tm .150642 Tw 12 TL /F3 10 Tf 0 0 0 rg (Built-in functions) Tj /F1 10 Tf ( \(100+\): Full arithmetic \(exact rationals, inexact reals, trigonometry\), pairs & lists \(SRFI-1\),) Tj T* 0 Tw (strings \(mutable\), characters, vectors, hash tables, I/O \(ports, file system\), system interface, Python interop.) Tj T* ET Q Q q -1 0 0 1 57.02362 419.8236 cm +1 0 0 1 57.02362 617.8236 cm q BT 1 0 0 1 0 14 Tm 2.274835 Tw 12 TL /F3 10 Tf 0 0 0 rg (Hygienic macros) Tj /F1 10 Tf (: ) Tj /F5 10 Tf (syntax-rules) Tj /F1 10 Tf ( with ellipsis \() Tj /F5 10 Tf (...) Tj /F1 10 Tf (\) support. Pattern matching, template instantiation,) Tj T* 0 Tw (proper hygiene. Also ) Tj /F5 10 Tf (define-macro) Tj /F1 10 Tf ( for procedural macros.) Tj T* ET Q Q q -1 0 0 1 57.02362 389.8236 cm +1 0 0 1 57.02362 587.8236 cm q BT 1 0 0 1 0 14 Tm 1.958835 Tw 12 TL /F3 10 Tf 0 0 0 rg (Standard library) Tj /F1 10 Tf ( \() Tj /F5 10 Tf (stdlib.lsp) Tj /F1 10 Tf (, 385 lines\): Additional macros \() Tj /F5 10 Tf (swap!) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (fluid-let) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (while) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (dotimes) Tj /F1 10 Tf (\),) Tj T* 0 Tw (utility functions, simple object system, SRFI-2/8/64 test framework.) Tj T* ET Q Q q -1 0 0 1 57.02362 335.8236 cm +1 0 0 1 57.02362 533.8236 cm q BT 1 0 0 1 0 38 Tm 1.569862 Tw 12 TL /F3 10 Tf 0 0 0 rg (Test suite) Tj /F1 10 Tf (: 974 verified assertions covering lexing, parsing, special forms, bytecode compilation, macros) Tj T* 0 Tw .214835 Tw (\(hygienic & procedural\), continuations, generators, record types, modules, arithmetic, higher-order functions,) Tj T* 0 Tw 4.238031 Tw (error handling, portal serialization, cross-implementation portal exchange, file I/O parity, & graceful) Tj T* 0 Tw (degradation on mismatched or corrupt input.) Tj T* ET Q Q q -1 0 0 1 57.02362 304.6236 cm +1 0 0 1 57.02362 502.6236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (10. Relationship to Companion Papers) Tj T* ET Q Q q -1 0 0 1 57.02362 284.6236 cm +1 0 0 1 57.02362 482.6236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Lumbda forms one piece of a larger permacomputer machine learning stack:) Tj T* ET Q Q q -1 0 0 1 57.02362 278.6236 cm +1 0 0 1 57.02362 476.6236 cm Q q -1 0 0 1 57.02362 140.6236 cm +1 0 0 1 57.02362 338.6236 cm q 1 1 1 rg n 0 138 481.2283 -18 re f* @@ -6233,34 +6464,25 @@ Q Q Q q -1 0 0 1 57.02362 140.6236 cm +1 0 0 1 57.02362 338.6236 cm Q q -1 0 0 1 57.02362 86.62362 cm +1 0 0 1 57.02362 284.6236 cm q BT 1 0 0 1 0 38 Tm 1.738453 Tw 12 TL /F1 10 Tf 0 0 0 rg (Lumbda provides the runtime layer: a language that can checkpoint its own execution, migrate between) Tj T* 0 Tw 3.051529 Tw (machines, & resume from serialized state. The portal system enables distributed computation across) Tj T* 0 Tw 1.058196 Tw (permacomputer nodes. Categorization & feedback activities could run inside Lumbda's VM, with ) Tj /F5 10 Tf (call/cc) Tj /F1 10 Tf T* 0 Tw (providing the state machine transitions & portal providing persistence.) Tj T* ET Q Q - -endstream -endobj -130 0 obj -<< -/Length 2303 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 751.8236 cm +1 0 0 1 57.02362 253.4236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (11. Four Implementation Tiers, One Language) Tj T* ET Q Q q -1 0 0 1 57.02362 737.8236 cm +1 0 0 1 57.02362 239.4236 cm Q q -1 0 0 1 57.02362 725.8236 cm +1 0 0 1 57.02362 227.4236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -6276,19 +6498,28 @@ Q Q Q q -1 0 0 1 57.02362 725.8236 cm +1 0 0 1 57.02362 227.4236 cm Q q -1 0 0 1 57.02362 647.8236 cm +1 0 0 1 57.02362 149.4236 cm q BT 1 0 0 1 0 62 Tm .778726 Tw 12 TL /F1 10 Tf 0 0 0 rg (Lumbda ships as four independently built tiers: a Python bytecode VM, a C tree-walker, a C bytecode VM,) Tj T* 0 Tw 2.18402 Tw (and a C x86_64 JIT \(the last three packaged in one binary, selectable by flag\), plus a pure-assembly) Tj T* 0 Tw .931492 Tw (interpreter. Each tier is MOAD-isolated from the others \227 a defect surfaced in one is fixed in that tier, not) Tj T* 0 Tw 2.098556 Tw (patched across shared infrastructure. All four run the same ) Tj /F5 10 Tf (.lsp) Tj /F1 10 Tf ( source files and exchange the same) Tj T* 0 Tw 2.266213 Tw (S-expression portal format; \24711.3-\24711.5 demonstrate this end-to-end across sockets, relays, and HTTP) Tj T* 0 Tw (portal transfers.) Tj T* ET Q Q q -1 0 0 1 57.02362 639.8236 cm +1 0 0 1 57.02362 141.4236 cm Q + +endstream +endobj +133 0 obj +<< +/Length 1782 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 137.9875 cm +1 0 0 1 57.02362 263.1875 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -6311,22 +6542,13 @@ Q Q Q q -1 0 0 1 57.02362 129.9875 cm +1 0 0 1 57.02362 255.1875 cm Q q -1 0 0 1 57.02362 121.9875 cm +1 0 0 1 57.02362 247.1875 cm Q - -endstream -endobj -131 0 obj -<< -/Length 11411 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 584.41 cm +1 0 0 1 57.02362 66.57395 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -6349,19 +6571,28 @@ Q Q Q q -1 0 0 1 57.02362 576.41 cm +1 0 0 1 57.02362 62.69291 cm Q + +endstream +endobj +134 0 obj +<< +/Length 13005 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 534.41 cm +1 0 0 1 57.02362 729.0236 cm q BT 1 0 0 1 0 26 Tm -0.132261 Tw 12 TL /F1 10 Tf 0 0 0 rg (Lumbda implements R7RS Scheme in three implementations sharing the same ) Tj /F5 10 Tf (.lsp) Tj /F1 10 Tf ( test files. The language) Tj T* 0 Tw .58213 Tw (is Scheme \(a dialect of Lisp, designed 1975\). The project name plays on Common Lisp \227 this is decidedly) Tj T* 0 Tw (uncommon.) Tj T* ET Q Q q -1 0 0 1 57.02362 528.41 cm +1 0 0 1 57.02362 723.0236 cm Q q -1 0 0 1 57.02362 408.41 cm +1 0 0 1 57.02362 603.0236 cm q 1 1 1 rg n 0 120 481.2283 -30 re f* @@ -6697,52 +6928,52 @@ Q Q Q q -1 0 0 1 57.02362 408.41 cm +1 0 0 1 57.02362 603.0236 cm Q q -1 0 0 1 57.02362 378.41 cm +1 0 0 1 57.02362 573.0236 cm q BT 1 0 0 1 0 14 Tm 1.743453 Tw 12 TL /F1 10 Tf 0 0 0 rg (All C & Python benchmarks measured in-process \(no startup overhead\). Assembly times \(\206\) include full) Tj T* 0 Tw (process lifetime: startup + tokenizer + parser + eval. "\227" = not applicable / interpreted.) Tj T* ET Q Q q -1 0 0 1 57.02362 300.41 cm +1 0 0 1 57.02362 495.0236 cm q BT 1 0 0 1 0 62 Tm .118138 Tw 12 TL /F3 10 Tf 0 0 0 rg (The JIT runs Scheme faster than CPython runs Python.) Tj /F1 10 Tf ( ) Tj /F5 10 Tf (ack\(3,4\)) Tj /F1 10 Tf ( completes in 0.19 ms \(JIT\) vs 1.3 ms) Tj T* 0 Tw .050491 Tw (\(CPython\) \227 7\327 faster. ) Tj /F5 10 Tf (sum-to\(50000\)) Tj /F1 10 Tf ( completes in 0.55 ms \(JIT\) vs 5.5 ms \(CPython\) \227 10\327 faster. The) Tj T* 0 Tw .368556 Tw (JIT compiles Scheme AST directly to x86_64 machine code via ) Tj /F5 10 Tf (mmap\(PROT_EXEC\)) Tj /F1 10 Tf ( & raw byte emission. It) Tj T* 0 Tw 2.31631 Tw (handles ) Tj /F5 10 Tf (if) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (cond) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (and) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (or) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (let) Tj /F1 10 Tf (, named-let loops \(native ) Tj /F5 10 Tf (jmp) Tj /F1 10 Tf ( \227 zero call overhead\), ) Tj /F5 10 Tf (car) Tj /F1 10 Tf (/) Tj /F5 10 Tf (cdr) Tj /F1 10 Tf (/) Tj /F5 10 Tf (cons) Tj /F1 10 Tf (,) Tj T* 0 Tw .786027 Tw (arithmetic, comparisons, & self-recursive calls. Functions that use ) Tj /F5 10 Tf (call/cc) Tj /F1 10 Tf (, macros, or complex forms fall) Tj T* 0 Tw (back to the interpreter.) Tj T* ET Q Q q -1 0 0 1 57.02362 186.41 cm +1 0 0 1 57.02362 381.0236 cm q BT 1 0 0 1 0 98 Tm .274168 Tw 12 TL /F3 10 Tf 0 0 0 rg (The assembly implementation proves the language runs on bare metal.) Tj /F1 10 Tf ( 4,968 lines of ) Tj /F3 10 Tf (GNU assembler) Tj T* 0 Tw .459104 Tw (\(GAS, AT) Tj (&) Tj (T syntax\)) Tj /F1 10 Tf (, ) Tj /F3 10 Tf (22 KB stripped binary) Tj /F1 10 Tf (, zero external dependencies. Fourteen Linux syscalls \() Tj /F5 10 Tf (read) Tj /F1 10 Tf (,) Tj T* 0 Tw 7.484835 Tw /F5 10 Tf (write) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (open) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (close) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (lseek) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (mmap) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (munmap) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (socket) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (connect) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (accept) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (bind) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (listen) Tj /F1 10 Tf (,) Tj T* 0 Tw 2.397122 Tw /F5 10 Tf (clock_gettime) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (exit) Tj /F1 10 Tf (\) \227 no libc, no stdlib. A bump allocator with ) Tj /F5 10 Tf (heap-snapshot) Tj /F1 10 Tf (/) Tj /F5 10 Tf (heap-restore) Tj /F1 10 Tf T* 0 Tw .123835 Tw (arena primitives, tag-in-low-3-bits values, ) Tj /F3 10 Tf (91 builtins) Tj /F1 10 Tf ( \(including ) Tj /F5 10 Tf (load) Tj /F1 10 Tf (, ports, ) Tj /F5 10 Tf (write-file) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (file-) Tj (>) Tj (string) Tj /F1 10 Tf (,) Tj T* 0 Tw 6.731043 Tw /F5 10 Tf (portal-save) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (portal-resume) Tj /F1 10 Tf (, the six ) Tj /F5 10 Tf (tcp-*) Tj /F1 10 Tf ( socket primitives, ) Tj /F5 10 Tf (read-from-string) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf (,) Tj T* 0 Tw 6.946027 Tw /F5 10 Tf (symbol-) Tj (>) Tj (string) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (current-time-ms) Tj /F1 10 Tf (\), & TCO via ) Tj /F5 10 Tf (jmp) Tj /F1 10 Tf (. It runs ) Tj /F5 10 Tf (\(ack) Tj ( ) Tj (3) Tj ( ) Tj (4\)) Tj ( ) Tj (=) Tj ( ) Tj (125) Tj /F1 10 Tf ( &) Tj T* 0 Tw 2.133223 Tw /F5 10 Tf (\(fib) Tj ( ) Tj (35\)) Tj ( ) Tj (=) Tj ( ) Tj (9227465) Tj /F1 10 Tf ( correctly, serves HTTP at ) Tj /F3 10 Tf (2,994 req/s) Tj /F1 10 Tf (, and survives indefinitely with flat O\(1\)) Tj T* 0 Tw (memory when the programmer uses the snapshot/restore arena in a per-request loop.) Tj T* ET Q Q q -1 0 0 1 57.02362 132.41 cm +1 0 0 1 57.02362 327.0236 cm q BT 1 0 0 1 0 38 Tm 2.546213 Tw 12 TL /F3 10 Tf 0 0 0 rg (The bytecode VM delivers 7--19\327 speedup over tree-walking.) Tj /F1 10 Tf ( The Python implementation compiles) Tj T* 0 Tw .411147 Tw (Scheme to 40 opcodes \(plus 20 specialized & 5 superinstructions\), executed on an explicit frame stack with) Tj T* 0 Tw 1.206213 Tw (inline caching, constant folding, & peephole optimization. Full first-class continuations \(multi-shot, upward\)) Tj T* 0 Tw (enable generators, coroutines, & machine state migration via portal.) Tj T* ET Q Q q -1 0 0 1 57.02362 106.41 cm +1 0 0 1 57.02362 301.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (11.1 Test Coverage) Tj T* ET Q Q q -1 0 0 1 57.02362 88.41004 cm +1 0 0 1 57.02362 283.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (975 verified assertions) Tj /F1 10 Tf ( across all implementations, all green under ) Tj /F5 10 Tf (make) Tj ( ) Tj (test-all) Tj /F1 10 Tf (:) Tj T* ET Q Q q -1 0 0 1 57.02362 82.41004 cm +1 0 0 1 57.02362 277.0236 cm Q q -1 0 0 1 57.02362 82.41004 cm +1 0 0 1 57.02362 277.0236 cm Q q -1 0 0 1 57.02362 70.41004 cm +1 0 0 1 57.02362 265.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -6764,19 +6995,10 @@ Q Q Q q -1 0 0 1 57.02362 64.41004 cm +1 0 0 1 57.02362 259.0236 cm Q - -endstream -endobj -132 0 obj -<< -/Length 16012 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 753.0236 cm +1 0 0 1 57.02362 247.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -6798,10 +7020,10 @@ Q Q Q q -1 0 0 1 57.02362 747.0236 cm +1 0 0 1 57.02362 241.0236 cm Q q -1 0 0 1 57.02362 735.0236 cm +1 0 0 1 57.02362 229.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -6823,10 +7045,10 @@ Q Q Q q -1 0 0 1 57.02362 729.0236 cm +1 0 0 1 57.02362 223.0236 cm Q q -1 0 0 1 57.02362 717.0236 cm +1 0 0 1 57.02362 211.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -6848,38 +7070,47 @@ Q Q Q q -1 0 0 1 57.02362 699.0236 cm +1 0 0 1 57.02362 193.0236 cm Q q -1 0 0 1 57.02362 657.0236 cm +1 0 0 1 57.02362 151.0236 cm q BT 1 0 0 1 0 26 Tm .98631 Tw 12 TL /F1 10 Tf 0 0 0 rg (The shared functional suite matters: it runs byte-identical Scheme source through two different runtimes &) Tj T* 0 Tw .353432 Tw (compares output. Python & C agree 189 times per run. When they disagree, that tells us something specific) Tj T* 0 Tw (& actionable.) Tj T* ET Q Q q -1 0 0 1 57.02362 627.0236 cm +1 0 0 1 57.02362 121.0236 cm q BT 1 0 0 1 0 14 Tm 3.001043 Tw 12 TL /F1 10 Tf 0 0 0 rg (Cross-implementation portal exchange is verified separately: ) Tj /F5 10 Tf (tests/portal-cross-test.sh) Tj /F1 10 Tf ( runs 9) Tj T* 0 Tw (producer\327consumer combinations. All 9 green.) Tj T* ET Q Q q -1 0 0 1 57.02362 601.0236 cm +1 0 0 1 57.02362 95.02362 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (11.2 File I/O Parity) Tj T* ET Q Q q -1 0 0 1 57.02362 571.0236 cm +1 0 0 1 57.02362 65.02362 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .155596 Tw (All three implementations share the same minimal file I/O vocabulary \227 discovered necessary while building) Tj T* 0 Tw (the cross-impl portal:) Tj T* ET Q Q q -1 0 0 1 57.02362 565.0236 cm +1 0 0 1 57.02362 62.69291 cm Q + +endstream +endobj +135 0 obj +<< +/Length 16993 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 385.0236 cm +1 0 0 1 57.02362 585.0236 cm q 1 1 1 rg n 0 180 481.2283 -18 re f* @@ -7272,32 +7503,32 @@ Q Q Q q -1 0 0 1 57.02362 385.0236 cm +1 0 0 1 57.02362 585.0236 cm Q q -1 0 0 1 57.02362 319.0236 cm +1 0 0 1 57.02362 519.0236 cm q BT 1 0 0 1 0 50 Tm .254609 Tw 12 TL /F1 10 Tf 0 0 0 rg (The asm port representation deserves a note. Because all three tag bits are consumed by the existing value) Tj T* 0 Tw 4.102038 Tw (types \(int/pair/sym/closure/builtin/special/string/vector\), we encode ports as ) Tj /F5 10 Tf (SPECIAL) Tj /F1 10 Tf ( values ) Tj /F6 10 Tf 12 TL (\263) Tj /F1 10 Tf 12 TL ( 1000:) Tj T* 0 Tw 8.520835 Tw /F5 10 Tf (port_val) Tj ( ) Tj (=) Tj ( ) Tj (\(\(PORT_SPECIAL_BASE) Tj ( ) Tj (+) Tj ( ) Tj (fd\)) Tj ( ) Tj (<) Tj (<) Tj ( ) Tj (3\)) Tj ( ) Tj (|) Tj ( ) Tj (TAG_SPECIAL) Tj /F1 10 Tf (. Extraction is) Tj T* 0 Tw .162256 Tw /F5 10 Tf (fd) Tj ( ) Tj (=) Tj ( ) Tj (\(val) Tj ( ) Tj (>) Tj (>) Tj ( ) Tj (3\)) Tj ( ) Tj (-) Tj ( ) Tj (PORT_SPECIAL_BASE) Tj /F1 10 Tf (. ) Tj /F5 10 Tf (port?) Tj /F1 10 Tf ( is a range check. No tag expansion, no heap object,) Tj T* 0 Tw (no allocator pressure \227 the port is the file descriptor, wrapped.) Tj T* ET Q Q q -1 0 0 1 57.02362 293.0236 cm +1 0 0 1 57.02362 493.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (11.3 Sockets: One HTTP Server, Three Runtimes) Tj T* ET Q Q q -1 0 0 1 57.02362 275.0236 cm +1 0 0 1 57.02362 475.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Six primitives extend the file-I/O vocabulary to TCP:) Tj T* ET Q Q q -1 0 0 1 57.02362 269.0236 cm +1 0 0 1 57.02362 469.0236 cm Q q -1 0 0 1 57.02362 131.0236 cm +1 0 0 1 57.02362 331.0236 cm q 1 1 1 rg n 0 138 481.2283 -18 re f* @@ -7579,31 +7810,22 @@ Q Q Q q -1 0 0 1 57.02362 131.0236 cm +1 0 0 1 57.02362 331.0236 cm Q q -1 0 0 1 57.02362 89.02362 cm +1 0 0 1 57.02362 289.0236 cm q BT 1 0 0 1 0 26 Tm .215176 Tw 12 TL /F1 10 Tf 0 0 0 rg (Sockets share the same port representation as files \227 in asm the fd is packed into ) Tj /F5 10 Tf (SPECIAL) Tj /F1 10 Tf ( values ) Tj /F6 10 Tf 12 TL (\263) Tj /F1 10 Tf 12 TL ( 1000,) Tj T* 0 Tw .794123 Tw (in Python + C the fd lives inside an existing ULPort struct. ) Tj /F5 10 Tf (read) Tj /F1 10 Tf (/) Tj /F5 10 Tf (write) Tj /F1 10 Tf ( unify because to Linux a socket is) Tj T* 0 Tw (just an fd.) Tj T* ET Q Q - -endstream -endobj -133 0 obj -<< -/Length 8993 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 741.0236 cm +1 0 0 1 57.02362 259.0236 cm q BT 1 0 0 1 0 14 Tm .886796 Tw 12 TL /F5 10 Tf 0 0 0 rg (examples/http-server.lsp) Tj /F1 10 Tf ( is a 90-line HTTP/1.0 server. It parses a request line, dispatches by path,) Tj T* 0 Tw (and returns 200/404 with Content-Length. The same file runs unmodified in all three impls:) Tj T* ET Q Q q -1 0 0 1 57.02362 691.0236 cm +1 0 0 1 57.02362 209.0236 cm q q 1 0 0 1 0 0 cm @@ -7623,45 +7845,43 @@ Q Q Q q -1 0 0 1 57.02362 635.0236 cm +1 0 0 1 57.02362 153.0236 cm q BT 1 0 0 1 0 38 Tm -0.093471 Tw 12 TL /F1 10 Tf 0 0 0 rg (The companion ) Tj /F5 10 Tf (examples/http-client-bench.lsp) Tj /F1 10 Tf ( is a 45-line load generator using only the six ) Tj /F5 10 Tf (tcp-*) Tj /F1 10 Tf T* 0 Tw 2.952577 Tw (primitives plus ) Tj /F5 10 Tf (current-time-ms) Tj /F1 10 Tf (. In-process client eliminates the ~2 ms/request fork overhead that) Tj T* 0 Tw 1.553486 Tw (curl-based benchmarks suffer, so real server throughput shows through. ) Tj /F3 10 Tf (Reproduce:) Tj /F1 10 Tf ( ) Tj /F5 10 Tf (make) Tj ( ) Tj (bench-web) Tj /F1 10 Tf T* 0 Tw (\(source: ) Tj /F5 10 Tf (tests/web-benchmark.sh) Tj /F1 10 Tf (\).) Tj T* ET Q Q q -1 0 0 1 57.02362 629.0236 cm +1 0 0 1 57.02362 147.0236 cm Q q -1 0 0 1 57.02362 539.0236 cm +1 0 0 1 57.02362 75.02362 cm q 1 1 1 rg -n 0 90 481.2283 -18 re f* -.878431 .878431 .878431 rg n 0 72 481.2283 -18 re f* -1 1 1 rg -n 0 54 481.2283 -18 re f* .878431 .878431 .878431 rg -n 0 36 481.2283 -18 re f* +n 0 54 481.2283 -18 re f* 1 1 1 rg +n 0 36 481.2283 -18 re f* +.878431 .878431 .878431 rg n 0 18 481.2283 -18 re f* 0 0 0 rg BT /F3 10 Tf 12 TL ET q -1 0 0 1 6 75 cm +1 0 0 1 6 57 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 111.934 0 Td (Pair) Tj T* -111.934 0 Td ET Q Q q -1 0 0 1 260.7679 75 cm +1 0 0 1 260.7679 57 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 18.3801 0 Td (Requests/sec) Tj T* -18.3801 0 Td ET Q Q q -1 0 0 1 373.9981 75 cm +1 0 0 1 373.9981 57 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 18.3801 0 Td (vs curl bench) Tj T* -18.3801 0 Td ET @@ -7670,69 +7890,102 @@ Q 0 0 0 rg BT /F1 10 Tf 12 TL ET q -1 0 0 1 6 57 cm +1 0 0 1 6 39 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Python server ) Tj /F6 10 Tf 12 TL (\254) Tj /F1 10 Tf 12 TL ( Python client) Tj T* ET Q Q q -1 0 0 1 260.7679 57 cm +1 0 0 1 260.7679 39 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (2,403) Tj T* ET Q Q q -1 0 0 1 373.9981 57 cm +1 0 0 1 373.9981 39 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (6.3\327) Tj T* ET Q Q q -1 0 0 1 6 39 cm +1 0 0 1 6 21 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (C server ) Tj /F6 10 Tf 12 TL (\254) Tj /F1 10 Tf 12 TL ( C client) Tj T* ET Q Q q -1 0 0 1 260.7679 39 cm +1 0 0 1 260.7679 21 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (2,439) Tj T* ET Q Q q -1 0 0 1 373.9981 39 cm +1 0 0 1 373.9981 21 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (6.4\327) Tj T* ET Q Q q -1 0 0 1 6 21 cm +1 0 0 1 6 3 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (asm server ) Tj /F6 10 Tf 12 TL (\254) Tj /F1 10 Tf 12 TL ( asm client) Tj T* ET Q Q q -1 0 0 1 260.7679 21 cm +1 0 0 1 260.7679 3 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (2,994) Tj T* ET Q Q q -1 0 0 1 373.9981 21 cm +1 0 0 1 373.9981 3 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (7.8\327) Tj T* ET Q Q q +1 J +1 j +0 0 0 RG +.25 w +n 0 0 m 481.2283 0 l S +n 0 54 m 481.2283 54 l S +n 0 36 m 481.2283 36 l S +n 0 18 m 481.2283 18 l S +n 254.7679 0 m 254.7679 72 l S +n 367.9981 0 m 367.9981 72 l S +n 0 72 m 481.2283 72 l S +n 0 0 m 0 72 l S +n 481.2283 0 m 481.2283 72 l S +Q +Q +Q + +endstream +endobj +136 0 obj +<< +/Length 9833 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 57.02362 747.0236 cm +q +1 1 1 rg +n 0 18 481.2283 -18 re f* +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q 1 0 0 1 6 3 cm q 0 0 0 rg @@ -7758,45 +8011,41 @@ q 1 j 0 0 0 RG .25 w -n 0 72 m 481.2283 72 l S -n 0 54 m 481.2283 54 l S -n 0 36 m 481.2283 36 l S n 0 18 m 481.2283 18 l S -n 254.7679 0 m 254.7679 90 l S -n 367.9981 0 m 367.9981 90 l S -n 0 90 m 481.2283 90 l S +n 254.7679 0 m 254.7679 18 l S +n 367.9981 0 m 367.9981 18 l S +n 0 0 m 0 18 l S +n 481.2283 0 m 481.2283 18 l S n 0 0 m 481.2283 0 l S -n 0 0 m 0 90 l S -n 481.2283 0 m 481.2283 90 l S Q Q Q q -1 0 0 1 57.02362 539.0236 cm +1 0 0 1 57.02362 747.0236 cm Q q -1 0 0 1 57.02362 509.0236 cm +1 0 0 1 57.02362 717.0236 cm q BT 1 0 0 1 0 14 Tm .163917 Tw 12 TL /F1 10 Tf 0 0 0 rg (\(The asm-server / asm-client pair is the fastest cell here \227 2,994 req/s from a 22 KB binary, served & driven) Tj T* 0 Tw (by the same 22 KB binary.\)) Tj T* ET Q Q q -1 0 0 1 57.02362 467.0236 cm +1 0 0 1 57.02362 675.0236 cm q BT 1 0 0 1 0 26 Tm .050596 Tw 12 TL /F1 10 Tf 0 0 0 rg (For external comparison: ) Tj /F5 10 Tf (python3) Tj ( ) Tj (-m) Tj ( ) Tj (http.server) Tj /F1 10 Tf ( and busybox httpd both land around 382 req/s under) Tj T* 0 Tw 1.458334 Tw (a curl client on the same machine. When driven by an in-process client they hit the same ceiling as our) Tj T* 0 Tw (servers \227 the bottleneck has always been the client fork/exec, not the server.) Tj T* ET Q Q q -1 0 0 1 57.02362 413.0236 cm +1 0 0 1 57.02362 621.0236 cm q BT 1 0 0 1 0 38 Tm 2.116575 Tw 12 TL /F3 10 Tf 0 0 0 rg (What's remarkable is not the speed.) Tj /F1 10 Tf ( It is that a 22 KB binary with zero libc dependency and seven) Tj T* 0 Tw .829353 Tw (canonical Linux syscalls plus the socket family runs HTTP as fast as anything else on the machine, with a) Tj T* 0 Tw .829272 Tw (protocol handler written in portable Scheme that runs byte-for-byte in all three runtimes. The asm binary is) Tj T* 0 Tw /F3 10 Tf (96\327 smaller than busybox httpd) Tj /F1 10 Tf ( \(2.1 MB\) and ) Tj /F3 10 Tf (360\327 smaller than the Python interpreter) Tj /F1 10 Tf ( alone \(8 MB\).) Tj T* ET Q Q q -1 0 0 1 57.02362 405.0236 cm +1 0 0 1 57.02362 613.0236 cm Q q -1 0 0 1 57.02362 354.4202 cm +1 0 0 1 57.02362 562.4202 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7819,29 +8068,29 @@ Q Q Q q -1 0 0 1 57.02362 346.4202 cm +1 0 0 1 57.02362 554.4202 cm Q q -1 0 0 1 57.02362 320.4202 cm +1 0 0 1 57.02362 528.4202 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (11.4 S-expressions over Sockets: RPC, REPL, and Chains) Tj T* ET Q Q q -1 0 0 1 57.02362 278.4202 cm +1 0 0 1 57.02362 486.4202 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .048022 Tw (The HTTP example sends request-line bytes and response-line bytes. Those bytes don't have to be HTTP. If) Tj T* 0 Tw .199913 Tw (both sides of the wire speak Scheme, the wire protocol can be Scheme source itself \227 the reader is already) Tj T* 0 Tw (the parser you need. Two new builtins close the loop in all three impls:) Tj T* ET Q Q q -1 0 0 1 57.02362 272.4202 cm +1 0 0 1 57.02362 480.4202 cm Q q -1 0 0 1 57.02362 272.4202 cm +1 0 0 1 57.02362 480.4202 cm Q q -1 0 0 1 57.02362 260.4202 cm +1 0 0 1 57.02362 468.4202 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7863,10 +8112,10 @@ Q Q Q q -1 0 0 1 57.02362 254.4202 cm +1 0 0 1 57.02362 462.4202 cm Q q -1 0 0 1 57.02362 230.4202 cm +1 0 0 1 57.02362 438.4202 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7888,54 +8137,45 @@ Q Q Q q -1 0 0 1 57.02362 212.4202 cm +1 0 0 1 57.02362 420.4202 cm Q q -1 0 0 1 57.02362 194.4202 cm +1 0 0 1 57.02362 402.4202 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Two server patterns emerge:) Tj T* ET Q Q q -1 0 0 1 57.02362 152.4202 cm +1 0 0 1 57.02362 360.4202 cm q BT 1 0 0 1 0 26 Tm .027362 Tw 12 TL /F3 10 Tf 0 0 0 rg (Whitelisted RPC) Tj /F1 10 Tf ( \() Tj /F5 10 Tf (examples/rpc-server.lsp) Tj /F1 10 Tf (, 90 lines\). The server reads a request sexp, dispatches by) Tj T* 0 Tw 1.114908 Tw (car on a closed set \() Tj /F5 10 Tf (ping) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (add) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (mul) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (fib) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (echo) Tj /F1 10 Tf (\), never calls ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf ( on client input. Safe by construction.) Tj T* 0 Tw (Uses ) Tj /F5 10 Tf (heap-snapshot) Tj /F1 10 Tf (/) Tj /F5 10 Tf (heap-restore) Tj /F1 10 Tf ( for O\(1\) memory on asm.) Tj T* ET Q Q q -1 0 0 1 57.02362 86.42016 cm +1 0 0 1 57.02362 294.4202 cm q BT 1 0 0 1 0 50 Tm .076027 Tw 12 TL /F3 10 Tf 0 0 0 rg (Full remote REPL) Tj /F1 10 Tf ( \() Tj /F5 10 Tf (examples/repl-server.lsp) Tj /F1 10 Tf (, 70 lines\). The server reads a request sexp and passes) Tj T* 0 Tw .534609 Tw (it straight to ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf (. Persistent global env across connections; ) Tj /F5 10 Tf (\(define) Tj ( ) Tj (x) Tj ( ) Tj (42\)) Tj /F1 10 Tf ( from one call is visible from) Tj T* 0 Tw 1.463453 Tw (the next. DANGER: any reachable client can run arbitrary Scheme in-process. Deliberately does not use) Tj T* 0 Tw .876027 Tw /F5 10 Tf (heap-snapshot) Tj /F1 10 Tf ( because remote ) Tj /F5 10 Tf (define) Tj /F1 10 Tf ( adds bindings past any snapshot point; the ) Tj /F5 10 Tf (ulimit) Tj ( ) Tj (-v) Tj /F1 10 Tf ( safety) Tj T* 0 Tw (cap \(512 MB\) backstops the leak.) Tj T* ET Q Q - -endstream -endobj -134 0 obj -<< -/Length 8835 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 741.0236 cm +1 0 0 1 57.02362 264.4202 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .909903 Tw (Both patterns run byte-identically in Python, C, and asm. The 3\3273 server\327client matrix is 9/9 green \227 any) Tj T* 0 Tw (runtime can host either side.) Tj T* ET Q Q q -1 0 0 1 57.02362 699.0236 cm +1 0 0 1 57.02362 222.4202 cm q BT 1 0 0 1 0 26 Tm 1.432577 Tw 12 TL /F3 10 Tf 0 0 0 rg (Chains: relays across runtimes.) Tj /F1 10 Tf ( A transparent relay \() Tj /F5 10 Tf (examples/rpc-relay.lsp) Tj /F1 10 Tf (, 50 lines\) accepts a) Tj T* 0 Tw 1.39989 Tw (connection, forwards the request bytes to a backend without parsing, relays the reply back. Because the) Tj T* 0 Tw (envelope is Scheme source and the relay never opens it, chains of arbitrary runtimes compose naturally:) Tj T* ET Q Q q -1 0 0 1 57.02362 693.0236 cm +1 0 0 1 57.02362 216.4202 cm Q q -1 0 0 1 57.02362 603.0236 cm +1 0 0 1 57.02362 126.4202 cm q 1 1 1 rg n 0 90 481.2283 -18 re f* @@ -8075,48 +8315,63 @@ Q Q Q q -1 0 0 1 57.02362 603.0236 cm +1 0 0 1 57.02362 126.4202 cm Q q -1 0 0 1 57.02362 537.0236 cm +1 0 0 1 57.02362 84.42016 cm q -BT 1 0 0 1 0 50 Tm 1.815464 Tw 12 TL /F1 10 Tf 0 0 0 rg (Each relay hop costs ~650 \265s \(one full TCP round-trip + context switches on the same host, no actual) Tj T* 0 Tw 5.709882 Tw (parsing work\). The relay never allocates anything beyond a transient buffer; on asm it uses) Tj T* 0 Tw 1.25985 Tw /F5 10 Tf (heap-snapshot) Tj /F1 10 Tf (/) Tj /F5 10 Tf (heap-restore) Tj /F1 10 Tf ( to keep memory flat under load. Four runtimes strung together through) Tj T* 0 Tw 3.232362 Tw (two relay machines, the same ) Tj /F5 10 Tf (.lsp) Tj /F1 10 Tf ( on every hop. ) Tj /F3 10 Tf (Reproduce:) Tj /F1 10 Tf ( ) Tj /F5 10 Tf (make) Tj ( ) Tj (bench-rpc-chain) Tj /F1 10 Tf ( \(source:) Tj T* 0 Tw /F5 10 Tf (tests/rpc-chain-bench.sh) Tj /F1 10 Tf (\).) Tj T* ET +BT 1 0 0 1 0 26 Tm 1.815464 Tw 12 TL /F1 10 Tf 0 0 0 rg (Each relay hop costs ~650 \265s \(one full TCP round-trip + context switches on the same host, no actual) Tj T* 0 Tw 5.709882 Tw (parsing work\). The relay never allocates anything beyond a transient buffer; on asm it uses) Tj T* 0 Tw 1.25985 Tw /F5 10 Tf (heap-snapshot) Tj /F1 10 Tf (/) Tj /F5 10 Tf (heap-restore) Tj /F1 10 Tf ( to keep memory flat under load. Four runtimes strung together through) Tj T* 0 Tw ET +Q +Q + +endstream +endobj +137 0 obj +<< +/Length 7387 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 57.02362 741.0236 cm +q +BT 1 0 0 1 0 14 Tm 3.232362 Tw 12 TL /F1 10 Tf 0 0 0 rg (two relay machines, the same ) Tj /F5 10 Tf (.lsp) Tj /F1 10 Tf ( on every hop. ) Tj /F3 10 Tf (Reproduce:) Tj /F1 10 Tf ( ) Tj /F5 10 Tf (make) Tj ( ) Tj (bench-rpc-chain) Tj /F1 10 Tf ( \(source:) Tj T* 0 Tw /F5 10 Tf (tests/rpc-chain-bench.sh) Tj /F1 10 Tf (\).) Tj T* ET Q Q q -1 0 0 1 57.02362 495.0236 cm +1 0 0 1 57.02362 699.0236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .921575 Tw (The result is not a performance story \227 it is a composition story. S-expressions are the envelope and the) Tj T* 0 Tw .649925 Tw (payload. A 22 KB binary can be a backend, a relay, a client, or any point in a chain; the protocol needs no) Tj T* 0 Tw (separate definition because the protocol IS the language.) Tj T* ET Q Q q -1 0 0 1 57.02362 469.0236 cm +1 0 0 1 57.02362 673.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (11.5 Portal over HTTP: State Transfer Between Machines) Tj T* ET Q Q q -1 0 0 1 57.02362 427.0236 cm +1 0 0 1 57.02362 631.0236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .273647 Tw (The HTTP server carries request bytes. The portal serializes machine state to bytes. Combine them: a node) Tj T* 0 Tw .711667 Tw (exposes its state as an HTTP endpoint, another node pulls that endpoint down and resumes. This was the) Tj T* 0 Tw (first item in \24713 Future Work \227 it is now a running demo.) Tj T* ET Q Q q -1 0 0 1 57.02362 385.0236 cm +1 0 0 1 57.02362 589.0236 cm q BT 1 0 0 1 0 26 Tm .363486 Tw 12 TL /F5 10 Tf 0 0 0 rg (examples/portal-http-server.lsp) Tj /F1 10 Tf ( holds some state \(integer counter, list, string, the result of fib\(30\)\)) Tj T* 0 Tw 1.391223 Tw (and answers ) Tj /F5 10 Tf (GET) Tj ( ) Tj (/portal) Tj /F1 10 Tf ( with an S-expression portal body \227 literally a sequence of ) Tj /F5 10 Tf (\(define) Tj ( ) Tj (...\)) Tj /F1 10 Tf T* 0 Tw (forms.) Tj T* ET Q Q q -1 0 0 1 57.02362 343.0236 cm +1 0 0 1 57.02362 547.0236 cm q BT 1 0 0 1 0 26 Tm 1.574395 Tw 12 TL /F5 10 Tf 0 0 0 rg (examples/portal-http-client.lsp) Tj /F1 10 Tf ( dials the endpoint, strips the HTTP headers, splits the body by) Tj T* 0 Tw 2.070759 Tw (newline, and for each non-empty, non-comment line calls ) Tj /F5 10 Tf (\(eval) Tj ( ) Tj (\(read-from-string) Tj ( ) Tj (line\)\)) Tj /F1 10 Tf (. The) Tj T* 0 Tw (remote bindings become local.) Tj T* ET Q Q q -1 0 0 1 57.02362 206.6236 cm +1 0 0 1 57.02362 410.6236 cm q q 1 0 0 1 0 0 cm @@ -8136,41 +8391,32 @@ Q Q Q q -1 0 0 1 57.02362 150.6236 cm +1 0 0 1 57.02362 354.6236 cm q BT 1 0 0 1 0 38 Tm .351019 Tw 12 TL /F3 10 Tf 0 0 0 rg (3\3273 matrix green:) Tj /F1 10 Tf ( Python/C/asm in any role \227 server or client or both \227 exchange state correctly. All nine) Tj T* 0 Tw 2.399835 Tw (combinations verified. ) Tj /F5 10 Tf (examples/portal-http-client.lsp) Tj /F1 10 Tf ( is 90 lines of portable Scheme; the full) Tj T* 0 Tw 3.611529 Tw (round-trip uses only the six ) Tj /F5 10 Tf (tcp-*) Tj /F1 10 Tf ( primitives plus ) Tj /F5 10 Tf (read-from-string) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf (, and standard string) Tj T* 0 Tw (manipulation.) Tj T* ET Q Q q -1 0 0 1 57.02362 96.62362 cm +1 0 0 1 57.02362 300.6236 cm q BT 1 0 0 1 0 38 Tm 1.468556 Tw 12 TL /F1 10 Tf 0 0 0 rg (The client needs ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf ( semantics that install define-bindings in the global env regardless of the dynamic) Tj T* 0 Tw .000439 Tw (scope of the ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf ( call. Python and C originally evaluated the ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf ( result in the caller's env, which worked at) Tj T* 0 Tw .282545 Tw (top level but silently failed inside a helper function. A two-line fix in each \() Tj /F5 10 Tf (env) Tj ( ) Tj (=) Tj ( ) Tj (env.g) Tj /F1 10 Tf ( in Python's ) Tj /F5 10 Tf (leval) Tj /F1 10 Tf (,) Tj T* 0 Tw /F5 10 Tf (env) Tj ( ) Tj (=) Tj ( ) Tj (env-) Tj (>) Tj (global) Tj /F1 10 Tf ( in C's SYM_EVAL branch\) aligns both with asm's long-standing ) Tj /F5 10 Tf (bi_eval) Tj /F1 10 Tf ( behavior.) Tj T* ET Q Q q -1 0 0 1 57.02362 66.62362 cm +1 0 0 1 57.02362 270.6236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 3.231772 Tw (This is the closing demonstration of "feedback is all you need" extended across all four scopes. A) Tj T* 0 Tw (continuation-style value \227 here, a set of bindings \227 travels:) Tj T* ET Q Q q -1 0 0 1 57.02362 62.69291 cm -Q - -endstream -endobj -135 0 obj -<< -/Length 7115 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET -q -1 0 0 1 57.02362 765.0236 cm +1 0 0 1 57.02362 264.6236 cm Q q -1 0 0 1 57.02362 753.0236 cm +1 0 0 1 57.02362 264.6236 cm +Q +q +1 0 0 1 57.02362 252.6236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8192,10 +8438,10 @@ Q Q Q q -1 0 0 1 57.02362 747.0236 cm +1 0 0 1 57.02362 246.6236 cm Q q -1 0 0 1 57.02362 735.0236 cm +1 0 0 1 57.02362 234.6236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8218,10 +8464,10 @@ Q Q Q q -1 0 0 1 57.02362 729.0236 cm +1 0 0 1 57.02362 228.6236 cm Q q -1 0 0 1 57.02362 717.0236 cm +1 0 0 1 57.02362 216.6236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8244,10 +8490,10 @@ Q Q Q q -1 0 0 1 57.02362 711.0236 cm +1 0 0 1 57.02362 210.6236 cm Q q -1 0 0 1 57.02362 699.0236 cm +1 0 0 1 57.02362 198.6236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8270,36 +8516,45 @@ Q Q Q q -1 0 0 1 57.02362 681.0236 cm +1 0 0 1 57.02362 180.6236 cm Q q -1 0 0 1 57.02362 651.0236 cm +1 0 0 1 57.02362 150.6236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .68135 Tw (The wire protocol and the language are the same artifact. A 22 KB binary can be any node in any chain of) Tj T* 0 Tw (any scope.) Tj T* ET Q Q q -1 0 0 1 57.02362 625.0236 cm +1 0 0 1 57.02362 124.6236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (11.6 heap-snapshot: The Arena Escape Hatch) Tj T* ET Q Q q -1 0 0 1 57.02362 583.0236 cm +1 0 0 1 57.02362 82.62362 cm q BT 1 0 0 1 0 26 Tm -0.12705 Tw 12 TL /F1 10 Tf 0 0 0 rg (The asm bump allocator has no GC. Every ) Tj /F5 10 Tf (string-append) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (tcp-recv) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (make-pair) Tj /F1 10 Tf (, or similar per-request) Tj T* 0 Tw 1.173647 Tw (allocation grows r15. Over a long-running server that is an unbounded leak \227 an incident on 2026-04-16) Tj T* 0 Tw (drove an asm server to 19.3 GB RSS before being killed.) Tj T* ET Q Q q -1 0 0 1 57.02362 565.0236 cm +1 0 0 1 57.02362 64.62362 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Two new builtins fix this without introducing a collector:) Tj T* ET Q Q + +endstream +endobj +138 0 obj +<< +/Length 6545 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 524.6236 cm +1 0 0 1 57.02362 732.6236 cm q q 1 0 0 1 0 0 cm @@ -8319,21 +8574,21 @@ Q Q Q q -1 0 0 1 57.02362 492.6236 cm +1 0 0 1 57.02362 700.6236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .828138 Tw (Python + C expose the same names as no-ops \(their real GCs already handle this\). Portable Scheme can) Tj T* 0 Tw (call them unconditionally.) Tj T* ET Q Q q -1 0 0 1 57.02362 474.6236 cm +1 0 0 1 57.02362 682.6236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The pattern is narrow by design:) Tj T* ET Q Q q -1 0 0 1 57.02362 405.4236 cm +1 0 0 1 57.02362 613.4236 cm q q 1 0 0 1 0 0 cm @@ -8354,78 +8609,63 @@ Q Q Q q -1 0 0 1 57.02362 349.4236 cm +1 0 0 1 57.02362 557.4236 cm q 0 0 0 rg BT 1 0 0 1 0 38 Tm /F1 10 Tf 12 TL .76989 Tw (The snapshot is dangerously precise: anything allocated after the snap and still reachable after the restore) Tj T* 0 Tw -0.00705 Tw (becomes a dangling pointer. The canonical pattern \(HTTP request scope\) allocates per-request and discards) Tj T* 0 Tw 1.660522 Tw (per-request \227 nothing escapes. Measured asm RSS with this pattern: 88 KB initial, 100 KB after 1,100) Tj T* 0 Tw (requests. Flat.) Tj T* ET Q Q q -1 0 0 1 57.02362 307.4236 cm +1 0 0 1 57.02362 515.4236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .241019 Tw (This is not a general-purpose allocator. It is an escape hatch the programmer uses when they can prove the) Tj T* 0 Tw 1.593647 Tw (scope boundary. For general programs on asm, the heap still grows. For the HTTP server pattern, O\(1\)) Tj T* 0 Tw (memory costs two lines of code.) Tj T* ET Q Q q -1 0 0 1 57.02362 276.2236 cm +1 0 0 1 57.02362 484.2236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (12. MOAD Audit: Fixing What We Built) Tj T* ET Q Q q -1 0 0 1 57.02362 220.2236 cm +1 0 0 1 57.02362 428.2236 cm q BT 1 0 0 1 0 38 Tm .158726 Tw 12 TL /F1 10 Tf 0 0 0 rg (We scanned all three implementations for the five MOADs. The taxonomy used here is defined in the ) Tj 0 .4 .6 rg (MOAD) Tj T* 0 Tw 3.384835 Tw (Cheat Sheet) Tj 0 0 0 rg ( at undefect.com \227 MOAD-0001 \(sedimentary O\(N\262\) defects\), MOAD-0002 \(intertangle\),) Tj T* 0 Tw .059816 Tw (MOAD-0003 \(context-leak\), MOAD-0004 \(stringly-typed\), MOAD-0005 \(bus-factor\). Every project contains its) Tj T* 0 Tw (own sediment.) Tj T* ET Q Q q -1 0 0 1 57.02362 130.2236 cm +1 0 0 1 57.02362 338.2236 cm q BT 1 0 0 1 0 74 Tm 7.459168 Tw 12 TL /F3 10 Tf 0 0 0 rg (Standard: what the Lean EML proof sets.) Tj /F1 10 Tf ( \2478 documents a formal Lean 4 proof that) Tj T* 0 Tw .542844 Tw /F5 10 Tf (eml\(x,) Tj ( ) Tj (y\)) Tj ( ) Tj (=) Tj ( ) Tj (exp\(x\)) Tj ( ) Tj (-) Tj ( ) Tj (ln\(y\)) Tj /F1 10 Tf ( generates every elementary function \227 and that the proof is 40\327 faster) Tj T* 0 Tw .55131 Tw (than the brute-force numerical verification it replaced. That speedup is the MOAD-0001 story in microcosm:) Tj T* 0 Tw 1.171667 Tw (algebraic understanding beats O\(N\262\) search, at the proof layer just like at every other layer. We take that) Tj T* 0 Tw .048417 Tw (standard as the bar for the implementations too. Every hot path should be fast for a ) Tj /F4 10 Tf (reason) Tj /F1 10 Tf ( \(a hash, a cache,) Tj T* 0 Tw -0.019034 Tw (an O\(1\) invariant\), not because a test didn't happen to hit the slow case. Every behavior should be correct for) Tj T* 0 Tw (a reason, not by coincidence. The audit below is where we hold ourselves to that bar.) Tj T* ET Q Q q -1 0 0 1 57.02362 64.22362 cm +1 0 0 1 57.02362 224.2236 cm q -BT 1 0 0 1 0 50 Tm 1.954609 Tw 12 TL /F1 10 Tf 0 0 0 rg (We also ran the unmoad scanner on the full tree at each release. Most recent scan \(2026-04-17, post) Tj T* 0 Tw .255223 Tw (portal-over-HTTP\): 18 HIGH MOAD-0001 candidates in C and 4 MOAD-0003 candidates in Python. All 18 C) Tj T* 0 Tw 1.186796 Tw (candidates inspected individually turn out to be false positives \227 one-shot option parsing, bounded-depth) Tj T* 0 Tw .330596 Tw (ancestor walks, hash bucket chain walks \(already O\(1\) amortized\), or static 6-element tables \(e.g. ) Tj /F5 10 Tf (#\\space) Tj /F1 10 Tf T* 0 Tw 3.004862 Tw (char-literal names\). The 4 Python MOAD-0003 candidates are scanner misfires on a non-ContextVar) Tj T* 0 Tw ET -Q -Q - -endstream -endobj -136 0 obj -<< -/Length 7252 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET -q -1 0 0 1 57.02362 717.0236 cm -q -BT 1 0 0 1 0 38 Tm 6.764835 Tw 12 TL /F5 10 Tf 0 0 0 rg (Env.set\(\)) Tj /F1 10 Tf ( method. New-work-introduced MOAD-0001: ) Tj /F3 10 Tf (zero) Tj /F1 10 Tf (. The defects fixed in this paper) Tj T* 0 Tw 2.914587 Tw (\() Tj /F5 10 Tf (intern_symbol) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (_define_record_type) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (bi_string_replace) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (_tokenize_lines) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (Env.lookup) Tj /F1 10 Tf T* 0 Tw 1.773223 Tw (shortcut\) were all surfaced by other pressures \227 benchmarks, crashes, portal exchanges \227 not by the) Tj T* 0 Tw (scanner. The scanner remains a second line; the first line is building with understanding.) Tj T* ET +BT 1 0 0 1 0 98 Tm 1.954609 Tw 12 TL /F1 10 Tf 0 0 0 rg (We also ran the unmoad scanner on the full tree at each release. Most recent scan \(2026-04-17, post) Tj T* 0 Tw .255223 Tw (portal-over-HTTP\): 18 HIGH MOAD-0001 candidates in C and 4 MOAD-0003 candidates in Python. All 18 C) Tj T* 0 Tw 1.186796 Tw (candidates inspected individually turn out to be false positives \227 one-shot option parsing, bounded-depth) Tj T* 0 Tw .330596 Tw (ancestor walks, hash bucket chain walks \(already O\(1\) amortized\), or static 6-element tables \(e.g. ) Tj /F5 10 Tf (#\\space) Tj /F1 10 Tf T* 0 Tw 3.004862 Tw (char-literal names\). The 4 Python MOAD-0003 candidates are scanner misfires on a non-ContextVar) Tj T* 0 Tw 6.764835 Tw /F5 10 Tf (Env.set\(\)) Tj /F1 10 Tf ( method. New-work-introduced MOAD-0001: ) Tj /F3 10 Tf (zero) Tj /F1 10 Tf (. The defects fixed in this paper) Tj T* 0 Tw 2.914587 Tw (\() Tj /F5 10 Tf (intern_symbol) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (_define_record_type) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (bi_string_replace) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (_tokenize_lines) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (Env.lookup) Tj /F1 10 Tf T* 0 Tw 1.773223 Tw (shortcut\) were all surfaced by other pressures \227 benchmarks, crashes, portal exchanges \227 not by the) Tj T* 0 Tw (scanner. The scanner remains a second line; the first line is building with understanding.) Tj T* ET Q Q q -1 0 0 1 57.02362 691.0236 cm +1 0 0 1 57.02362 198.2236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (12.1 MOAD-0001: The Sedimentary Defect in Our Own Code) Tj T* ET Q Q q -1 0 0 1 57.02362 649.0236 cm +1 0 0 1 57.02362 156.2236 cm q BT 1 0 0 1 0 26 Tm 1.195596 Tw 12 TL /F1 10 Tf 0 0 0 rg (The assembly interpreter's ) Tj /F5 10 Tf (intern_symbol) Tj /F1 10 Tf ( used a linear scan through all interned symbols \227 O\(N\) per) Tj T* 0 Tw .024897 Tw (lookup, O\(N\262\) over a program's lifetime. For a program defining 34 builtins plus user symbols, every ) Tj /F5 10 Tf (define) Tj /F1 10 Tf (,) Tj T* 0 Tw (every lambda parameter, every variable reference walked the entire table.) Tj T* ET Q Q q -1 0 0 1 57.02362 631.0236 cm +1 0 0 1 57.02362 138.2236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (Before \(linear scan\)) Tj /F1 10 Tf (:) Tj T* ET Q Q q -1 0 0 1 57.02362 533.0236 cm +1 0 0 1 57.02362 69.02362 cm q q 1 0 0 1 0 0 cm @@ -8435,24 +8675,54 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .960784 rg -n -6 -6 480.0283 88.8 re B* +n -6 -6 480.0283 60 re B* Q q 0 0 0 rg -BT 1 0 0 1 0 68.8 Tm /F5 8 Tf 9.6 TL (.isym_search:) Tj T* ( cmpq %rcx, %r8 # compare lengths) Tj T* ( jne .isym_next) Tj T* ( rep cmpsb # compare bytes) Tj T* ( je .isym_found) Tj T* (.isym_next:) Tj T* ( addq $24, %rax # next entry) Tj T* ( jmp .isym_search # O\(N\) per intern) Tj T* ET +BT 1 0 0 1 0 40 Tm /F5 8 Tf 9.6 TL (.isym_search:) Tj T* ( cmpq %rcx, %r8 # compare lengths) Tj T* ( jne .isym_next) Tj T* ( rep cmpsb # compare bytes) Tj T* ( je .isym_found) Tj T* ET +Q +Q +Q +Q +Q + +endstream +endobj +139 0 obj +<< +/Length 7935 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 57.02362 723.0236 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .960784 rg +n -6 -6 480.0283 40.8 re B* +Q +q +0 0 0 rg +BT 1 0 0 1 0 20.8 Tm /F5 8 Tf 9.6 TL (.isym_next:) Tj T* ( addq $24, %rax # next entry) Tj T* ( jmp .isym_search # O\(N\) per intern) Tj T* ET Q Q Q Q Q q -1 0 0 1 57.02362 513.0236 cm +1 0 0 1 57.02362 703.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (After \(djb2 hash table, 1024 buckets\)) Tj /F1 10 Tf (:) Tj T* ET Q Q q -1 0 0 1 57.02362 434.2236 cm +1 0 0 1 57.02362 624.2236 cm q q 1 0 0 1 0 0 cm @@ -8472,32 +8742,32 @@ Q Q Q q -1 0 0 1 57.02362 378.2236 cm +1 0 0 1 57.02362 568.2236 cm q BT 1 0 0 1 0 38 Tm .721772 Tw 12 TL /F1 10 Tf 0 0 0 rg (The fix: 99 lines changed, 1024-bucket hash table with chaining. ) Tj /F3 10 Tf (2.9x faster) Tj /F1 10 Tf ( on a 2000-symbol stress test.) Tj T* 0 Tw 2.453719 Tw (On benchmarks with fewer symbols \() Tj /F5 10 Tf (ack) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (fib) Tj /F1 10 Tf (\), the improvement is modest \(15% on ) Tj /F5 10 Tf (sum-to\(50k\)) Tj /F1 10 Tf (\),) Tj T* 0 Tw 1.940417 Tw (because the linear scan was already fast at small N. The fix pays off at scale \227 the same pattern as) Tj T* 0 Tw (MOAD-0001 everywhere: invisible at small inputs, catastrophic at large ones.) Tj T* ET Q Q q -1 0 0 1 57.02362 348.2236 cm +1 0 0 1 57.02362 538.2236 cm q BT 1 0 0 1 0 14 Tm 1.423486 Tw 12 TL /F1 10 Tf 0 0 0 rg (The Python implementation had a similar defect: ) Tj /F5 10 Tf (_define_record_type) Tj /F1 10 Tf ( used ) Tj /F5 10 Tf (list.index\(\)) Tj /F1 10 Tf ( for field) Tj T* 0 Tw (lookup. Replaced with a dict. O\(N\) ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( O\(1\).) Tj T* ET Q Q q -1 0 0 1 57.02362 318.2236 cm +1 0 0 1 57.02362 508.2236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F3 10 Tf 12 TL 1.554556 Tw (Two more MOAD-0001 defects surfaced during the HTTP server work and were fixed in the same) Tj T* 0 Tw (pass:) Tj T* ET Q Q q -1 0 0 1 57.02362 312.2236 cm +1 0 0 1 57.02362 502.2236 cm Q q -1 0 0 1 57.02362 312.2236 cm +1 0 0 1 57.02362 502.2236 cm Q q -1 0 0 1 57.02362 276.2236 cm +1 0 0 1 57.02362 466.2236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8519,10 +8789,10 @@ Q Q Q q -1 0 0 1 57.02362 270.2236 cm +1 0 0 1 57.02362 460.2236 cm Q q -1 0 0 1 57.02362 234.2236 cm +1 0 0 1 57.02362 424.2236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8544,51 +8814,42 @@ Q Q Q q -1 0 0 1 57.02362 216.2236 cm +1 0 0 1 57.02362 406.2236 cm Q q -1 0 0 1 57.02362 126.2236 cm +1 0 0 1 57.02362 316.2236 cm q BT 1 0 0 1 0 74 Tm 4.926213 Tw 12 TL /F1 10 Tf 0 0 0 rg (A third correctness fix landed after the portal-over-HTTP demo exposed it: ) Tj /F5 10 Tf (uncommonlisp.py) Tj /F1 10 Tf ('s) Tj T* 0 Tw .515223 Tw /F5 10 Tf (Env.lookup) Tj /F1 10 Tf ( used to short-cut from the local frame directly to the global frame before walking intermediate) Tj T* 0 Tw 1.47713 Tw (parents. That was fast but wrong \227 a let-loop parameter named the same as a global builtin \() Tj /F5 10 Tf (count) Tj /F1 10 Tf (, a) Tj T* 0 Tw .409897 Tw (SRFI-1 procedure\) got shadowed in reverse, the shortcut returned the global builtin instead of walking up to) Tj T* 0 Tw .07402 Tw (the loop's parameter frame. Fix: walk ) Tj /F5 10 Tf (self) Tj ( ) Tj /F6 10 Tf 12 TL (\256) Tj /F5 10 Tf 12 TL ( ) Tj (self.p) Tj ( ) Tj /F6 10 Tf 12 TL (\256) Tj /F5 10 Tf 12 TL ( ) Tj (...) Tj ( ) Tj /F6 10 Tf 12 TL (\256) Tj /F5 10 Tf 12 TL ( ) Tj (global) Tj /F1 10 Tf ( in order, without any shortcut.) Tj T* 0 Tw 1.17189 Tw (The inline cache at ) Tj /F5 10 Tf (OP_LOOKUP) Tj /F1 10 Tf ( was correspondingly tightened to validate the full chain before firing. 975) Tj T* 0 Tw (tests remained green.) Tj T* ET Q Q q -1 0 0 1 57.02362 108.2236 cm +1 0 0 1 57.02362 298.2236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Every release audit surfaces more. Writing new code is writing new sediment, unless the audit runs.) Tj T* ET Q Q q -1 0 0 1 57.02362 82.22362 cm +1 0 0 1 57.02362 272.2236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (12.2 MOAD-0002: The Intertangle in Our Own Design) Tj T* ET Q Q q -1 0 0 1 57.02362 64.22362 cm +1 0 0 1 57.02362 254.2236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (All three implementations share mutable global state between subsystems:) Tj T* ET Q Q q -1 0 0 1 57.02362 62.69291 cm -Q - -endstream -endobj -137 0 obj -<< -/Length 8622 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET -q -1 0 0 1 57.02362 765.0236 cm +1 0 0 1 57.02362 248.2236 cm Q q -1 0 0 1 57.02362 717.0236 cm +1 0 0 1 57.02362 248.2236 cm +Q +q +1 0 0 1 57.02362 200.2236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8610,10 +8871,10 @@ Q Q Q q -1 0 0 1 57.02362 711.0236 cm +1 0 0 1 57.02362 194.2236 cm Q q -1 0 0 1 57.02362 675.0236 cm +1 0 0 1 57.02362 158.2236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8635,10 +8896,10 @@ Q Q Q q -1 0 0 1 57.02362 669.0236 cm +1 0 0 1 57.02362 152.2236 cm Q q -1 0 0 1 57.02362 633.0236 cm +1 0 0 1 57.02362 116.2236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8660,53 +8921,62 @@ Q Q Q q -1 0 0 1 57.02362 615.0236 cm +1 0 0 1 57.02362 98.22362 cm Q + +endstream +endobj +140 0 obj +<< +/Length 7883 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 573.0236 cm +1 0 0 1 57.02362 729.0236 cm q BT 1 0 0 1 0 26 Tm .770556 Tw 12 TL /F1 10 Tf 0 0 0 rg (We documented these rather than refactoring them. In each case, the coupling exists for performance \(the) Tj T* 0 Tw .79631 Tw (globals are on hot paths\) or necessity \() Tj /F5 10 Tf (setjmp) Tj /F1 10 Tf ( requires thread-local state\). The documentation makes the) Tj T* 0 Tw (coupling visible so future work can decouple selectively.) Tj T* ET Q Q q -1 0 0 1 57.02362 547.0236 cm +1 0 0 1 57.02362 703.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (12.3 Our Shared Infrastructure) Tj T* ET Q Q q -1 0 0 1 57.02362 493.0236 cm +1 0 0 1 57.02362 649.0236 cm q BT 1 0 0 1 0 38 Tm 1.468917 Tw 12 TL /F1 10 Tf 0 0 0 rg (Every MOAD we fixed in our own code is a MOAD we understand better when we find it in others. The) Tj T* 0 Tw 3.534168 Tw (sedimentary defect in ) Tj /F5 10 Tf (intern_symbol) Tj /F1 10 Tf ( is the same pattern as the sedimentary defect in Lean 4's) Tj T* 0 Tw .17985 Tw /F5 10 Tf (check_duplicated_univ_params) Tj /F1 10 Tf (. The intertangle in our global environment register is the same pattern) Tj T* 0 Tw (as the intertangle in any system that routes state through implicit globals instead of explicit parameters.) Tj T* ET Q Q q -1 0 0 1 57.02362 427.0236 cm +1 0 0 1 57.02362 583.0236 cm q BT 1 0 0 1 0 50 Tm 1.036556 Tw 12 TL /F3 10 Tf 0 0 0 rg (Our infrastructure does not extract rent from workaholics to feed gluttons.) Tj /F1 10 Tf ( A symbol table that does) Tj T* 0 Tw .025176 Tw (O\(N\) work per lookup is a workaholic node \227 it does more work than necessary on every operation, and that) Tj T* 0 Tw .250642 Tw (cost compounds through every downstream consumer. Fixing it reduces stress on our shared computational) Tj T* 0 Tw .385785 Tw (heart. The CPU cycles saved are cycles available for the next lambda, the next continuation, the next portal) Tj T* 0 Tw (resume.) Tj T* ET Q Q q -1 0 0 1 57.02362 385.0236 cm +1 0 0 1 57.02362 541.0236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 3.447739 Tw (This is the permacomputer obligation: infrastructure that renews itself. Code that gets faster as we) Tj T* 0 Tw .462545 Tw (understand it better. A hash table is not an optimization \227 it is the removal of unnecessary suffering from a) Tj T* 0 Tw (system that deserves better.) Tj T* ET Q Q q -1 0 0 1 57.02362 353.8236 cm +1 0 0 1 57.02362 509.8236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (13. Future Work) Tj T* ET Q Q q -1 0 0 1 57.02362 339.8236 cm +1 0 0 1 57.02362 495.8236 cm Q q -1 0 0 1 57.02362 339.8236 cm +1 0 0 1 57.02362 495.8236 cm Q q -1 0 0 1 57.02362 315.8236 cm +1 0 0 1 57.02362 471.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8728,10 +8998,10 @@ Q Q Q q -1 0 0 1 57.02362 309.8236 cm +1 0 0 1 57.02362 465.8236 cm Q q -1 0 0 1 57.02362 273.8236 cm +1 0 0 1 57.02362 429.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8753,10 +9023,10 @@ Q Q Q q -1 0 0 1 57.02362 267.8236 cm +1 0 0 1 57.02362 423.8236 cm Q q -1 0 0 1 57.02362 243.8236 cm +1 0 0 1 57.02362 399.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8778,10 +9048,10 @@ Q Q Q q -1 0 0 1 57.02362 237.8236 cm +1 0 0 1 57.02362 393.8236 cm Q q -1 0 0 1 57.02362 213.8236 cm +1 0 0 1 57.02362 369.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8803,10 +9073,10 @@ Q Q Q q -1 0 0 1 57.02362 207.8236 cm +1 0 0 1 57.02362 363.8236 cm Q q -1 0 0 1 57.02362 183.8236 cm +1 0 0 1 57.02362 339.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8828,10 +9098,10 @@ Q Q Q q -1 0 0 1 57.02362 177.8236 cm +1 0 0 1 57.02362 333.8236 cm Q q -1 0 0 1 57.02362 165.8236 cm +1 0 0 1 57.02362 321.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8853,10 +9123,10 @@ Q Q Q q -1 0 0 1 57.02362 159.8236 cm +1 0 0 1 57.02362 315.8236 cm Q q -1 0 0 1 57.02362 147.8236 cm +1 0 0 1 57.02362 303.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8878,70 +9148,70 @@ Q Q Q q -1 0 0 1 57.02362 129.8236 cm +1 0 0 1 57.02362 285.8236 cm Q q -1 0 0 1 57.02362 98.62362 cm +1 0 0 1 57.02362 254.6236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (14. The Defect in the Model) Tj T* ET Q Q q -1 0 0 1 57.02362 78.62362 cm +1 0 0 1 57.02362 234.6236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (This paper is evidence of a problem that extends beyond any single codebase.) Tj T* ET Q Q - -endstream -endobj -138 0 obj -<< -/Length 7420 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 705.0236 cm +1 0 0 1 57.02362 168.6236 cm q BT 1 0 0 1 0 50 Tm .653022 Tw 12 TL /F1 10 Tf 0 0 0 rg (On April 4, 2026, ) Tj 0 .4 .6 rg (russell@unturf) Tj 0 0 0 rg ( published ) Tj 0 .4 .6 rg ("Stress on Our Shared Heart") Tj 0 0 0 rg ( \227 a systematic analysis of 1,264) Tj T* 0 Tw .998334 Tw (MOAD defects across 60+ ecosystems, 18 programming languages, with 919 patches written. The central) Tj T* 0 Tw 2.218835 Tw (finding: O\(N\262\) sedimentary defects compound across architectural layers, creating invisible performance) Tj T* 0 Tw .27131 Tw (taxation on every downstream consumer. A single bottleneck multiplies against every other bottleneck in the) Tj T* 0 Tw (dependency chain.) Tj T* ET Q Q q -1 0 0 1 57.02362 675.0236 cm +1 0 0 1 57.02362 138.6236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .222844 Tw (On April 13--14, 2026 \227 nine days later \227 the machine learning agent that built Lumbda wrote MOAD-0001) Tj T* 0 Tw (into fresh code. Twice.) Tj T* ET Q Q q -1 0 0 1 57.02362 609.0236 cm +1 0 0 1 57.02362 72.62362 cm q BT 1 0 0 1 0 50 Tm 1.989873 Tw 12 TL /F5 10 Tf 0 0 0 rg (intern_symbol) Tj /F1 10 Tf ( in the assembly implementation: a linear scan through all interned symbols. O\(N\) per) Tj T* 0 Tw 1.841147 Tw (lookup. The exact pattern described in "Stress on Our Shared Heart." The exact pattern the agent was) Tj T* 0 Tw 3.328647 Tw (explicitly instructed to avoid. The agent had the full MOAD taxonomy in its context window. It had) Tj T* 0 Tw 2.822739 Tw /F5 10 Tf (BLACKOPS.md) Tj /F1 10 Tf ( defining all five MOADs. It had the undefect.com mission statement. And it still wrote) Tj T* 0 Tw /F5 10 Tf (jmp) Tj ( ) Tj (.isym_search) Tj /F1 10 Tf ( instead of a hash table.) Tj T* ET Q Q + +endstream +endobj +141 0 obj +<< +/Length 6415 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 579.0236 cm +1 0 0 1 57.02362 741.0236 cm q BT 1 0 0 1 0 14 Tm 1.541835 Tw 12 TL /F5 10 Tf 0 0 0 rg (list.index\(\)) Tj /F1 10 Tf ( in the Python implementation's ) Tj /F5 10 Tf (_define_record_type) Tj /F1 10 Tf (: linear search for field position.) Tj T* 0 Tw (O\(N\) where O\(1\) was trivial. Same defect. Same context. Same failure.) Tj T* ET Q Q q -1 0 0 1 57.02362 561.0236 cm +1 0 0 1 57.02362 723.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The commit history proves it:) Tj T* ET Q Q q -1 0 0 1 57.02362 555.0236 cm +1 0 0 1 57.02362 717.0236 cm Q q -1 0 0 1 57.02362 555.0236 cm +1 0 0 1 57.02362 717.0236 cm Q q -1 0 0 1 57.02362 543.0236 cm +1 0 0 1 57.02362 705.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8963,10 +9233,10 @@ Q Q Q q -1 0 0 1 57.02362 537.0236 cm +1 0 0 1 57.02362 699.0236 cm Q q -1 0 0 1 57.02362 525.0236 cm +1 0 0 1 57.02362 687.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8988,10 +9258,10 @@ Q Q Q q -1 0 0 1 57.02362 519.0236 cm +1 0 0 1 57.02362 681.0236 cm Q q -1 0 0 1 57.02362 507.0236 cm +1 0 0 1 57.02362 669.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -9013,52 +9283,52 @@ Q Q Q q -1 0 0 1 57.02362 489.0236 cm +1 0 0 1 57.02362 651.0236 cm Q q -1 0 0 1 57.02362 471.0236 cm +1 0 0 1 57.02362 633.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (The defect is in the model, not the programmer.) Tj T* ET Q Q q -1 0 0 1 57.02362 417.0236 cm +1 0 0 1 57.02362 579.0236 cm q BT 1 0 0 1 0 38 Tm 5.336796 Tw 12 TL /F1 10 Tf 0 0 0 rg (Language models learn from training data. The training data contains millions of linear scans,) Tj T* 0 Tw 3.434395 Tw /F5 10 Tf (list.contains) Tj /F1 10 Tf ( calls, ) Tj /F5 10 Tf (std::find) Tj /F1 10 Tf ( inside loops, ) Tj /F5 10 Tf (array.indexOf) Tj /F1 10 Tf ( in hot paths. These patterns are) Tj T* 0 Tw .94631 Tw (statistically dominant. When a model generates code, it reproduces the dominant patterns from its training) Tj T* 0 Tw (distribution \227 including the sedimentary defects.) Tj T* ET Q Q q -1 0 0 1 57.02362 375.0236 cm +1 0 0 1 57.02362 537.0236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .029897 Tw (Cantor formalized set theory in 1874. Hash tables were implemented in 1953. The O\(1\) membership test has) Tj T* 0 Tw .363241 Tw (been known for 152 years and available in every language for 73 years. Yet language models still default to) Tj T* 0 Tw (O\(N\) because O\(N\) is what most code does. The training data is the sediment.) Tj T* ET Q Q q -1 0 0 1 57.02362 333.0236 cm +1 0 0 1 57.02362 495.0236 cm q BT 1 0 0 1 0 26 Tm 2.359862 Tw 12 TL /F3 10 Tf 0 0 0 rg (This means every machine learning agent generating code today is propagating MOAD-0001 by) Tj T* 0 Tw .91789 Tw (default.) Tj /F1 10 Tf ( Not because the solutions are unknown. Not because the agents lack capability. But because the) Tj T* 0 Tw (statistical distribution of training data encodes the defect as the norm.) Tj T* ET Q Q q -1 0 0 1 57.02362 291.0236 cm +1 0 0 1 57.02362 453.0236 cm q BT 1 0 0 1 0 26 Tm .412917 Tw 12 TL /F1 10 Tf 0 0 0 rg (The fix is not to patch individual outputs. The fix is to teach models that ) Tj /F3 10 Tf (O\(1\) is the default) Tj /F1 10 Tf ( for membership) Tj T* 0 Tw 4.550556 Tw (tests, lookups, and deduplication. That ) Tj /F5 10 Tf (set\(\)) Tj /F1 10 Tf ( is not an optimization \227 it is the baseline. That) Tj T* 0 Tw /F5 10 Tf (list.contains) Tj /F1 10 Tf ( inside a loop is a defect, not a pattern.) Tj T* ET Q Q q -1 0 0 1 57.02362 249.0236 cm +1 0 0 1 57.02362 411.0236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 1.790491 Tw (Until that teaching happens at the training level, every agent needs a MOAD audit pass on every code) Tj T* 0 Tw 1.596373 Tw (generation. This paper \227 with its commit history showing the defect introduced and then fixed \227 is the) Tj T* 0 Tw (evidence that the audit is necessary.) Tj T* ET Q Q q -1 0 0 1 57.02362 243.0236 cm +1 0 0 1 57.02362 405.0236 cm Q q -1 0 0 1 57.02362 201.0236 cm +1 0 0 1 57.02362 363.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -9081,30 +9351,30 @@ Q Q Q q -1 0 0 1 57.02362 201.0236 cm +1 0 0 1 57.02362 363.0236 cm Q q -1 0 0 1 57.02362 171.0236 cm +1 0 0 1 57.02362 333.0236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.253223 Tw (The stress is real. The compound burden is measurable. And the models that generate our infrastructure) Tj T* 0 Tw (carry the defect in their weights.) Tj T* ET Q Q q -1 0 0 1 57.02362 153.0236 cm +1 0 0 1 57.02362 315.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (This paper is the proof. The commit history is the evidence. The fix starts with awareness.) Tj T* ET Q Q q -1 0 0 1 57.02362 121.8236 cm +1 0 0 1 57.02362 283.8236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (Citation) Tj T* ET Q Q q -1 0 0 1 57.02362 71.82362 cm +1 0 0 1 57.02362 233.8236 cm q q 1 0 0 1 0 0 cm @@ -9124,23 +9394,14 @@ Q Q Q Q - -endstream -endobj -139 0 obj -<< -/Length 2147 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 751.8236 cm +1 0 0 1 57.02362 202.6236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (References) Tj T* ET Q Q q -1 0 0 1 57.02362 701.8236 cm +1 0 0 1 57.02362 152.6236 cm q q 1 0 0 1 0 0 cm @@ -9161,16 +9422,25 @@ Q Q Q q -1 0 0 1 57.02362 670.6236 cm +1 0 0 1 57.02362 121.4236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (License) Tj T* ET Q Q q -1 0 0 1 57.02362 654.6236 cm +1 0 0 1 57.02362 105.4236 cm Q + +endstream +endobj +142 0 obj +<< +/Length 2103 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 451.5477 cm +1 0 0 1 57.02362 561.9477 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -9186,13 +9456,13 @@ Q Q Q q -1 0 0 1 57.02362 443.5477 cm +1 0 0 1 57.02362 553.9477 cm Q q -1 0 0 1 57.02362 435.5477 cm +1 0 0 1 57.02362 545.9477 cm Q q -1 0 0 1 57.02362 236.8922 cm +1 0 0 1 57.02362 347.2922 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -9208,17 +9478,17 @@ Q Q Q q -1 0 0 1 57.02362 228.8922 cm +1 0 0 1 57.02362 339.2922 cm Q q -1 0 0 1 57.02362 210.8922 cm +1 0 0 1 57.02362 321.2922 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F4 10 Tf 12 TL 155.3042 0 Td (GNU Affero General Public License v3) Tj T* -155.3042 0 Td ET Q Q q -1 0 0 1 57.02362 64.89221 cm +1 0 0 1 57.02362 69.69221 cm q q 1 0 0 1 0 0 cm @@ -9228,10 +9498,10 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .960784 rg -n -6 -6 480.0283 136.8 re B* +n -6 -6 480.0283 242.4 re B* Q q -BT 1 0 0 1 0 116.8 Tm 9.6 TL /F5 8 Tf 0 0 0 rg (AGPL-3.0-only) Tj T* T* (PERMACOMPUTER PREAMBLE - NO WARRANTY) Tj T* T* (This is free software for the public good of a permacomputer hosted at) Tj T* (permacomputer.com, an always-on computer by the people, for the people. One) Tj T* (which is durable, easy to repair, ) Tj (&) Tj ( distributed like tap water for machine) Tj T* (learning intelligence.) Tj T* T* (The permacomputer is community-owned infrastructure optimized around four values:) Tj T* T* ( TRUTH - Source code must be open source ) Tj (&) Tj ( freely distributed) Tj T* ( FREEDOM - Voluntary participation without corporate control) Tj T* ET +BT 1 0 0 1 0 222.4 Tm 9.6 TL /F5 8 Tf 0 0 0 rg (AGPL-3.0-only) Tj T* T* (PERMACOMPUTER PREAMBLE - NO WARRANTY) Tj T* T* (This is free software for the public good of a permacomputer hosted at) Tj T* (permacomputer.com, an always-on computer by the people, for the people. One) Tj T* (which is durable, easy to repair, ) Tj (&) Tj ( distributed like tap water for machine) Tj T* (learning intelligence.) Tj T* T* (The permacomputer is community-owned infrastructure optimized around four values:) Tj T* T* ( TRUTH - Source code must be open source ) Tj (&) Tj ( freely distributed) Tj T* ( FREEDOM - Voluntary participation without corporate control) Tj T* ( HARMONY - Systems operating with minimal waste that self-renew) Tj T* ( LOVE - Individual rights protected while fostering cooperation) Tj T* T* (This software contributes to that vision by proving that feedback) Tj T* (\(the computational primitive of continuations\) composes into a universal) Tj T* (execution model, extending across implementations through Scheme source) Tj T* (itself as the wire format. Three implementations, one language,) Tj T* (974 tests, ~17,000 lines. Code is seeds to sprout on any abandoned technology.) Tj T* T* (Learn more: https://www.permacomputer.com) Tj T* T* ET Q Q Q @@ -9240,14 +9510,14 @@ Q endstream endobj -140 0 obj +143 0 obj << -/Length 1638 +/Length 1025 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 502.2236 cm +1 0 0 1 57.02362 607.8236 cm q q 1 0 0 1 0 0 cm @@ -9257,10 +9527,10 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .960784 rg -n -6 -6 480.0283 261.6 re B* +n -6 -6 480.0283 156 re B* Q q -BT 1 0 0 1 0 241.6 Tm 9.6 TL /F5 8 Tf 0 0 0 rg ( HARMONY - Systems operating with minimal waste that self-renew) Tj T* ( LOVE - Individual rights protected while fostering cooperation) Tj T* T* (This software contributes to that vision by proving that feedback) Tj T* (\(the computational primitive of continuations\) composes into a universal) Tj T* (execution model, extending across implementations through Scheme source) Tj T* (itself as the wire format. Three implementations, one language,) Tj T* (974 tests, ~17,000 lines. Code is seeds to sprout on any abandoned technology.) Tj T* T* (Learn more: https://www.permacomputer.com) Tj T* T* (NO WARRANTY. THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.) Tj T* T* (That said, our permacomputer's digital membrane stratum continuously runs unit,) Tj T* (integration, ) Tj (&) Tj ( functional tests on all of its own software, with our) Tj T* (permacomputer monitoring itself, repairing itself, with minimal human in the) Tj T* (loop guidance. Our machine learning agents do their best to leave no stone) Tj T* (unturned.) Tj T* T* (Copyright \(C\) 2025-2026 TimeHexOn ) Tj (&) Tj ( foxhop ) Tj (&) Tj ( russell@unturf) Tj T* (https://www.timehexon.com) Tj T* (https://www.foxhop.net) Tj T* (https://www.unturf.com/software) Tj T* (https://www.permacomputer.com) Tj T* (https://uncloseai.com) Tj T* (https://russell.ballestrini.net) Tj T* ET +BT 1 0 0 1 0 136 Tm 9.6 TL /F5 8 Tf 0 0 0 rg (NO WARRANTY. THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.) Tj T* T* (That said, our permacomputer's digital membrane stratum continuously runs unit,) Tj T* (integration, ) Tj (&) Tj ( functional tests on all of its own software, with our) Tj T* (permacomputer monitoring itself, repairing itself, with minimal human in the) Tj T* (loop guidance. Our machine learning agents do their best to leave no stone) Tj T* (unturned.) Tj T* T* (Copyright \(C\) 2025-2026 TimeHexOn ) Tj (&) Tj ( foxhop ) Tj (&) Tj ( russell@unturf) Tj T* (https://www.timehexon.com) Tj T* (https://www.foxhop.net) Tj T* (https://www.unturf.com/software) Tj T* (https://www.permacomputer.com) Tj T* (https://uncloseai.com) Tj T* (https://russell.ballestrini.net) Tj T* ET Q Q Q @@ -9269,148 +9539,153 @@ Q endstream endobj -141 0 obj -<< -/Nums [ 0 142 0 R 1 143 0 R 2 144 0 R 3 145 0 R 4 146 0 R - 5 147 0 R 6 148 0 R 7 149 0 R 8 150 0 R 9 151 0 R - 10 152 0 R 11 153 0 R 12 154 0 R 13 155 0 R 14 156 0 R - 15 157 0 R 16 158 0 R 17 159 0 R 18 160 0 R 19 161 0 R - 20 162 0 R 21 163 0 R 22 164 0 R 23 165 0 R 24 166 0 R - 25 167 0 R ] ->> -endobj -142 0 obj -<< -/S /D /St 1 ->> -endobj -143 0 obj -<< -/S /D /St 2 ->> -endobj 144 0 obj << -/S /D /St 3 +/Nums [ 0 145 0 R 1 146 0 R 2 147 0 R 3 148 0 R 4 149 0 R + 5 150 0 R 6 151 0 R 7 152 0 R 8 153 0 R 9 154 0 R + 10 155 0 R 11 156 0 R 12 157 0 R 13 158 0 R 14 159 0 R + 15 160 0 R 16 161 0 R 17 162 0 R 18 163 0 R 19 164 0 R + 20 165 0 R 21 166 0 R 22 167 0 R 23 168 0 R 24 169 0 R + 25 170 0 R 26 171 0 R ] >> endobj 145 0 obj << -/S /D /St 4 +/S /D /St 1 >> endobj 146 0 obj << -/S /D /St 5 +/S /D /St 2 >> endobj 147 0 obj << -/S /D /St 6 +/S /D /St 3 >> endobj 148 0 obj << -/S /D /St 7 +/S /D /St 4 >> endobj 149 0 obj << -/S /D /St 8 +/S /D /St 5 >> endobj 150 0 obj << -/S /D /St 9 +/S /D /St 6 >> endobj 151 0 obj << -/S /D /St 10 +/S /D /St 7 >> endobj 152 0 obj << -/S /D /St 11 +/S /D /St 8 >> endobj 153 0 obj << -/S /D /St 12 +/S /D /St 9 >> endobj 154 0 obj << -/S /D /St 13 +/S /D /St 10 >> endobj 155 0 obj << -/S /D /St 14 +/S /D /St 11 >> endobj 156 0 obj << -/S /D /St 15 +/S /D /St 12 >> endobj 157 0 obj << -/S /D /St 16 +/S /D /St 13 >> endobj 158 0 obj << -/S /D /St 17 +/S /D /St 14 >> endobj 159 0 obj << -/S /D /St 18 +/S /D /St 15 >> endobj 160 0 obj << -/S /D /St 19 +/S /D /St 16 >> endobj 161 0 obj << -/S /D /St 20 +/S /D /St 17 >> endobj 162 0 obj << -/S /D /St 21 +/S /D /St 18 >> endobj 163 0 obj << -/S /D /St 22 +/S /D /St 19 >> endobj 164 0 obj << -/S /D /St 23 +/S /D /St 20 >> endobj 165 0 obj << -/S /D /St 24 +/S /D /St 21 >> endobj 166 0 obj << -/S /D /St 25 +/S /D /St 22 >> endobj 167 0 obj << +/S /D /St 23 +>> +endobj +168 0 obj +<< +/S /D /St 24 +>> +endobj +169 0 obj +<< +/S /D /St 25 +>> +endobj +170 0 obj +<< /S /D /St 26 >> endobj +171 0 obj +<< +/S /D /St 27 +>> +endobj xref -0 168 +0 172 0000000000 65535 f 0000000061 00000 n 0000000158 00000 n @@ -9438,7 +9713,7 @@ xref 0001706741 00000 n 0001707027 00000 n 0001707348 00000 n -0001707432 00000 n +0001707556 00000 n 0001707640 00000 n 0001707848 00000 n 0001708056 00000 n @@ -9446,149 +9721,153 @@ xref 0001708472 00000 n 0001708680 00000 n 0001708858 00000 n -0001843749 00000 n -0001848013 00000 n -0001848304 00000 n -0002058112 00000 n -0002058384 00000 n -0002058592 00000 n -0002083127 00000 n -0002084018 00000 n -0002084290 00000 n -0002084498 00000 n -0002084689 00000 n -0002084880 00000 n -0002085114 00000 n -0002085322 00000 n -0002085530 00000 n -0002085704 00000 n -0002085912 00000 n -0002086118 00000 n -0002086290 00000 n -0002086538 00000 n -0002145514 00000 n -0002145824 00000 n -0002146144 00000 n -0002146352 00000 n -0002146460 00000 n -0002146715 00000 n -0002146790 00000 n -0002146923 00000 n -0002147033 00000 n -0002147198 00000 n -0002147393 00000 n -0002147509 00000 n -0002147627 00000 n -0002147769 00000 n -0002147969 00000 n -0002148104 00000 n -0002148253 00000 n -0002148382 00000 n -0002148552 00000 n -0002148676 00000 n -0002148807 00000 n -0002148929 00000 n -0002149125 00000 n -0002149242 00000 n -0002149369 00000 n -0002149512 00000 n -0002149665 00000 n -0002149850 00000 n -0002149997 00000 n -0002150152 00000 n -0002150324 00000 n -0002150477 00000 n -0002150620 00000 n -0002150775 00000 n -0002150920 00000 n -0002151103 00000 n -0002151221 00000 n -0002151378 00000 n -0002151516 00000 n -0002151664 00000 n -0002151814 00000 n -0002151952 00000 n -0002152087 00000 n -0002152238 00000 n -0002152437 00000 n -0002152556 00000 n -0002152693 00000 n -0002152856 00000 n -0002153028 00000 n -0002153200 00000 n -0002153346 00000 n -0002153540 00000 n -0002153699 00000 n -0002153867 00000 n -0002154002 00000 n -0002154135 00000 n -0002154280 00000 n -0002154406 00000 n -0002154534 00000 n -0002154645 00000 n -0002154889 00000 n -0002160006 00000 n -0002167638 00000 n -0002172968 00000 n -0002179917 00000 n -0002188438 00000 n -0002197553 00000 n -0002206739 00000 n -0002219660 00000 n -0002229189 00000 n -0002239326 00000 n -0002247717 00000 n -0002257330 00000 n -0002265750 00000 n -0002275711 00000 n -0002285007 00000 n -0002287363 00000 n -0002298828 00000 n -0002314894 00000 n -0002323940 00000 n -0002332828 00000 n -0002339996 00000 n -0002347301 00000 n -0002355976 00000 n -0002363449 00000 n -0002365649 00000 n -0002367340 00000 n -0002367664 00000 n -0002367699 00000 n -0002367734 00000 n -0002367769 00000 n -0002367804 00000 n -0002367839 00000 n -0002367874 00000 n -0002367909 00000 n -0002367944 00000 n -0002367979 00000 n -0002368015 00000 n -0002368051 00000 n -0002368087 00000 n -0002368123 00000 n -0002368159 00000 n -0002368195 00000 n -0002368231 00000 n -0002368267 00000 n -0002368303 00000 n -0002368339 00000 n -0002368375 00000 n -0002368411 00000 n -0002368447 00000 n -0002368483 00000 n -0002368519 00000 n -0002368555 00000 n +0001709085 00000 n +0001843976 00000 n +0001848240 00000 n +0002058048 00000 n +0002058369 00000 n +0002058577 00000 n +0002058785 00000 n +0002083320 00000 n +0002084211 00000 n +0002084483 00000 n +0002084691 00000 n +0002084882 00000 n +0002085073 00000 n +0002085307 00000 n +0002085515 00000 n +0002085689 00000 n +0002085897 00000 n +0002086131 00000 n +0002086337 00000 n +0002086509 00000 n +0002086743 00000 n +0002145719 00000 n +0002146029 00000 n +0002146349 00000 n +0002146557 00000 n +0002146665 00000 n +0002146920 00000 n +0002146995 00000 n +0002147128 00000 n +0002147238 00000 n +0002147403 00000 n +0002147598 00000 n +0002147714 00000 n +0002147832 00000 n +0002147974 00000 n +0002148174 00000 n +0002148309 00000 n +0002148458 00000 n +0002148587 00000 n +0002148757 00000 n +0002148881 00000 n +0002149012 00000 n +0002149134 00000 n +0002149330 00000 n +0002149447 00000 n +0002149574 00000 n +0002149717 00000 n +0002149883 00000 n +0002150043 00000 n +0002150228 00000 n +0002150375 00000 n +0002150530 00000 n +0002150702 00000 n +0002150855 00000 n +0002150998 00000 n +0002151153 00000 n +0002151298 00000 n +0002151481 00000 n +0002151599 00000 n +0002151756 00000 n +0002151894 00000 n +0002152042 00000 n +0002152192 00000 n +0002152330 00000 n +0002152465 00000 n +0002152617 00000 n +0002152818 00000 n +0002152941 00000 n +0002153080 00000 n +0002153244 00000 n +0002153417 00000 n +0002153590 00000 n +0002153737 00000 n +0002153932 00000 n +0002154091 00000 n +0002154259 00000 n +0002154394 00000 n +0002154527 00000 n +0002154672 00000 n +0002154798 00000 n +0002154926 00000 n +0002155037 00000 n +0002155288 00000 n +0002160405 00000 n +0002168037 00000 n +0002173367 00000 n +0002180316 00000 n +0002188837 00000 n +0002197952 00000 n +0002207156 00000 n +0002220057 00000 n +0002229835 00000 n +0002240725 00000 n +0002250132 00000 n +0002259495 00000 n +0002266609 00000 n +0002275986 00000 n +0002284982 00000 n +0002293426 00000 n +0002295261 00000 n +0002308320 00000 n +0002325367 00000 n +0002335253 00000 n +0002342693 00000 n +0002349291 00000 n +0002357279 00000 n +0002365215 00000 n +0002371683 00000 n +0002373839 00000 n +0002374917 00000 n +0002375252 00000 n +0002375287 00000 n +0002375322 00000 n +0002375357 00000 n +0002375392 00000 n +0002375427 00000 n +0002375462 00000 n +0002375497 00000 n +0002375532 00000 n +0002375567 00000 n +0002375603 00000 n +0002375639 00000 n +0002375675 00000 n +0002375711 00000 n +0002375747 00000 n +0002375783 00000 n +0002375819 00000 n +0002375855 00000 n +0002375891 00000 n +0002375927 00000 n +0002375963 00000 n +0002375999 00000 n +0002376035 00000 n +0002376071 00000 n +0002376107 00000 n +0002376143 00000 n +0002376179 00000 n trailer << /ID -[<1d1d492e26ccbe99cb4cca73ae9eecee><1d1d492e26ccbe99cb4cca73ae9eecee>] +[<3018bfbcd369f2de234cd9bdbbf818c4><3018bfbcd369f2de234cd9bdbbf818c4>] % ReportLab generated PDF document -- digest (opensource) -/Info 59 0 R -/Root 58 0 R -/Size 168 +/Info 60 0 R +/Root 59 0 R +/Size 172 >> startxref -2368591 +2376215 %%EOF diff --git a/whitepaper/uncommonlisp-whitepaper.rst b/whitepaper/uncommonlisp-whitepaper.rst index e581140..982c838 100644 --- a/whitepaper/uncommonlisp-whitepaper.rst +++ b/whitepaper/uncommonlisp-whitepaper.rst @@ -350,6 +350,7 @@ Folding only applies when all operands are compile-time constants & the function - §6.1-§6.3 Python internal (tree-walker vs bytecode): ``make bench`` - §6.4 Three impls head-to-head: ``make bench-3way`` +- §6.5 asm native hash-set vs portable Scheme hash-set: ``make bench-hashset`` - §7.2 Cross-impl portal matrix: ``make bench-portal-cross`` - §7.5 Portal save+load timings: ``make bench-portal`` - §11.3 HTTP server vs busybox / python http.server: ``make bench-web`` @@ -442,6 +443,32 @@ C wins every workload on this hardware. Its bytecode compiler + explicit frame s **asm's remaining bottleneck is allocation, not lookup.** Profiling ``sum-to(1M)`` shows ~170 MB RSS — each tail call through ``apply_closure`` + ``env_define`` allocates 24 bytes per parameter (sym / val / parent), twice per ``loop`` iteration, for 48 MB total before the three ``heap_grow`` events that follow. A future optimization candidate is per-frame batched allocation (``8 + 16N`` bytes once per call instead of ``24N``), or env-cell in-place reuse for self-tail-calls. An inline cache for env lookups (ported from Python's VM) turns out to help less than anticipated because asm's env chains are typically only 2 deep and each step is a pointer dereference; measured upper bound is ~5%. The ~3× gap to C is mostly the absence of a bytecode layer and the per-call env allocation — not a lookup-path problem. +6.5 Native Container Primitives: Moving Hot Loops Into Asm +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The proof-netspace server (§7) needs a hash-set to dedupe proof hashes. asm had no native hash-set, so d88149a shipped a portable one in Lumbda itself: a fixed-size vector of alists, with the bucket walk written in Scheme. It works in every tier and matches the usual chained-hash-table algorithm. But the entire inner loop — ``modulo`` for bucket index, ``car`` / ``cdr`` / ``=`` to walk the chain, ``cons`` to insert — runs through asm's tree-walker, one Scheme AST node at a time. + +A native hash-set moves the same algorithm into asm: ``bi_hash_set_add`` is one ``hash_value`` call, one ``AND`` mask, one bucket-slot load, one ``hs_chain_find`` loop over raw tagged pairs, and one ``make_pair`` on miss. No environment lookups, no frame allocation, no tree-walk dispatch — the entire hot path is straight-line machine code. + +.. table:: + :widths: 32 22 22 24 + + ============================= =============== =============== =========== + Phase (N=5,000 integers) portable (ms) native (ms) Speedup + ============================= =============== =============== =========== + insert-N 129 6 21× + hit-lookup-N 124 8 15× + miss-lookup-N 238 12 19× + ============================= =============== =============== =========== + +Same hash function (key value for ints, djb2 for strings, identity for everything else), same 64-bucket chaining, same load factor. The 15–21× factor is **purely the cost of interpretation on the bucket walk**: each Scheme-level ``car`` pays a tag check plus an eval dispatch, while the asm-level loop is two memory loads and a compare per step. + +This matters beyond one data structure. Every container that lives in Lumbda-the-language-on-asm-the-interpreter pays the same overhead. For a server that processes thousands of proofs per minute, pulling the hash-set into the asm primitive layer erases a dominant cost. The same pattern applies to any structure with a tight inner loop: vector sort, string search, rolling checksum. Asm's tree-walker is slow on user code; asm's builtins run at the speed of the host CPU. + +The layout reuses vector tag 7 with a negative sentinel at offset 0 (hash-table: ``-1``, hash-set: ``-2``). ``vector?`` and the printer check the sentinel to stay disjoint from real vectors. No additional tag bits were consumed — the seven-way tag mask (``TAG_MASK = 7``) still has room for only heap-level containers, and nothing new needs tagging because the sentinel carries the discrimination. + +**Reproduce:** ``make bench-hashset`` (source: ``tests/bench-hashset.sh``). Asm-only: C and Python tiers supply ``hash-table`` but not ``hash-set`` — the speedup shown here is intra-asm, native primitive vs Scheme-level implementation, not cross-tier. + 7. Portal: Feedback Across Time ----------------------------------------