From def76246df5284094cfa28061b4a4b4eb8607f81 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sun, 12 Jul 2020 22:21:54 -0500 Subject: [PATCH] Fixed many bugs with type system; Ready to start pointers --- include/onyxtypes.h | 3 ++- onyx | Bin 232544 -> 233104 bytes progs/basic.onyx | 8 ++++++++ src/onyxchecker.c | 49 +++++++++++++++++++++++++++++--------------- src/onyxparser.c | 4 +++- src/onyxsymres.c | 6 ++++++ src/onyxtypes.c | 30 +++++++++++++++++++-------- 7 files changed, 72 insertions(+), 28 deletions(-) diff --git a/include/onyxtypes.h b/include/onyxtypes.h index 5954d375..3f9a1094 100644 --- a/include/onyxtypes.h +++ b/include/onyxtypes.h @@ -48,7 +48,7 @@ typedef struct Type Type; #define TYPE_KINDS \ TYPE_KIND(Basic, TypeBasic) \ - TYPE_KIND(Pointer, struct { TypeBasic base; Type *elem; }) + TYPE_KIND(Pointer, struct { TypeBasic base; Type *elem; }) // TypePointer utilizes the elements of TypeBasic typedef enum TypeKind { Type_Kind_Invalid, @@ -85,5 +85,6 @@ extern Type basic_types[]; struct AstType; b32 types_are_compatible(Type* t1, Type* t2); Type* type_build_from_ast(bh_allocator alloc, struct AstType* type_node); +const char* type_get_name(Type* type); #endif // #ifndef ONYX_TYPES diff --git a/onyx b/onyx index 25b0e01d5c1b2fbdd99e8007198a5774e4adb6c1..81422df31ffb49944d9171dd63d9fb1c0b3413c4 100755 GIT binary patch delta 55173 zcmcG%2Y6If*EW3inM^V{WG0hJdLccbgc3q0ltAdA7ef;%QbPwRLzfVOgaaIu&>o5i zDkVw)0RibEMFl|+L5hh11wloHobO)yoGI~n-uL_8_xiuNt~Kl4d#%0p+P$1J$?Y|k z|@#3Y!K@q4{H|53gt!3Cb2O2?`D13ak*#nSe7Bb(fl7c1ZI&-bw(h{1%cEK+u&S~QJWc+-b=|6ph1-1$yQN1wQAn!UKOf3TnMqNdpTS&S z=JTxivz`l+%vlA-1{2V+8fHG9?1?~%JRvjRe4`2z^4-L&HCY7#7iFoniunsuihrs^w-h&uzF=c3OVFeGq$JKG{AUo$h7(5Oz}z>d+$Lo%=k+wIiW=ZR|iY z-mdwX*N!yOyCgq8;!=kkc3Q5{v3a%aTDnq4I)x&rKjdfLCRe_amvyYgCdx-T z#+pambc6hBmoBWk+%o$RgMN09`0}w;;;t$PyNB-iZTD5Z0nqbc{>o3h&_7%DKDUt>bK?{XAiKh@q~S?-=C)_PC= zu6r;$DF4y@JE;lPLB6r+5T+D1XMW=C3-Z$*acHdIo}I*`_vG<=1LfI0tB6?_h7+c3u{l-yY`OMV= z(dC1X_&NE`CV9+%E>7|)Z%Z*S7gXL_M^V%u`zc>?G|fDSw}XXP-epX9ev}Pg{PrVX zq4e1i81_J${`!|7$m4sT3T`-%CuszBpegyLEtTp;IlE6!mLhNK(@4r4z;(tC(3`j3 zIr(xCdE@fP`UPPEwXtbD!iW^v+X9$Ilm-qdfpc;#O_^z1Z3 zN%DwS%Ea}XC`BXlir0 zLp%H!Tu18i=9G2t<#S{Vji66ry3Oy8%3WXW7X0WjI#5ro12JH9AYZW3H2Ki0)5Wy6 zH+iyrd07{qTr9@3m!NYkr0cOEni(KH@H%1S>sr5PkU0*x=&Kp$(X2{zJjB=1zTB zoImWaXn9=bjJsD>-0Sr(MVl#;I_l}tZ)t_4p;C|*phul{Mpe_JK5|CY(xWyxqnhYZ z%bZc|^r#ums9t*12#T_4Sq{ZO5clxi(=NRFE#iBu9=3 zk~fSonRe1bGC%XSylYH@?zbmw))lY?9P8~m>lAWsbp>P3lw#J=3}yA zcsya1Jb7%C$ybYfPAI1Zmx@>}R>pxW=OA19{cBTxm^JJvLqT&do`yV-H@Y zPRF}yb`*H2USm6Gf2j4~Ae1*M3q3tt-k2L?ETe8JAIy!cZ^E*U=%KnEl0y%*y@2l* zKC6@*(PMb@Dfv!rM0noyth`^3NU)?$p#1|i@0Me$_Z%HQ)DszcFW5p^jUVo3+hgYL zp!TyBY;0md~(P@uUQ~*@O=M1-JicVUxeSZbG8yXO&M+sOI*IH>&06$Y5^f zc$NRcOz4*H|7m8wpYFcAXM%s%hE_p1`&rMdy!+iz?5wQ3S=fk7-i?BQr~+vM%e+l% zrRU_11QBh@&vLUvv<50ppXTy$+PXb4%vMv+qiiaUs`m7TN&iiH$_;iV@6XDgUAX~{ zpxO1B|HfByy)4RZHp4BBb`{i5+}wFqyH5*#HmZ0k!Rd@tK<)vzkM8jP2YjmF#n9q1 zOHXHF8s}>0`lm4UkGX|;cfk(cwY?z4$Q8<#7+qC*k;-7F3hiymhHEM|-Ar@RY39_y zMpP(kUCB%=sf0RJXb)5tT}j20RGz=*a0Wu5tOANCqMp%{@1SzUp<+9Ox)924RMNRh zI(r>DXXx&sY=0${gQW77Qw6mwl&z|yvVl}aJ5@YMWkMyD1>d3mOWQehXo#0}sigBd znTdC*p#KVG)hnrVCKZEI1tUc$^Q@#&k5q1Nchn5^l(Gi~!RAsmA*6HIse?I9DEo|# z1diHMaU?B$$EkvmC6sNfq;ii`raDzHYJ{>`l~m4?N)N7Ln@pX?hjjW?(%C~gwVh_r zpM|pYN-C>J#o|=KND|8YE2+FeD&_AwitSG-PiR@wi)1TkI*@eEICU`l2xS*sbPAfb zCY7yD6->WE+0IHTNu)B*se%PVC|g`f#hX+HI#san2)44Jm2`f)0i7mJonSK4vXaWT zq!R2@!F`WV7FkK}C6%wX*&I4yq;tKJ&N9;3?KBfkD*Gy_ zOeK{9r%D8=$dy$3lgdb^N+hY|>MAyE7HLU3ZJjz%q|>RAnFLaab*e;@3NG?o%H%^T z%&Ah1R6HuF{QfOeZf$jx+7?4P_wePcnwzBaiBl(*RE||r`HWQ7I91|EWql=;9i%c@ zQ}IL}$F^H2pY6H!CmA%}E#e$O*`j%|U>L<|1~^d^XIW0vPzmjo@quM@D$WLY5y($AN9-;!?6+qg}L z($$FX#_fY1=4;_49*37h^_Q1ZNNg`nKuIeF>i~O z_a!}V*x`9a3CgUz9Zx#BB~Lo3@jsJBj{CQy z#d^}^`o1w(R)(4rgS5E=^^n~FMzB!wT_STtqd}=A0hu;)^j7Qry!sr-1<%hX`y|ryG zE$>=y*h5<`YM`cM7rkiybGIqs4lGUe;rSH=%&W_=>&=cT_tzaj*>yh=tM7h2<&m?i zi78j*WwV1C`=d?JYYY4rA~&48jiatQ&$9!8v)CmSKKFbKi#S&EQl`CB)v|l?li7hu zefi~3=40-ZI4Kxf(4>~(`93CZ%C@7)FbtkVic zUCZtg;V8Yi*5XQ)DrjvbH4>jL_50ejWAZ2gQ8bhNb0U+Q=Eihxmv{XLZ5XwVd6Tw; z)G!G|Aopo&Gpyb6!D?^IAx?um0I$V|BBYqQ_iPp?`eo?40Gm z|EY6!!Ly0-k^ksG+wg>@yyrh6-}@Pn8UKi!^^3e|o*#>nKc4qJyDqPqKU~bcBv;H& z_ivA*`VkaeaGWdSMY-LACVtiaO>k9Svmi@cdQtviL0kFZW6vB^&m~k1P1&XVzM=Hr z?i;ii-tO1*hHG1a#+jd4YSNO^&8%()mwHw00r~RXkd~zrR%u~)m-)Cn6an;eN?`-0)ZP5$y@GAMvV}IFWae{dAqMW+8P1Mqh_ReE`6OEbqFlz`hHE+VR+N^xz zzpBft7srbAR>_AJhl*8K$=4TG6U`Upmx~Lvu( zxrRFs{#3)A2^VX)3*mP)+?DWJ7yOonxy|_+Zbv#(J#aKb2JI;@N)vP>JW#_tzPpCo zP<&erb0->WxGlxk(r_l>7#IDjE;>~-oJBe+&1RG@@-KU;1$f3ky5Jiw_@WE`%mtTd znAgxw4fmi7HfXpnVOhfi2*0V}R|(Gmw!w>G6d0!oMiCyO;atMKHB3!b)5N@vF z8HDRu(!Ps|Cgt6!=BMyu^21@HZ~_a~J%n3odrS@4Dc%F8D1MJYU1h zY?Sd-Ex@aNl!lj3{6G!!rs=NXMHJsw!wU#E*6=*SwKP13aEyj|+gH^v?;lk(%=?ha zuOpJSoXs%UrupZ`_9IBGrlsfPLR_))`rIN{QRoZ!O`t2JRhTtCw= zpFc`8yoO4@Q^V^CZ_w}-!m@^U5PlPw=KtLY;L@VNc!0oUfa3&41AI%mvEjwy6)Sv1u}Yp? zxE8M&ZFsdfY*j}lws{lbh~mYoXR)Mq*v=i~JMn_F%eZF1CgK)Y>7IqETDlZp*zs!5 zWH0;TRi%_|5%SAxa94PETk%2J=mVNMw;y` zH!R>xSvqi@JbrD27&))FaBaGq_+VD?xeXca;+Cnh*S36P)v3A>`HOA)YW#he=aQFs zbN;NGY%)E6e|!vPztGHPKn#BuVxL+XHKlm>yA~!so}`yGxmexa$0+t5=LoO)(3gpB zWA$)?T)JzRC2F6u9RB-?b9PS-4*LSldTc_i+m{Wd0HM4!)<^R#$V|t)Wx;eHZ!3 z7ZKuyF2z0~kTYxb|F)<@k z&b{`gSoJOW&ufjvYi;HF*Qbm9+sb>cKQ&3M(B1_@AIqJ-3@$$TZ8tIG^iue{iO;QR zpQ2l%F5H&D-wheXwZF?@p2z6WoNqjSRbG8-u4lRyYH(GK`aUM1iWc$$bA2n}avMq# z@CfHcr2P4cJo5Vp&r@3H^cA@fp$%GSKX@Qo>)V6H=YJf@#A)>?Ts*L>f{9)0IAru4iv?bWaJbtM?OupluvTD^Y@dA`#-J5 z#9B$kbDxDX(VFNmef~ELuhsE#$RG7RE2wwo2dIbTzJEl96z3v@BWMBcA+riHFCD~c z4Uo1WS6=bQ0dYv2-0Asu;)&ei>VJ9}#9r0pMlX_+mPF&shTBAb<#$FuC!ItjKeTw` zAcM%$rJqH~1uv$HSy8g->kvJ2w;<@JjJ#PmMoq>+CG*m0cu9U5$Lv<-8`%=^&Mw8< zoh8~%??N;#Nxb)Eh>MK}oguc^_<a40$Xzj;Bz8 zama_tRu9%Pxyh>t(h0TJ>C9)C^+;CJ9v6x@OeGW-{i@<)VtXx92Rr-esKLr*6YDOv z4^ZMg*<$gMzp~qttrc7ODV-!1F5dG~MoX-*=;5clC$VI)+?V84m4^}=EB5eJa;mVt zZh!iy>gp;iPPtWurHN~OC^m)y-b!09mLO*MD7jwfSYv%kR(P@ZMKRY>lHtulnb_To z(G#o8wX$^acQ54^9~P`M_hW~}2rn+!=L5m9DkS(${6SJK;I(D3+GeG~mxYM#o0Skh z_Jg?BQ>pM{$(G;uVA6S4JKg-WN2%}6o{Mu#N@@Vh6yH0lObuYQr71_Lu1=TEHYs}p z*dLC(M>s36^S3aDMy3YGs~CRPT8sKlH%Zic(QEaOr#Q0YQU5=IF6|(29uWgR`Q)v~;7Ky9=EcrZ^wPs?M z=OsSzY@jGsJX0nlvWen>XUdO>?1ebvsd7JwRd-v5yKDuIV;U%(lG!+M@2|>{WOhZo z@uXx`3X_<4@v(wCgVo~H$0ZGGuq>lnjq(aremvY?dAklPa9jLS1vOH%a;XjrQHIuK zjYRLCludP6srW;>l3$N?lazF=a+1oFAM3FcX@nkrR;q-hvG!6`J-o40$xUN5rF-=? z{Sl=l+tU~p*5?nD{q@-xaafv?kj`pYm;8pp7vPN+)cBU);l42)-5?}QS(MHiSDP11 zD@o>ZlKO`L<25Bzk-z=T)-UcWchk`)+tgFWG(g8ns8_P30qgA+vN;tC&UW6Z)2`H_ zzTNaXSm`IXm4K#fMBwGAh|4#A3DzPHvmd=6H>p;M+?4fa;*nd*ugzGxXWSI76hB27 z+?@FXEj|CnoaAl!E!*Xp8aWpk~CkNGX^;Y(oo1vhyhtpCy)e$;_%K+@tLml#I5ll^8QdS=g4X6w~6A&@7fD)`?TvWMR_(dbBbc zyhX$n>cRb=pZ&}`aset`5T1HR{MDj&$AYG>V3ujot6kpJ7CqbL{nnyKi@X;-vkGc- zM0EF#NiXTumC`O>mt4$ZUETI&vxltz>1P$H4ZVVBm(H6}?|L?M zE+Pv+Z-cgi_JCXy9!B^q=nCi#=n?2okP%hq0}2Nvfzm)NK%GE+K|?{~L9;-4pjDtv zpbtO?Kqo<$lkvFzJAg9KZy<*HHiLpeaiH3url5A9o}j^?F`((7g`h&vI?#Kdk3q*k zUx2QI?t`9yUV=QUqgFxDpc@;J-Ue+2?ExJIodsP1-2puU z{RuLnF?~Scpd?Tls0FAKs4r+JXgp{ZC=av>v$aWcD-+{_Nzkygy)Bq?L z6bGseY6@xx>IoVQ8UvaRS_moxtpmLW`WSQ!^abcT=sxHP=q1Rr7HR+#4XOcZ2+FLb z+SIN9{XwsTCWGdJ3P5jzwu1J64uj5uu7K`<9)bP@8PQ37K;fVyP#sWXP-{>pP%qFx z&NunprxQyp!KP4s`_rKa(pW_z!yFl&xq3S_%UQyN195qGVmxG?x zUsWH1-W;H+)dr$UL45|P>Qm4%yyBkps;ZuNRr%|67SgEUFjZXungz!jzNX>9z?mS5 zx6^Nskq(8sfkq8eI*()*Y_*nRwgJWGJINmRpSWGmE~Bs=|1Y@BkufFyr}6)V!T*sn z@%jE*ru|Whm7vq0zw(uuquI~4i|f(6pv@q{@9UhfojwLWqK8j|zw&{q4hKyH*+BUq z1=M_(s&)YN1`Pp?1I+-{Dpu8~JC#;lY7^jxyDQXK@cVlz)YrhD@2yZ5fcGn|P`7|@13v*?{nHAy6uj=y3e^kG@4JCl z2e*ND1iuPC8oc_k3Uw)X4*2`v8^OLKvR?<>@s;QqHO)E5%&ER*h5s8M+4TL_*39(xZZ2d@Rb06gzL zJO^*_0G@+~{|L{)*Mj?d3Brxi3bg_F@L!NI_;v7^;J-db#^CQgLB`+QFUGDX2fP<{Of$jX1K$Ylg}wGs@Co4e!1Mm7P)!y=xC@>L9`YPp zI&k673Uvf{3-HC@uj8I?9$zN#8#6@*)Us+s}51tVe*_-*hx;0pp&btCvwY?6+G zw+zCJ3El$70yiHNFjQ4z!OdYhGBLDpANnNd=2;(@KfL?z<-E^0r10dFyJc) zf5oe6BKW7+uyh2Uj-@>p{Bnw_E(d>51CE17)`8>TgB!qc@E^g$`~)GOF&qc~Fa!I8 z*8o^cRb31|CCfUOW+GI`#l3M!b}+Cj}l=PYyy6ABuWha_h>i_zGxh#YjD4b zc=Z9i$rQ}S;5)&+0tBH4E;*}%-vjRm{_QkX9S#1oZ93KsfJHNqG580wU;z999D4|U zVJ-{=qBG8i0r0lCpX~^KaS;rF|NJJ>gOA8VdhoSNkRJRT_(O0Jlap6fL5Ksd4n6?9 zBltY<(cred080V9FqOU!z8d^I_*L+S;PC}85F`k>;MKuTf_DTDU4|+LuLHgu{0H#e z;MLz!)vv)ffIkC20Pc^MGAFE1)dt`}GS(&VP2kglG5$XRSc8aPSK<%@K5iA-4E!kg zbMSA$gF*zMjRFJUd%^pF_g@18;E%!AfIod3>A@GhgY@7ZfjP@ODgkxd?j{@KMFLXL^(`Hp21b!QQjt!vc7FFE{9=26gkAhDEzYX4T z8w}w6&;{U8;PkR=Yw*DB=(ON}f-eB?{vJjPxMe3s3wX5;Fj~NUF#o$n3c@V#Sn#9Z zt-)W}i}c_>g4-4Vcoo9{cz^H{;QK#<0q_YQ!$1_O3_KRRa32hS*C~Mk@ag+8YQP&F zK<@`H13v>k_z<2XfTtZ+RZ}!(%p(}C;BS74<0|-yqv(9#F~?M!x)i{69GwsRNAUCD zzMrATlUtc%1}W_Lq7qnC$CK<5)KiTLS)G6rg*@pEO_8>|{K-9xF~!h&jJuBqN&_EbF# zm{OD{lt&}QX9m~}r8cpCN>^fymGNMr^@_4$2CF8rYs$VEEP}ODuFQaU`;|XQX|obM zlO@=$T*rcqY#iQ+#gvT@g{Tv_3m=1p`lhQqbG||RlB;l?Qs~5C5ufdkwlWS+)UD6CaJn8_mB_5d_sjh|4--WYC=YHSkZJs}TvwPo;k z)XhrBJKw8N^5?Q(<3|YGS8C5=?#W%58)rw|bBd zgxp#wwRJ7 zzX`mkROv@p!1ir=nKFAex^EP4v9fM93XuVLPB{$dJ_vC6Ps%OQm;<~=c}W@@0S_qQ zHfS6L40*_hfctIWoQKK)3M+Y#pF>t346$OfgPBu14`0EW$9drW2 ztD?jAEa;MP}t(CAZ~CNSObNdkdJe9 z!Z4D15QQ}RAy09~Nwt!^z2+h0RMMN!>E)rcpUXnrUjV0hDkBMpVPl;vDN6`90X`-v zI|%0hACi=2OMqtrKa!N6D82~zp`=LjfDZxxB`L{-Zvy}BtF$Nl0(g&~GIAceEbY_J z`76tS+qVWDg&pQWS3lb>HOzN2d`QlcpCh2dg0Nn@>KM8^%DNcxhQZ43WSjQ*$)QTf zeBevK%_Eg&!0n#__m5N6MX={=kh#1*qYy=BfX^VW>Dn_iKdMp7lMbB^zDQ8Ek?kDd zmNk@fgy#T{uc`bDoV*42{VZGuVBT}&quKe3#tqpy1D$0ZmHG>i_95`%E=oVbRvZgv zW-GISlj{NR>ZYn+x(+?f&MCW{KG5mkOF2bp>8LTTkMa{?I&NI;r&t!Uh~X!In-9Rv zfvX)uEFZ#Dw{#TA8jOAf?C@6{$?JvWZa8WvkiS<+zQrMrg*@t2RjKs`3%0dJVEL=6 z`g2Rg%jN`4-5(9E$rH*G4k%_Mr}K6HY+k z`f%KbR8pwNhb}KI;&Y; zAVaj|+cBUw|@>rmfo5$STy>R$lH${1a6jOogOjp*EVm9#p>Bdb+Y+nPj1-R69Z9r<|cb$#=96HOO z)6`XGno}NxWBX3Xuer*_uebvB%m$DTS%@p-F|Iq+X zzXtMEkbhq(gKr%U?1#Ju?j8D6l6Qx^qqaM^28E?i_^%vz4teXv|9K{fg3%!K|D46j zqGjlDLFo{1%cV*(;hVtqmnrQD zzW_F_(7I(<5H7J+C`%~53Gk#9$_~Ogz`v|e&Jmso{EDpnM7RiekgRq4L%@ZylDr)8 zH-XQuRN51M0X%G#*5$%*Z?SfjvV`KB0B5dNb`Z`1KDAmow;TnV16-ykKU4fh;Jh_7 zu0!090tdgX)FgZxc>G$WGhqRD8F59*Si(`jkBXFKgfoEC*DD_uvWQ`?0Y~5(qOelS zEOoTp0?6NjJg3qc(A&92K>j(dFGf^KKg5y#1mu33_|WsXM|o{hm4P-EV55HNhP#q- z+;x0eDe)JM#IcaC`upo|$*55;lqTR^)eI;xk0*)$Cl2@{p zo^H7B$-=dYvDhb|v8PhHjx`XUcPOd0o&~xqXSOh_lC_0JDGh)O_>+Bd3o$@>yoCiB zKGFk&D6n4-L~Uh3ifJnntU-d323y%)QIz74Do}px<`y6dBjRxpMLr7Qy*Lwm6`%G7 zKRH`;Bb7i=_^rBKrB)wJrJ2cY0pgmC?cy z$*P5(Rlj1FtRiT0Xw4~EQOpV*xt!E?hAlWkw0h8s3a-@W1vbKubes&$~)_$J&`F>Uxq3Q=%aOlkXg5WvLvJx9y zt7SK~J)R3K?;sFlDN+Ubt~VTh-E#KP=q)DB3JUK>B? zLPW=E)3AX?MDxQqIH7nk8z?-}P=#!g^9f5}hJ_n^sD`&IhdyJWeZvjuTJ>zVC6;Du z84l9(^+j1@>XYx$hTxA85DWVViCJAW@eW<90cmw4_v;x#$TEBrVt-XqPq2V~jSXQ} zaops!Po0`&7(%G+snChtF@)(eRAWLRS>jH&Gel^XvV_>vy4Dn3E5;WKA$vvHaDoMy z+_l0KE1#ag3xe*-jT0=qYN}q2$|?L5?~^Rv^oz)gzgKB`l7-rS5mU6L&5C&oGZy<* z^od2Sp`fvyx@Z{=vggbF|4Z~G|HZ;VnjbIlCp&opG*-f1s_>IyKm@p7CoSCuG!A`O zQ4Y#qjko+sv9VU^vFMbZIA*gmqAw+)R%?#y4t7iQzNS@W;>XJ0Cs}aEuf-s$Ny>Nz z?!oXXpB^3|#P;i~LRp zRbUgu@NW=6jSI1=uBG>VAx5DQJWV-tnuVL%i@ra>r4Z%LX;f=_kxw|3*_cEqb-;_0 zkityL=-~qEDEi;y!4WYuF|xj*w>BMR$2>(m>nHM=l7?Es0~)U$T8Di*Q*&@GP2u>k zqOI6)YW>MWtl=nd%}=O5ne1)VF=ilzJ?&Prg@i6t&(E0OpGg0w^4=L18vTsb*SkVY ze+)wQ8?%y>I@{|Mey-d&PG2UqR#~k#2A{;8ID2PsGehsF(4t6S*YHB zW2F|Fb}zkq#C#J8h4n0I88)9Nrk2BI7P(QYrI?x2?z@;i17KVwj%=x!IK~<75(1D^ zvvYujksUt4jEX_R!%UxqGGaQA>ql9rW*AdR3fi1L{0~Wj$8@IN@dXQ^r`d+W7qc~A zu4+kWE|2k}PI?W_@J!a&VitSQJaI$Ig=Y7dzSI?N+x^&Xi{XCURi>R|qp@(^KgT{a zV3AsRf%Rf3c~Eu}(r}M&VjrL$y_UjBGX}O}o1|B6sE-o8ht(*#bdOEd_Y`xQs!;ZD z!^TK(4{=`uP05o+x|D@)Q5ubJH|Z68o1}-(v`T5fl2ig5B84eazhv=zDR)oud;}ZX zQtqD2*L7OT_kYQk@`^9RJw zPhd-!^b)Ebgp9enw?veuVI%#@3!k8K@PTzUUj*LMn@0)!xeFjGdI!3}e0uF1O~3G? z#VY6;rKs;g;VZqg6gM?yLlP_MF_^E2^%Kbru`nZ;cg6Y*=#dQdhmbO~ZWQ!94cYWt zFnmJ&^}NSwmV~geluKhjEmusGep?`+M7%hDf(K<3G?lbMjI_|AozUa)+0Vbp{i(|D zS6FN|{an}6kg8{;S)w>@$zSl83M{0dr@0A70QL5tgjIps-?<0Y>@M=uwhw-;)f2j1k#g6k%YjSkjlH~7M2utiu1vWjjHpJ9# zse*v%Q7~b_vWtew&!L$Jm@N3|!fjTY^;Xv3W;;TuH+seg{7iZQx#K1Zo(VotXeN_o zrZVIX-x+^!hh^H@LC-2l)^9OsS!nMfRpBKNEFvV5S11Wgg1c!ixPi1Kvw^Vr8)Tj# zd0VqEKU=67Bwwu+EMcVO8%|APwb0&C^7A9DD9aF%1o~e>4J2Ah`QQ$&asvH5)nZX* z{D5bp-zaN;U@ll6p7QQp78_F|N0ZmbOhBKgIb^3{ z2=xOR=g}Q=l%Mailv-)zq0zS=JhqRf3~k(_;1PVXFxI77H55Lc9kEi$y2m1$@Vamh zq(n5~3qlpFUv9$3m^<_lx(Q}!gpL`+vln)vmFaUO;NNEG|J|uCDaA1+kGYOX?O^!N zF#Fx|IO(`p9W%jX|j%uW_dHW$Bo8unQ*eu!nh^1?1H|O9~N`Ho|s3hzc zhI6ldj2=OH`xqtc7^CM9pfQ^KgvMw|&J)(2*$1f~=2XWZr9Z?+gY?+1e2`Xoiek1? zx<18~y*?sUsMCo22HZX(2|GsQ7&NebMDjMUk4OqQMkHxDMr2R8r;o_sDwnhYiM^u~ z7C8}W4UpUC7NzVd^S05jmv9C{bOeJ6OJwd}j79x20@ZaB7Wk@ zV8*Ll)Ti2V2%?XZPc4|w+nA%o!q(U%)gFg^o)7f;x*%Pl%`JG4EnGlGj^w1$^BU^Dmk`@k$h_LXRR)2g@}2q zC+n`I5`H3=USi;~0OsG0E5W5zqcw3oT}#u5!LR%@75EhQ1I-y`W}dBEd{x(FMV%au zm|1nrkr9!6iZZjNujqNi2T-OJ=9eS2baNfaKSA;Y-hvhN^G}oL{_Xw{hil&0r!heQ;jFnLxAqORecjv)@@&+aW4LnR%tI z+d@-?ZgYojnY{!F*SK<164A-V-EEdpM8@Ki$izDH#$j4goxz0SFtM&?U%OikX#rfgV^lF zdy>nm%uRI@Lo|c1^ozsNsua7SWhtcG_!lMRISaSFASafaf6_-*cSq7Xm`b#&S*|y4 zp9FsTTHcIAnh(^~lfucwET5*pZFMu79cGp~%*@gU+=v9e8K2dh64=m6)oCkT1U*l~ zh#q=9`fh;*iVJTEP(|<{J4w?hr=h&>roX0T!QVgvWJLxvvgYtm$C%)!{Gn}V;ef-j zGxbCRw6sD>bsN>($e`(%=IC4?#OF{J1I*|2Ivk^GvZ5{y^8*^&t8z8{dfMbPT7qK(+l-R}bPYNID zz4fUGPV>s5M7*+m1P`)YqXFgH#T=xkMyvA=EAoUu%eG5xn^u$&2_uk%b!kgW4Go;6 zvlMRPLp9e_pSI}!hCZyQufsxZQhjE_-Zmee0O2%qCjMZFD#)8aa25DCKJ8yujNGn!QY9*(FGAh{#)$I(5Z97gv0&C}on$rrSK72X>DT_bYB#`u_(9b`&gBD#H8_BAEF>$Roj8)rc(UqSqtQKLz## z?V$djPhV~7LodbWBGjycflPQ*H;@;Gi&%0zY6aASH8bH#LjO3YMX|DxH5QMoe2Ha3ni=+1&1EW0J z8y^Bxy^aR+=;%qQs(z~BBfvrsCHVssEQE~5tmDz$O!@`^>xIc9$a@TCQ!@pEOk+%4 z5#Y698fzX8BU){k{;`#fLy55^L}i%9Tj(H#%6N(@G?{|wFBO^zCz>Xi4mhk$wp&wh zJPo$-q|>yd{0Rn5rk!C2CsT|;)1oR=+$h1&i?+_5p(n{G;RdFB(_dtis>qZdOYRDm z<5ZITIyc~NqJ`ESQ-0eXu$C$q!cbt76zq=W%S`8}4AT-*mIn?cnuR5<7M9d)f<%cH z`g>`nC0X2pWf`JOOS({?fne|?b5%lmkU7GMrlqDl1Td(LYjrQbPK%d-qQTWMxGK` zgPTzz!ilC;riqR;tMoMVhzVB+)Cq7*NuWSmasjz+Kzo>c0&Qe~aH>f$9peUU)Ou^o zT5WYkNlb5hYqfP9a?^T`31q>tn$8vL{V0H1AZGFn{({W$DAQ_O%G%4YTK9)rTU}SP z#+_T;YP9ALxn=STvv>-91v3R2n0A_4IV|kd>z*gtS&tGWTIkt`x+|hBhmRhc-8BcY#Jbe)Nu`|S` zo7y@oJg{hEhFd80)hslEnyJih7e*K?oTr8l3hPb=2&b9~O*0$@3UwFSlB0!ow>Lp< z3JrRb(rik=x7D=GMDK@clgYLim&wF&outrpk~qGKvMWT~QPtGKKnXkp(N(l7SyQHE zUlrxz5mwL5)YWoB`OaO8@ZSfqXCyj-uG8Dn#7pt^5Ifm^gv8xMoywj2>&|C0cRoPf zc@?JG1O9Eju2$N!<8ZN2$j*#;39VxX(f+*=#Xhus-@Lf%!7g}PZ?$D2wa)INd zBIv|R3-FyFmEb#3ItjOuq_S*)+j@yP82;jDX zCih=LOc>WzRPXPIbms%e-6SFo-)IVV6Fs`cc>&l!mQ9ZhpFq=d6ncl&=$=(9TP@1q z8saQl6m&z)P)%f>an@%D@g)Q|jaz{QKmDfhbL=Fv70WX*n6#oSG*x>hNq-@bi0t-& z2d$%qMVAkw9k?nO$gpR!fn;WS^Ek@0y0ru3{4&F{hVNDWw9HZk);()Slf-IS4rR}} zzP%Bk1-mP_yD3SeZ!&ElJD&9nfxu?_WoID*_RCHh$BxTR642Gk>y%Qz>?CZzTCrJG zO8S4j?IbP7-3rZpj=L3FX>r+!-6if;j5OmQyZ%sjH&sE%-J}2;^h=h_z~QseVc1v9 z{mnPg>EWxu-#Z6qMV}*ub{YB=OQZl!;Sv0jKpW^F4DSK6YCeQ!gkW)w=&n6k@^;G*`saabhRP6u_%5$bCVgV$MNHhyU7Ph-A(?m zT&+9#zL%MU7HRtYm3lx{)DUZu=K5Y%Q**sf1ivQP%UV+J#AzowQBU@pJvSS_BPnM7 zv_kOgs#V3nU|X1Z(n3vXi>}Lx);hA-!cy#6@C%SFtO-pyl*L*-*$jIYe1HBfGdgpi z|J=jYF>`~3TKx-699i6OWU-E=X<3Yjn1ap+{Y>gvRBP3mVSuyc%sgR%mhhA#eJGYG ztrnKETK4q(G3s*G+>xGsUdVEp`TjiK{(``N9swh)=oN>7Tvpv)M&4|>tQie>lu@WQ zkqjg;^Vm6B&QswbeOS?lj`T?^)$RblOGsiZXjMl6V(9RE1d5&p8~$d7mNba!nIiev zwc;Hx;8^-0Bm2`_Q-3tZe+$C%5wJ~+Nh0#noo_W`hmwgY=BAUi zeE3gJxQSxu*)$tdlF3!Nq>tlQ4O1GCkZ$$kX?12(ef1s`|2wta7v5T9X2h3JXSu+a zVGNb{rWCy7X+)U}g@VNEGGVCw>Ih0aoa(0ArNIH=_6W*ovyOEYXD~^>f-` z#4e+LKGeK$5>MvxXzh1Lxrgdqa6}xx!5Z3xMASXp`7SNiKyB3BTr^QLQKm5(DL6)H z#qOSH)0-%cUtx8xPm3toh<$||Yi3?BK}!~-w-PIw;z-@h-aq2#SEQ_2GZJYPPrKV# zdasiCnC+)d{-YyUV?{KfXb$+a*ZWAHIDUoY(~@MGjV#y@)}i9ugk`86{Vbb`*Y@by z!&QCWNC&3R@>s`NcB;3bIkemoLvKJ}@(Nd$S;eZ&WRxh#DAYztyey!h# zc|{c<#t%9MAa@Q(W;9=trJ|ewYX7v@dm)Jb;5*sZdK>^uHBSdOXE~MFUEOxMs=_Z_n-1t2Z(hWP9TMr zo)e)U7Uo0;>3OB=c|{EyBCs}*)8Lpkkq)NRwaizRD5C?!I_Wbhc^!N5P<|m)w~96r z28Di0(gu2Pgb=xj!r|^$7b{l+#5mk9{v9CJ@|i{^tC^_{F*s+3&QTf%iU}dx5lx-K z@#>=Pk~zWADGn&FRu#9Q0X>7n$gJf^U^0GYeF8(4uMjYvkO)gC*!p20nG zt$$J5;<1bzB7PnGGpw47ew2fc{we|G;Im(u6Dp31JOMGQ;-7~G^E4dQ+dObC#nyJO zUZ6-}Vl2C<)Cv>R%`YjoI)AUgT%b%06YGSGPtvN#`R*o_R1m)B)e|Qgnkf&$#3Gha zGCy2wP48Bmi4fx~wPH|I{Bbv0$*eP#zazw?u$gIy3uOlSmq1n%ijZiGVb;3{`QBGD zBK1K*Z+5;8|ATz9m63?FT}j5`Z#=-P^zV^;sXH1EGT$~xCiwDKK|f)hU6H`*+Yt)J zPnZvd{C%_QAasa%QZm|%QQLTvG2>xocuYRf-^~m%e#fly9hUJ1sf*?BVOepD5~FPe zk>o^u(Mqoq`%D`As$fhPrEc7bcBmqRtQ0c&Zh)q-fvCImAc}|lG?yAzL#UzXIhV?Z z|0GSSjYPw8*t9yHTGB<7R!oe2&6#6uF!4U0TvTT6Dg^@HzSwb=WJ_#CKfYsKEst{WbXi$pxMAevGKSQG?eX8lp_v z8#Q?Sp+5rjM$MxbkzS6i8!I}VvTAzzQ`U)?@M&0BlUGFWWdCGpYTVYcY0v^vrcwf=KVn{+1xp`w&Tq;&=Q&jl=aUEOX{0#V<*W$Iq@C zC5glBZ%Sy+94XnAB!-K&N@vH8*dqKFXUG3XM@Ji$@c&O|$Nxu1#}5Df*)bib3GM8N zqhkST$9{Aq>^M5|8xcIH4yYm0%Oq`Uh>n*@T4J{=1nP@ju-@`sHTh!KtEQM~`znh1 zpBD{#4|iW|ZQEnGNmZ))5)O(6_R_E$#;;`7@I-6_B@4&qwl&e6B&&5M5?GcdK;Xwm zwP2w)LM49-S#`6ViA5m5LRv<_kK*z{{x&`u4P-EOzAvaZzI)3_HCsE#Aiv(@ZC=O4l(T|H4dkv z4pK2n&{6sn-<>1{g3i)re0Px!!$h`Jgzv6W95U`EMZm@G((lNuhtvnSr}P@Wdr7&7 z=`GE~cOU6%==YVbqCWab3*q7`k_2~iq*qaZ{?Z(jdw|plc%XC_b!;0Xb%*L;=@A02 zN-gj`L^=SYuSuc6L#15cVbU8gF6j{g35ng`Wx{hrR~reC3(QyXsHisaf~z+ z-(#g__#P*9z;~{69N*)mn@BZ5`URR3r2-UnlGF({C)=ccU{j?1@N24c5#Q7BZ)W{@3clZx4#Sn@ z(s#(XP^t@aE2Pg*2eL$e(PX7`8TzZFVQ_l26bDU38jYAWQZkz0ZK(rNy(1;St+i5r zSSyka;Cr341p4cxJ0GpLunztcS${9VYf64-+QD$WV~0p zfC3atKS27C^enoSAbc#{hA;c10Z3dT)x!6F=~rZMKpG9x2c@QP?h}drqRAnt9b7pq zHAOWZksbqoDi}O!Dn09pBW#g~l*$ZGFkzTqMcrDZa%&EblKiqudKgSIiD04aj`S!v z5dxE7AU)}4Lp_AdUcheBW9tq|vjy%+Pxxj?u&hSb(yu(gEW1!W(o-G~EjKCfj0bE6 z0l&~d@HfK<=fn2+%u(ZnwXw)q(0(& zSs?8Ztb+G5O6JE5dq|}v^tVd^%xc9M9h=qn(y%XmL`4r_=EH8-G5GpXg@tONRNqIG zLAbVM&GMZ_n$?(JAW~=h=1@suSZEkReSCYsODT>8CL%P*cP?qhYgR`1{z0{#$UFQ{qjlRbfrM}pVwN$Rw7YE@F-K3|BsVr6*kuKH_DuYe7ORT0MKTpG; zk;n)i?|D&T>*;&Lcn z_)}1q!vjG9QBeNxy{aBy_TQfmO#1b^>eZ|2>iSk!$64eUMb2CcAw5!#hL z)NF*q?b<71UJ;A$LE46zc~aY&VAe~LsT)py)3WrObdVZmQWhI^F9dz#;hvz62&wn& z5}y~rLqN82w@P}g`Dlu8oM~d^(VItFb~zTUM0zmpH_4b9Dqbc$U}ce1iJ2j#EQdD;{dknvCDBl!lyG4OOW3F->e~(h2_osAJt@I*(tH4$v+I@TXqC z039F+kJ$<(VCG2%#A9|x`w&ei?(gkc+W0@QDCcYx%(s7)nrK4=(&T_B%A%aJWnxi6 zn$FqUSehuZKiep>FkRp~jRpC|Iv)j==5%0b!5!Fak4j5pf035Pgo4%-dS;muM{W7C z7MG}6JZdASjXHQ$f^2;xbsKf{LElWw$zv8_O)#)Rsa_;4Xa}GO&F-42i6$LcBlgNK zBG8ew9-pC#I$v@5CPR0ue`9lEQeis!UdB>h+JLTNU|0 zxX}l~jZU?UKBEdf{U)Or|CtuUhG4Tv)nnmZJzJ#sPiGbxd`B6Mfa<|RzFRieW@1-~ z^^@cJNnWXvKbntPM6E6IMjO(y@5GRfkY%a;UUIHcD)ss{P*RzcBW$;JEqNdm*0+qb ze6=E2c~fD;!YLxv!d{#2j7Ax?lUVkX$QMWLUKqkzg z?v_K_RCH5%-S8-YmDtDP*b#(Q+O3#n^mqxgI#-&XaYmZItlZV>yF;g)MJwHMZGnuN z`-5Ct$54MDHW#zh)GgQp7uslQ1|}7?>;~-dv!&`Yr^TsamQ{drJ3z~mt*nP^9NAV$ zpc(GMG-xLM#Lgv0bS`0OuAY!(dZN@-d|KRH!m?tPWA-Q70+y~*;%Q)o4a?suVSR&Z z(%|Yv!+!XbEX|Zqp*BO`Dr@a#*$w+(dz@K{ke&~25{}DrF z1>C*}1Uq8%z^m9p2O5-MA*B;^53S&ed}s1w!+aK=fT1(ZIiR>sD0h6cn)sLz^Q99R zdcc#~58ugae^)HGqaH%RzBNpIc*g1Qz>@#U%e9JY4ssDLbH*^2@$twu93J~r@y98) zO(A7JS<0%koO=}4XvHNJokvBerv|4%x5J+;#$m7ctikcd>^&i-bYt=QTCuPjOYcq{ z-*bisFF`=&YW~I9z`W3KF8@EN7QfVmhhF~;T#+GNXtb0)B_J)!1$;K#*XLEm9;@2r zOTg^IF{!@TQ2q7mK_3ER`Xh$t3XJ7&w2<@lSEO9C7E}86ilN+agJ_+Te-Z%|2W4u9wTCkL3|57SgDt|N|hlJ7}w0wiM zH5Y=cPd7ZzfNwDp#__L1EndU9_*2oO2WuOo0yQ<%_yoG;z9^JtxGvBQyd==#vs=w1 zK)U<(AXC0&YNaw&AWe~_oC8WOUWLy$0_&{Ul6frX`w+@4j`U!09bUm+q0~?}xedX< zAtelXNXKF{N|0!Yk@TAjBeEu_<)nTtn)YO=aV( z9}|muvbOqG@kURUIheFvWNy?3ne4+!82yr*TgAH%y_tKR(Q|`Qw^O|fS}GYvwt(t0>fpt6Qn$-eSK?cPA$*fX+Z|Y( z(q>bqz&+bKE%!Bn0P6c>>1Y@ljg4X-OOOK(?5eTf{F2cVUl#-k1GPtF0UuLQb%1T3 z4;^`%IUj^l8+ALN5=I=omCff9TYIylC=bSA0&`wGD30`o`OLH8N^h19Gi}~d<}0uJ zP)fb7lpjLnlp+tZcUf4VU5LD_)!_ zGwS{k^sN?qN?D7j*+@@i&Q&jqOQkHkHN`iT4U+NQrqImii`( z{(V>m`{-qHe;?KD;(0^ z_a8ieTc>ux>bm9@-xFeFU)Ck+5Vm%qJ1=b(oBFb>u4Gu~{n0R_zl2qV zUNt_C@>LdMjb*k95rIf(7>{B!X6epXHj2o8ltlUcSb8iKdA7w}n)A$aVq8B6-aFXH z%5~?=bz-Gt-wo_>#6D26(@ipUgZQ~0%VISfM8a(>lZ|*6o&OZPSev!+UhO4)$nQHE4RTPjL@pI}>Y$_mAPz}F=m2riu_ zO^mwT(AkTQ16Tn&v{p}= zVOPjyJ>GK~7)C4;`apm*_qK=WCmYOUUzJjQ%H?lEZ$x|v(wsVwZ3^N-05hkt28{|} z1o#jBh)Rb4@LzN{5^6*%1MJ!`AUSbmfL*Q(aN^1U`M1r9D+BD>iy+`|;>rN|H?9mo z3*(Y5!WFyYb@<;XNrRcKq&W1bVf7%^0Rhz`gIQ{@Lpy8A3*Oy5#b8pZ8YsFJM{udM`XN3RnGufG569wLlA31$)UAFb5+%5& z8J#5HNs@94$!6wrZkxMrL??sXSYaJ4a&|O1OB(ozj*J8SG4u9MD zJy3QBzYONxS|Un7voi3Tz6mQ!ZkXh{YYEC92T6@D%1155U>;1aM3Wxf7z@`E5eL^5 z4xThy>>tYf0}uy?{Z)*OsC4a(dIb>jI_fNKi#ngfpz)2M8FV6-o~|38!}TPB&UJv! z2b(am{;%jV3}z$c(~?fLl;ov|H`6KPX<8ymz^jo)BM?Yh4)L++V|6|U#c?scK2DF^ z3Ka_e;zfPDZd4&BA@4dM??=cGCIukxlrLVg2gv(-AjiG^#Am~pGl9$k%I5gz(B7&|1 zf=;QaB_e_jA5${|b}&c?x(=&n@Rb2Cty=*EUE0IdGdck1yUASy&|%Z3NMuaXqQsfo znY%HH>wud-2E;_f&2_-dkw2+G#12=uxemDbIg}#YTnF5IV1#81aC2!4adQ~qG{H-V zn;+ck7!!6w0QRJ?6K)5}l8vd+cv`3N+#d` zk6u;q5_I`Vo}a`Al>~HOuVj}A&W?VrC8mT8Y#CMT7x_+c^p6~OSNB9isG@&L#=kWW zzV{z}u5lckI6QG8Weh>J1IDm^us)V1SMlrFyP#Si;|piagV`Ing?I&cP4oD zgMl0mzSf`bOpcCk1iv0!>FR8firR3cYX|tXI}V~zG~`S%K7+qA&WU@+vc%wP(Al^g zNfFR?GI~KcU6Ju<&G-ls(jD0db32Y8VmIe+pnv#u;*O)V)jarU;`X>^!v&iMA!2vD z3%N`!3Te3iXX9=V0*w%2cY=Ytg}QGb#O`3S>pGN#?*wxiCy1C6M9c{y=1D*|cq#lJ z%?Tpr1QBzBh&e&ToFHOO5HTl+m=i?I2_ok2!#LW@2_fc$5OYF^IU&S6NDwh6h?o;Z z%n2gqzk$gBCy1C6M9c{y<^&OQf`~am#GD{vP7pEg4k2jG2_ohM5%aI1m9*uA5c96k ztcy4y#GDXfJ~;>i9XUb7oFHOO5HTl+m=i?I2_ohM5p#lwIYGpnAYx7sF(-(a6GY4j zBIX1UbAX7ozMK$ZP6#n4gqRaT%-_fi0#?HbBIX1UbApIDLByOOVone-Cy1C6M9c{y z<^&OQf`~am#GD{vP7pCCh?pZpT*V0?=7bP)LWnsb#2gUfpjOQZBIX1UbApKZqY(VN zI6=gmAYx7sF(-(a6GY4jBIX1UbApKZmmqaNCy1C6M9c{y=7bP)LWnsb#GDXfjtFsZ zCMSrP6GY4jBIX1UbApIDLByOOVone-Cy1C6M9dF>$%ULCVone-ACnEZ6(@+86GY4j zA?Ab-b3Y{GGEN9FCxkf22_ohM5%bodZUrZZm=i?I2_ohM5p#lwIYGpnAYx7sF(-(a z-;oXwG2aRQ|D6*=%n2gq*B}8ma6*VVA;g>zVonG#555E@pXCG*bApIDLByOOVone- zCy1C6M9c{y<^&OQf{6JL(6Eh9fd991f`~am#GD{vei0mcl@mhD2_fc$5OYF^`J`+Z z$?oC=5p#lwIYGpnAYy(4BF?;%jU$NIeb#6R{aYMC#O@#X8aVObc-j49GWH~L9OnKh zc|2TD5V8B5aWBdcMC?A#PoWG##O@1p^VU2F5xak(6WxOlvHMp#VIG8t-52S^f{5Lh zjAu|CLB#Igc(X)M=Z5mTuc&SjA!7IM9<*cg;8TYCj}+v>-X9$%h}eDA_yyGvMC|^P zPeCHyv2M7oWY7usVEV}+yE7~2eE`3P_Y}J;>|$f1Qm0Fia9~W zTtdZ($m<5Ecs6h)4HTc(D5%&CQ1PosyC`Drf@wm8iroMe<4u-pi3ko$gcI`xC|m@Z;MfK+KEyu^aGXJj?eYe(VPP7za|N-WkXV z_%W(1_l^o;`2av31gFEj2q3!wK(2(dD(`$`1ppb<)OZmmF%AG-lR#$Q_Gc@d-&>n}q1~Rc!V=Y{cn+<>Guyo!6=8S15z%tZO;0iMP;z&vMbvOya@?#pj z=&7FUaiEZ8tMjHF&$p;E$BSx`Jh!!j6Mqc)mIfJ!zXlp&0ps6b)cs+8$jcV42SJ2C z0fP{YXM?XgZwpspvCS^TB+LuuwNrZLk~T=zSS;-~Ui1RDu!FXE1u1)+$Gc*3z)=KMf(HO@A(MOZ z(Im{Q<(6PU_YA@6g$e4s-?~eo82O`R{SK1s3lp;sF&C}nC={5Tj0WHBAgf=ZZzIuYr3^ZjIh(-5pJpRExW-A42xRlkjW@Q=fr35OuwW1MXVT`2j>3NJcMu zIwH?QVR6&WoRW?}D00N0#PT-c#Jx~+KZwiVaZeI%kHR;}cDPA)X9tiibeO2Dx()mX z2h3B^q1WG@hQ$&i?qg|byITQgGl%_22^DHbLtO7kuBYx}dD37`m_h#ygKb(uQ_@}1 z;B#uV%}*g!qteNs>wZ=e^A(npTdIZ!=7`bv!wQW|^f=OCpQVH$=yd4ykC8A|LZqXK z3}=m2xD#5U&K&kQ#a|QRKN#X?A$~t53$W*5wjl7*W-ONb^9YJiLn~eUbwBguW#ETrDogL$0sVM7f~F@h+Y+Ex&^JZUGzWAm0eazOQ$#jSdtiEQ zfqRAij|i1vC4pbXw5crh_K%>y(_f6Bo3T;%X0Y9LjMy6y`l>utu$(MpSr}oWruT8R z7#wF*arAl|Jj+-ujA*J#4L<%jm8Hdyk4r2cYXS)(?A1ff-pIq0eeA zizL12VJR3cz3FXvQzm0SF+x9}Vi3s3${3_7tvvz>8?co$m!bO5FZFHdSqoZ zk4VE4=-%>v_KWk=Sk};$*dSA+s8fmV4T(<322q*;ONmHVjY_IYi71k)O8qn^mJ-oj zrf-it;TIF9v(%_aOvcN0`~GI)$>}VsJI%*kwr49oKSl1cy-=Q)_&1>|m+i%Pj$lOI zsb;b$>GDT|RJl5xr9|ap^_;cavzm#F87!-s6rZ&e50Q$`T8hi1;>t06LPX8lyA5+xbS zdcsZOQObJJcqYJSr08!q6uprt`p;x3 z!GB@Xf59FjqmP|V5qdM-Zr`BP4h%)$DOCFz+*#mqHl9G#{H2n;6;5E`oecKwGeOH7 zjO7D%`z)me@{JC?{zOR21NMxdrDg+mBoEjNQJ6t*TX+uBpvG?hIYSofv5p{e*|HuJITO-1S)7!OWN6+Q9y<5Y1s z{`O20b#q|6xHV0@I)}A!oy9)&khHn6vA6;>{kq7V%L?>)VhsE+dx2Or7uHc-!Iton zKhW#fLFxR(;^83c;<^{Du9uu!lEk4P zyDPH*rB|B~TR|crNlLE_Nw0^l5n9Bkc`O&cTe)-|D|PL}CbUcnBqfTI^JqcQZ}V6W z*AVn|vAlF5LG+o=3PEb_e3s~X8*6Q@yyQp_o944VE<4huOLw-#i$CVGZouBTmbG*> zU^AF3FCFoS8MSPqHmQ3|=qSeD-=R551 zDkQBqPAqxY5*%@pU=O@smP@8PW5sb4bYrd-n$!ygVnx9MmYw+)de*{>MbzgZ^+2&b z6t8-S0K{wd0(i{2AlAW8n+a&$D+MaK46yZh0NclbzcNL=W@k)Md?4~)5EmD)v|fby zrJIB%;Xp;pc>!B@jA?!bdQ7FPB4qt`R7N3*F&lSv zG@IR`G}3GnQtHA0Yo;5q#6fP6zX3?&{GK>tBK|r8o>Hn~W zO1~G2ebq*Y4U|F4!B4U27p0E1N=Ic##}6SL7ehMyzo6NRwye7`>NxHrrI&6}dJiVb zIjOYE|2UQhc`hA0XUnjvg>=B0Y^f6*+lHQ=kvdK|Mb%;!Urcp*#@18``L|+Mb;g!+ ziz8=mDCzh)*2oE4qx0bDQm5Flm}RDu&HC%9rS)d_?H1xEkOAW&VpNXwYS%Uta z*pCvm81Cj$qL)Kl1c~88v8^??rQ$R!JVQ#GEo|;lFcT1I9JXvmV0iOv1cJkOD{vfx zm~T@v2UP*;TMMlE7#}DVQyv40txN{!-e;lA<7wVC==dA zXHLQF6tLu>XV_O3p1_!WZrBaQKQP39Da8M|ks#$*8WXe*`3GojNcD4*0 zwgiUz<eR9MIjTLjs@kwpHjOYNHG}0~<(bO(hL=_7> zv&)FCHwLJX_K+b31~ftuqnL&W&`D8DfgoeLIq0XD0zt+U7Tq>#CG_R2Y3!HEhX+(a z16xI_UVSmAp1$rbDysaVrM~tSD zf4H2Bc+^PFlJWuCcX_EihwW{lHr%Liwqds`h0lc)y5Ytz9heo~`%f@3TWEU(|?)Lr7)vQUXZL2h zsHtOF?j%hAcCyx6!_B0=j%7x@hf&Hi?0c_^f5SODcwL;YgU9>PnCpJSKJB_lUID8! zUPnVwGMfAUlIFK5FZBBDU9HqsETPT<&Tr`~;9S<2>MTO%s;_|aTl)$iKwgVCR z2RH_S?}TFxY*kJqhMXug(Z_4dUh$Xsa|QFIQVm~Y8FD_XRLhCL!d_uCt!4X56hFy) z#l&=lHJ41o{U4!{E3BQ$D_Q4Pm}>N(WC7;wMX6-hpWP@7bSH)2z4MK;z6KVBT!B#V$ z?<6K&2j{C`q4KIU4qnlr*LUj)J~S7lt67TkK9p@svUyh8vn) zyG6g(Stt91sb-|%ZFu~3Hq?l?69Qtu*Vs^4`1Z1~V$?Af6Ufyf8GLGn4g;_($0gH? zK+rnVvEKB+Uu>!wfFEP3*szzC^liGqY~pyy46HZ(jy!YpZZo^q%yi_Mo&{$9MAM0) zPn){qbF*2E>DX;HMZ#1wW`$`^Fk9_5bJm;5taF^HPh(6(>|>!?chplAyR5j$k%lg<-gz5U!Oq^<_mYI!m%{CQgm#L<+%rw!xZ^W4QS(3g+ z@T06*lkRq7(hFwKVzXB_SlZ}JV+=5ztVq=So-F$1_o0fC?iG*!n;i(QFkQ8#zYPCx z^quJ+U^?fT{?n#2Xr`Yso$!F2XzD(*ca6y%ai*izjI1+Vjv6yit0bHcn*m2FO+M00 z=)2pDHYV*d(`C>d@ES?qL(Fg1n5H96%s9kK%A`FgaegP$*$G60p61@&5n|2w`jGY6QFbIr`tW+W99cybfPXNOqR_BE#SR}4(g3NxYB^f)G% zF$+y6EA%+>Mw;1BPCnIaU17GbHJdNSjtL_3FdGr9$u%N78PT0gJ=^Tn z1p;G5IT=J7)tbXA%=B6_71Sm##PgCmGqx5gV}jXoi5W8ocKXSPH)DckRx$nG&y1PJ znkSiwtuQTlnc2L;>`-g^%FOsh=w-@CC?D2DqS>>?jQLgkc9{Lr_~zUytS~$OPj0Og zhks_-4X&fCxz0XW($MiE)|N5c2I?65gN<0$Fy#~0IgLRJe(5s%Cg8ZUdg|!OWA3RI zX)}!YhV|*jz0IOFx@8-C){S5A6nT9N9`&rEZI-mrNZYJv&r90!{|{|XALBOoys5pR zQJK+6hp(%Ovc5(yeM3WCUt_rud1oJKDJc8{jAHm4(p>|Lb}{{-b>Z;_bOQ`Fw*Fmg zA7CUVhkxyjdRVx8N}PnteFpWDQv2kO76G;X3Mm*N_Np0NpFxp+HZ;;z8Ae62Mpj_ z_%8QJir#&kRIpg-5uith#W8AgeIW)KF@3@}`|qWM!@n_5sp#QfIT)#w)`$xOjl|&h z)za8tWpla`3;#UB!-^jMd5@cXXE4uwoNl%1Y#bdXktFMd%wXu?}9Z(m- zzkBh8qKAJ{0W67Nv-@a-2TD0=wTozoOu?fBR?wB=*1x)8n{>EntXzOUt4MZd9S zridD1WEcFmRyw{+)xfKY4>lpC1D?s~_(0K<7KyP#j9v`3@7prOm=?4)kHa0=@hF0J zit!46$zy<`4_qzzIxBnCitdycfHqvwrz`s7Lh`?>=nEBn@LHma^+OGRFzI8-l%$y6 zQcRaNOZp=Dqa9Q9nd>B>JroL$6N>)IMtR=NE`QG{`o)9t+^+a_xQ>Oat|z+aJ)b%rp{)D1WRrK)py%#8Y_-p7w z(ZgSu-=gShQ-Gjm?Fz6*T{wP8TC}#RII8Gf&q;cF=yUKmt>`n)%kwiTAlDQHtDvGr8oBxo(SD?{r{H{FDX#KI6TlV=;^9wl zFDW|Q$OEH{Uf%FsKCfAFZg{5v5(u6Oca1VCz2S3qGoz$_*i^IN4!DtpW0>33_5IDH zU%gem>{IkCMSogWn|4Iezle~G7M6BW(Zj*a%ZlzuAb#=n9Y)vS2KDUos8ZS<`eF=1 z*e5Qv+Y~*Z-V=u@Av(q>dibJ|8H#SbA(p537b&`0jT5IGRToyM3$Xd=%a!nn4p_26 zS4PPn?U=YwX{36?_q#c-#6I+kz-VZ-;nPoAO(j-uZ1p+FqpqKj!G@P5O~*TmULPmp`kA61 zRdfJRW5>cM@ikE~*68gGpZXl=l4jx2ch^{OFD65L5A5C}Y7>pGEi;M_W=_h+LHNSg z$>8hgSS>KoumY~LHa79rIA}94^+FoFN)LWn2Kf%35*@}HxgAb8<@HK+{Y7;>e4cE# zqT?p(cnr|R#_7%{7#@+aGGrf4lIMNZfTO9{USlM-YOOB!%aShd zl3ZFhMGs%sH$cn>vE)0{<#0@PB54ic9+?=Y^I>tq4KuN!cuz<(%ak*l6unrr_dApq z+Z6py)t_7az%E6fsv5M#|AC|jwR{EPHCKv0RRZCQFuzsw@HM9w6g?bHcf)iR7U0&k zDlo_(x-zDT|4cNZ#gPa%&QmEB^3xo8uI{LbU=lzop$RT1|wiz^^Q$ zOW|PQBd|o@NMsx0#Pu>GzChch_^C%w(o0QVPmKbxH{*{>jsL_s939;)@qf6ALtu6}Mb2CxPX~&w3yswO2gxz1=Kufz delta 54049 zcmcG12Xs``*8e?sGRfqUnM`_v6jDh-CxjvpN+9%(bV5@^q$40@=p=*y@d6h#Qly9= z3IquvRYVX`iZn%vppY045D-+%{r~nk)8c#Y`_}u``p;VX?tRX#ri1RSK9ndFQ+6aEBA}6+)G)xXEJkde3FD9vU0!A%6*FL z67z3G9yMQL@}>vss9F=`%-@QBtaXyfZM&=6>twJU>aTT1$yJXP^{@Mcu?}jtw3+N{ z^=w)PHcO4HKZI3LXV>2?AL^v0r`zN^5$fLbp=^#?xxoUtTSs+cgEoGcuYyi}x0*QvEK5;s(CHq*%)D_8$nZC-uKjonbo2PKBh1;pJmOR@l2X%&dN7tjYmgn znE7myHxiB2IhlFpvPw+K^N_PvW#tE5SHoLR=@|cquFpU0JO2!IhP=!ZWHI~^H+7?Q zKQfPJ{y?48!F&9>owx2^d2Q9}t*gau^5H?=$jTc4$UJe-Vh=Q`j8t2i%37&qt*e9& z|EHXDx4Xj89I^`@{q_w#6OmGUWA>o1VA2cB5UX}IlJ zGAt{_C!V_aL}STf)i0|K8>zO+ies7TD_J#Tw+PA02dmr7X#dPupnjSa#zv_ZvU1oh zbzs{Tthu_q?L0Z6M6KH{g>6v>wQH0$8BsVQ%F4^IQb2vaa|Ja1wyu|%(IhtzM(MZZ zy1optUPgS++~Yf;{@5_Wcof+YZgDelGM%oO(r+L474J^9I?uuWs#7lPy)h?+|C6 z_Y-$gLitnFN*!ZZv|7DmJ=tJXhjy&auBinbYX>hPq1;UBh$oy@C#jb^Hj>NJ)xb{O z8~uEXo8kTG`JY^x#y$$y6Q;X_mih8je$bSm=%vUYQ{;1wy1r8~2KA{dn(XAH=JUG_)R`H`aG zhA)z49!M-Nf;mPD)byVjFmtfzk3wY`7*bzYji&Pq;G zL%YRcgf{6G$yI)id2Xv+Zhh_iF5b+OB(}l*M(Nonx<~bBsO%L;1#P!Qb}Y{gcoe!b!iUVE9^wO5bW z#hA~^lCaRc`&^Rt)gTY~X&phM;(7sWb!xugraBnKT+5mjb)I zFPaB-nih^88z@FTvzO#$c+5Rv&HW5ACAnQZ2xT45Fkuenrn2(7SRE#^a=G@aG`otH zp(ZXVtA^(ZR9AwvEDAxE{e>XgkbZvJ>!1S5}!lYrQM$nLTTXE6dngn4jj#^0#M=pe&nk8D-Dw=@Lt|XSHx; zHMD2dbY-=+XH|A(b+>1EyRx$FS-(Hwg*+_U^hQ~1Rt#@e3|*R{d2h^s8nzAdG@6j- zX5LVj-%hK0WBg`_K#zJ6hH@-YnDpKCF2gqI)e(9n>Z_w0R4*C7!LEk|H1k1OOQg{C z(Wx?$@}%6%ALh>Z!7$MiPt&BTYS%HrJ{|35wxW^MSI0DEbJeY5qFJ8$)tJ4?=3vn? zN{^}eV;jrL9rfhcvC91*d#*)oHLkxc*OA;p{e+jVOEiyH6!4hYk)45g2}2G;GTcq> z1~S3uhOyWsy6h#vfmj~5V&@_)ti@r$g@I;vF;kYhaAsfxrngsb!A*Y9Frb49BH0U& zO0EW~ODDwI;DG9Cj))L7!dFShgz!7rx9CYo~J)!bO zbk^LvCVgzQJ~mVzYeghSZ}Ld?10BRR6OmxROC@Q6$i}cQYcG6dz!&y8^AFE#L{8Pa z6DxEJc1FddSGJvz=(g5?GvEZotPxI@>K^+tcuOX ztcgh;O)J^OTmJY@)3g26%9A3hPxF!x zqz>xJ*;UyI^^@6^8$a_Ck(FkfK%fL9Vwl*0NNAe!vS`)fBr29R3uF*@(h2qYq{_DS z4t;NjeuhW9B-3Q&JI}+D+dO<+Lix%1VXS_&c+EI$ViM``5g%W6AAGDlJDz#jE{5j) z0&}GK1}Z=G1Kw?Xz{PlxN*5Vz+^k*Z_v?`HcF7FSCBbRGC3|8OdC?^ZB(3zrBw zHx8#2MCOr5l+7h$C7Br&WJZz9^Y@*_Mqiam`&JO?N+RF6MEpr4y@E&@iR^KSP+u+$ z6e2czYloAJ>XN}MA(cKv2Xqx%zY3ADE)h()Qt3ApM1CTXjxG^Q+*0Yb3L;;UNU~GJ zb~%J(aw^DtL^57ZnaiOhGQ5Jw3KIEgi?e3JNTfvtkvB->h)V<)7E)_NkXcDG3tVPm zN#rLyT=7mPk)bY;I1)KhL1ZY2WVl4)No0+ih%LWKJCdm)WV|sKC4gNv)8(c<@&De; z%S`-4;tzE3qlkai#ZMxBQy1Th_y=74YQ&GU^J`;rxqk%$?+5`eI7o&7*oX6aUe0wc z#e5(AI{KtKb5`ik6Ipp#R;(kT_EXQ_S7-^q{yw)wG*qz^@NL6k+DwQvU&C&YS*Rt^ zcFKMcW3N=4WnH_m!5Exs^z=~MKmE)Res0+PK*zZ~iMDS|4t>vSYKYzKzgYmGg$V46 zU{>DD=vH(>%};xbC99Wn3z3<7q=PNrcmtUSY5Lj=kV^Vs=B4ceZ|Aw0KQOpKspzJJ zFl`SxT_WyCDgl*9zVj7274ln?mON+D3y`InFrn5?WaYK{=k_Hi>wEYeL_VFHkZV{N z_|~N@H#MmRH#M>G|7I$IOjWS7+-`}sGp)sT3-ch~2!AF<0kvQQ714 z?$5sH_k5-Xa6#cpjJTEX zU3eEYk$X5RKX5*8uzceT^gqW9=eW!2^;yBS7XPj5rHAZQ#+}Q)^ENrFkPlf$yR}8f zgX^H$lQ_S^349Q4SW932*Zjj6eWjgMb#{x0!L$LS7BV=^^Tza@U#32o9b4US>7T9O z=g|1T)e6*GeCMwr4cmFDN?ta{-ueh_&ETWVK4iOKY&!d$geyi~mwd?D+mb4@p*@%P z#1!oJKSL<{`cs(sX*s;vny5e};p=q$RGG4@%xhVh$1+11TSmP;mh90M_ityI75u)A zI>t-X!BZ@zy{k~-uYOMnj2 z#!O5mgK6hQCC5FK!x*pLi3402Ze?!cUS`*EW!i;*R_R09+`uq8Ty0AaupK=p>jL$l zRNGx#nT_N<&{fsje??}`e`My~S0By`2=4Fzyp(_NuBqYkud{6R&-pLQ>(8k}7o-Qi z_w7GJ+0N7t7rYQ)`xnLl_3s5)@`1Bzn}u!EJ{^2s!1Rf+g5z?8D5e#t#6DiT{zda= z<^xQZG|du=i{oyH?v!t+opWNFAx9iOxP@mz%weG%4GIg->=yV*NGQNY2-zswnG?cqS_*?*P# zR$hesL{p3Ns>)?&)hl@g^1!p|=*7G1Pe~<74|#y&gopKF#kI`{Qokhp3L)|bx ztsQ8r$lZZT>aA3J=f~NqV)k}4Uohw_c1FK}E7ugrlwQJ-19T0dzY=scq7Ml=mFOZt zS10;CLDwYuZ8v(Upt;Stf=(ov$zIqX!a))xUKNaFq6Z0@=XV!$9ObtWG!LS&pyMgO zrl4bqj&+j{ag(Ve=me6{X&NEF@L&2!B)H={ZuAv5`m`H;)Qv6{G_Rp;g04dj)(SeE zXjRZJ5WP^)8AMM5jRTso6(z<9Mq8qX3c3@~FAAEPthBwLdlTJE(0z!mE9kyNCknbB z(Gh~~PqeR~2N7)$^ia^Y(x)^(<{MukMwy^T5`A6Jqlx}j(Bp_cF6fCwe=6unM1Lgc z*NNUB=*dKDf}TQjo?E_+(>5blo*)<#NQj@v^NpPD=a%2ujc(~ir@PT9Zgi9z9pFZL z33@#F`pZUhWWI4MCGHEFm-v<&eaVgf%8fqcMi;r!@43-$yU|PC=(&O(Wh2LvMS@rR ztAZXu`GW+_o2I*JrfSJ2#!foN>OxwEHqaLqSzXJvxsLe~Y| zl^lQTmVew${!>A7J0A&}*Ww1Zd`-~YW}cwAO`A<5x{!kjZj6`R6#BW*o!#h`Zu04Z z=5|utXnrEkH*#kIZn|EAw(&^+;`6MEH6884!oowU0f-A2&70F4FBgT|`qY|2wIw({os+H`S7?SXg-{9h9#qX_?;FsAFf9Q&F7C|LGu}Ko1mvtO{^94 z9HLc0=McRRG|m4@kidyN->4BW3B)=gMuB*rh@l{M5z!aKr$lrG@fi_WAig4^8Hn>l z)CX~ui0UA26A=gE9uc@eH~vM0KL~H^Im*1VJo1ep=ZeOz@RQ}zJax>PAa(7o#G*sm zLMF#8LOQbOrPVW7eBya*A|iRErG13*V-v9-sAOr5u9u9&1KYta8Z)o}?O+h|RK4Gi zRGYmWVVMFU$L?a(X?4WgPvuGriv|~-XW>uIz+^jNa=ZL1<t>|)Mv>ZdSsjBE z9bjQ~=H(45Z!-COv!YeE+Ih%1jn$v-ERmlz!Ztfl>m0zW>Z+16vfM}=^fXZ|C@qtJ zZ9rtvreDS|xmP-;o7^pDa?LbO5Bt?Bd;DGpE%$!22<=)UeCf3I!8y6KwmRWqscfmO z4*YG7>^n`p`P&tFdrha8qFaxCWAcjX&J6XhCv_}ePIk5SfyqUUf3M19b869`r&XBz zYqE&rSyv`ctfoHuqrUeK)Hm~jt{zs?|BMPRn1B>sgXH7lEh|6s%swpOAkt<`P{;oH ziQGI%P5JAp{O*Jz<++bRt{1O{>dDnc#Nj}dhy&GS96e6hPdOWqi4)K>{w)bIkC&{E zRbSPo$_cURZT+mQ#;*8;CCkUFe*815&g7C9El_6H|MmaA0O zPJ6L9`Mo0Ti5F`h)3->H>_?B>8JF>5=?uJ{IgU6fQe*ofZLoW$;*IbwkriI-CZd|j6v3RyHds+qvT3?@2lA5;W@yy4V;fUws z$csQ8W)aHMhiUf}w#(9Un5##&9j1L$iFKEgLNyN`mLq={qAl@ZZ_6>kT8f!fkv|L8 z+L>8n`R5>Qp&9+-%OK*1XeZ5Vv|J}hYh+=4JT3+5x^~UX;^{cGF{-560`*d4Z}q+ob&&%zP~8cVhy2 zPaJnn?A8K9*fV)xCCw7bGUbIwwVt7@w$cM@I1PsWm9%A{?5TXqyEr$DnVDsIPgf=7 z^wc(nL-`voZA}DwY}wJ>#oO4ucwJ>?W%53wwyO&J&T_h|i+Qwb@#;wSg@++e(u;@0 zvQ38YThGhs(y8R1pS87ruEiv>1@eUF#qTGwR!pw`SMmKMHb|C#c&c?tVH0HSsdg-d zJ(v6Zt{qKfsq(bnwTG$feRctQ=PFnRkU4Yvm?<(`j8zddq@m!?EYmtQU^SG_?CI8J#S0oRETk7pwUzkJQ*PBjGd5z?EhC;vOwPB4|jv5jCdD`#`|`B>lf(w7I9mNcBBz{Wn8+}zA<{1 zF}-+BWA>s)`0Tn^Znp4lomNzbdUumzppwlyV&07WdmdCgyD;(LqCb@usoON2I|HESZ*OfBBknmxtG!O7aTEY?z<{=N1f zi+yB^7>9VT;VT=&?o0H#{h)J=bwOw42Gt{!-z1GVTR!Ge)rju1hf7r#QZ=~L{0DRa zm3QC_P+tBIJdsw3Sb0G{Ky7nzWqZ8jHg4v!@>fLT+Htiex-JO>6N;5q*vGve0as0q@&!HgE*sroYH19)Zn{iLM1`5UlIn0F#0QCi;JZaPTF&%$v~p2yiM$ zH|V#6v=%*BQ;!~*9lI1y@4-Ho>w6^W`oLzslM44aocm@G0Op;9G#Z;&r6U08ar1 z)RiwF0+0x(3up#t4|owU6fg!b4X_ZP0@eby0g3@f0jB|10Cxb75^Z?F0iqHbBLol& zs0nBcXandD7zB6~Fc~lxuoUn%;5|SQ;1J*|z$L&fz427i&VYV^ms53{J^_RckO$BJ8vq{xJ_Q^Hd<(b^ zC<8nN7|=0&0TF;iKwUsHKzl$BzyQEYfH8n6fZ2dW02NRO*aY|xPz*R+-9y*Etge0b zGOORMQEgox^01GGDOHwdLkfysMcvD`^MHaSJw%$a$MlZ z`*+wO=ipJ=LH{4H&FPqw|7raHVDP^RCMyS9WpZi*>;aSlD(7l7MzLRQ58p=f0*(QQ z{>F}pcEBajH|*(B;2B$WJr}S7upY1-@Cjh>2fF?mU@BlfpaAd=pz97@Z}A~y0p^_* zAf-Zv4?ete7kJ$*ednX%FJ5E#)K|h=mFrk87JpQ(*8_cbN4Z`Z_~)JFdVk<&yUO+H zz&t*cPM7ODfP0=V*Utby z0e%4dI`%h#`0V27WfTCo{`cj258!vNl(w1Hf-#2h;=j9`F?4F4#q_0^S3> zANcFvQRTpiPs?=)U)2o+js|Xp?Rf_9eBf;0?SGW(vw&;-S+1`GUIu&^c*bAQ2ku;s zCi9h~Hzjo9BoK2MdNgo98QT|N*`Vt=z?UlN`WE2BW?er4>~F_(Z&H|3Y7Hb6X5{!@>;9=MW(1luOyDWTZ%0M`uDbss-TY8R&4^i&XUBclWG zKHyQnCBTb;J*vV0@O9u*z?E?W@&NcpY-j@gp@*ft0q~1U?F! z0elrWI}GDL@J(Hxg^U8=b-*`)4+B33z5zU9IShm&V&G_C+X@%}_FoADz(E@Hfwus! z1HK4+82E4C8^8xwK_4G3mI6luw_Oc=;IOx#AA#{d8pJGQoC014oQOI3Fz|ff8^API zOO@fM5C(vI0A~QJz}diefoB1GtAM&%z$<~b0FT}P1HhYsOMo|S#Bhm}qz0SNYk?y+qw@hz0v-iiYYRpTaI38t zEx>iLFq{Hj3w#&&Ca_Nw#y{r&RABEN&$){Yl6D_J z=L60>h|UMR{*Z3dCxY-kjLrvK4|q3l%n@`x;77oZfvbFm&R12ERsq)o_B#p#z`4Lv zfa`vN&IjBLct3FW5lpMtL%WxR0t(na5 z;kR>^Ji@zDF(vJS3hgt6I~DVr?<5~ z$w&{-O|`I@EXr#N$k*NPZQx86nX(`BZ+FUddSmGf6oodJMPaDfZb0Ve zl5#C2hlTM?SX61bo(_gnVZ5jz5{|}3t3LR*-TCs5T!8o);6DeyxjTQlOFtX@D!-KL zN$vp|VjaD~Ce4CCd|A0Z+ueXHERchB;4c7wNCo}?X8?!6KLP%|3j7kzk4D}N@K@YL zH$Z1~7SQmuEJExm`hW-eOiOH{=(V_0h^nojkfT77ATtCTsfVDQGV)z#AX(to{jFR( zl#gm1fkYX0S?^U4e%C3S1O9kyzAgYejTz3ENPwJeL4G1GdrK=++fR;alTLvD;O}z1 zn|r{9jyziECrTv{s4C%LRl&dzrvcjczQVL?v(U$qK>NyCIni05Q)Df2Hs}$cKa#bk zplvyz%MH4Iu|k2)idsY-1^oeJcHr2nSMd3#)8{GhmwMu0Sb=YK^6!E_&kN`03O;s` z53TbIW^Chw&2xka2XuFVULpnxAQk*z@X@NST9rF+0pfQ6zl}-PwoO43jY6U|glo79 z6OA7UF9yE{_?0U(QHZmNJ^;Uq755#a;Fuldi`-c>vQB|t3ER~s?xk(B*f7__P#Z)zJp-|`KNg_wyD> zcNgt@qLV-uch}0vP6yCm_QbV~d*2piv{47Ac*a7eR&TBKeCRF*y}F+^az4tq8}z#a zwM9gq2mNrMww36|px+pzog_LC2a#U}X}=I%5A@+|O<4fC2k6~{wPd0vf=(T(wIg~t z=(@wTkwotX-Qi_z5z*&C2fm_hCHgVwo+GuBL5wx{ z`vtUDJ z!^X#KGz9!7<5Hu7z&vLV8Q@O?|K9~c4zj_Y1b(`E7dF(P-plRJq5!7g;-rH8DPVUL zlg2s-ltQ3u1p(I#bQt{bssA~E8{h{{)wRFgptTvtzw9@#)2?9bWoK!k!T$jKZ58;N zo%{^&)2HEnvI2jJlb;R#R`BT)dRLQ`JNP4{SrEvd{+|u317E_iv4*>YSGYc}uEXG4 zz)y7N4{`BtfFCqN*CM8|FfR#*)jdc|n}MQ7BXImF7Sp!02?pxeP;bx+j&_acB+!4_ z^Rqzjnk({0fWALhYq|t7IiNqBrws&c+yeTxb|4?y-xDC$%%^z|=0We7uN_>%B3t|5 z{J(4gj%XE1vDDE{QY!c!xOli#fq%`(?*RVsg?u)&jRMVbaQ*LIV#6Ni;9d-VA?_do z-DehqnX)*X^;PnX`ApEc`bHH6;A0D44!rdeFl6Ru69Z)@NYT!55RAO8=jHwK^uls#FeCI zC|R)_6}+w8F2Fde2YO1Oro4%P&;xX7p_UBVYa;0QHM(|a8Vl00-(((M%aQXMa%jHv z+)Zk0v_+(L9(3kfZ7b1_K|fuqog_LC+h*Jf{6cg+(EZnGiVC_1=#STF$tv7W0qwnB z>jc`X5cJXwVz=CGKN3qeU~BJQ2>H3QWqtsE3~q~paolp&y4bWSUXY@4Qtc1krd=dQ zaiAxCsQpQfvOw40rEAS*q9h}bn7T`Ax*S4_K~LGO4Oz}wn9hSz1 z9PFKg1iOx}8~Zv&p)h`Hv|tB?xUp-zU z;NVWTb1&fEPICsn4#!fV-1V7IZrg>}#dF?grx|OZ&AN@x_%3O)wy_A`PIWNbC$LIY z(DI?y7TVTrteWqo2FSd|{BKfsuy)d{cUV%f@&S8=S(adR@ND3lOS7bI^ ziXVT-ZZWn*yS#%nLoFAF?PMk7N-pBAY8AP;YHoMcx5&*^Bn?k%r{Xt@Sb@{aF}s)A zAG3~R-L{8?vC-Pt49fhst?FXA477be!Q?hp&5+=(I?O-v>WDPZs zz3e-nYkRr!v%Rb?QmLP?u!zz1F&?H^=m=o7?7;Ted%oo@Btk7qwCqpVXZR>3b|0(4 zEM0Ni>Aj*335Hs(Yn?u2OITO!>ZdT(wb*YzdzD!z5bw>^MIbx0MF+rJQhe|LYh^(F z7>=+O%(T=Humc<6_q2|mv52}$4as|uG8F8!#V$sJv1Nu3V#@_taewv@Eq7KRDYm{R z1eR-Wf5xhKEH-!+YWra#Y_TDhOvnWzq=cH-Zm~HApLi;V_TV$je|gxZAS;zB*HEy` zR+avE02wX9AY&+4XRBHp1Ty+X@r)c>><02P*I*?phJqb7DaL|Av#AEJ^$2BscM;DB zdswV+FSfK*xu2|-S4g5FY6YFEMD zYL{w2QXMG#I)-qvjM${Oi(0MESy11GhRPRl%;vREotiZ@gj3s7p_9_P2@}KZmI}xc z54w#ZQdr88;cV z<-ky`fW}JPMHPNj4vGYR+Ck{8MdQ$q74}E@tMZmVDmNCD9*0ip?E~f)vOg(Nt2OgR z`UlzfvZ%_W)!JXjSXhU1awyd#Ii7~~fqm;pkC5V;b`n0S3nazfqAq#U5o&LQrjyl= zWgq(I6zXf)U!d$C%e6(>dnXTjWjt{+ufPDBFJ;2i*Ch6dY!x0y#BRe>#Xgn2Nn0)$ zCMDJ)b4z4@3i4z-;dYd>r1gRwC0!!dbJXuZT%EAh&T_@t_E0h2a%5!3#$b%$!&iI3 zd&kZug?F4mNQv9guh~f1j~d{`w!$gDAqU9{&pMrsl#@jDqIQ3xA^)n(CmgEXHx;Bu z$-ZZUv4ccWlM3vHUJ&-A4`C){^zg|N8!K12gam3_io0c(viE%{R-+O8y0-r~t72*^ z`~QNF6z#|3sMfYJpK!?8pd<*jlYNN`Gby89mRNf^@F$)e5la&z>n;0=>8MNWBjmF_ zGM_1Fs3qQ}@#-l$Y;L9qa5hch__4xG*b0mOakUeHr;!NzXC2MO-w1@Bw z24XBt=q!)fNA)aQ>=V=(dy_@j`)}Nz89ZL8m%V$$ei;RUcUbfi?CDTU;o)5tMK8O_ zBi+xj51D-iz_?24+d`N)!VxyXK~NQT_Oi-khfgpAVxhR7*(afl*!C3qAr>JFV=9S2 zo6~QvBa}|mJ5I6i9Jn?VJfA6Ixgb<%E{_eMPI?K!a3`y5u{mBePkb-D(Ci-Dhq}Ub zM;u#hu{@5O+LV)Q6c(=>U&te2=#=v&%jzo;U zep<{?nUxVU&%CU(-FSdEbK#v8H<_^97#P^u6c!nqGbmpHtJ4>$SPM zklUgC{4HN{!_G4=W(&9t*R4^QU}_;BDP$k^63pmXA6edpbw#3{Lr+p{Xkpeb?Ls~qz0LhCyd75S;iqOd<8*ZeP(^2v3>~>gTGp)u&7T38mn#$V{ zZFeZlQ64uJD0$J}0844;IUdqMkoNX`39~%4r)xVa?A9+{f03=G-CE|V%dS8qB z4tuI9#ZA6r6P;VVb0|ADlo~dap<3lqX40;I&zAG9;N{*Gyj)#j$raue@O^!__Uje4 zMeGH~*!ztIQ?hBS^$ir*WErjP{DIXK0MRPTzvsCJ7*vyp+GBpe(_pEe~~z9(y8l|Dy*t7VZe zA1aljIzh7mOmBucPg4)1JWV&q&6nD@H(9J{Ds)&k&t_WrP3$RCaPDE<;%P3&&Mk5q zXEr>-liASh%k>AKlu-r53pW>`$J39$UIk`_-=b}VW_U7b8VXj~qNgBE77;=`n!I9q z_TgI6Da1;@=oax1=n!S38Z;DavBkV(mzd&^I7kkoL#e13t1*_oTv6JMK0v={zUsw= zT;%+$s!7`QTP!YiTtC6CPhAkd=<#HxVK_BEjq#Xe{j`LiSW3-AiqPm!C3K9T3^9+O zOp$z|FxI6mZzy;$Gjf48>n9fV0mJg_m^bX>QiWL>m#%Z9h+}@x zzny3Q>!Vw>w$8zM#C>pz)7?J?CyH)tCVP`$sN_#4Df$i|paq5GSEYE)9k(%i?H^;d z@P8bx-bBX`I{8o9;GAF_6ID82q0FT@|e@uA!D5zFjJaa=7({GgMQT#1ANLJV#d!s1cHIrC%N>E3S;)6MfHSfbScG#jx?KUjM@RLm=W~2(C zQ&e;M7V>BkE1z=tS9Agf7bfcq#uNd&T%XGEa! z_3Uchg_iU=1$G}hNEXBb+ls)X*zfF8_3TnYB9;Z(gb22JarD(3{`$-O*+?NY#4gJU z6R~X-ftXpU2xLSQpKHvlNk6-f1TS)0ZfVv{_6_(TXdBNh+9X40_< zPWX`mIA$Jfw_%_4QHV09jbpVPH5*UOaI7V<=sd}H#9#Qft$?ZfUZ;V&|@!aUnE3 zGII^PZg;1y52guGkY)Dv?VZTaN6VTLO9VlkznU+ZnBhk=Zr(7VzrktdC8wDg&OXL( zBW5%s1sj?vmA1&QL(bdKy9YWd{rorLL3veZVW}i}k)3KI$|whSe`^Q3DUltiu}6kZ#S})@Oj1H8axu_su}i)NDf+R(YUo3v zJ_a^+RAmnJtASmJMO`IQd-w+nvb{hidYBj5$NxfM0VWEZCVDt}8!!8M}8KV zWLLyijsH^kSbxzz86iksIi$oZ$4~Mi!_||?ZD(_Tn_V5v%zv!#meX%%yWbIseUZmH zx1nW%MoP6$DgA;U)zs|4LXmD%=*J4{!n7#+3w0c2=T-Yc3wzb3L{dez4Matz@|sMz zLE+RepUmbqq+)?!%;q#!qk4C()?e5%a^>2j%ynzbA>B~3W4{yTY-15bXsrrCgl1F- zBEoJbJ2ubmJJs$xh4E-M-=ZS{?Nm=`eCR#hEv#HuUrOey*4fZq^x)1eA3QPeliDT@)KjYMgSc>0i zNLeKV{Y!vesfNW+GMvWT?o~7BHfS@^wY=Jx0*wyKS(av?rNG&EnuPr>{M3^qX_c95 zVa>GrS6G~lG=ieNGK^zLwHn#XFj9b$rJYC+BNP+S_vEyO$ZLO!5W^6R*iD^b64V8wDgnO|O|unCEzsN_m8uG?~Kaqe?T;Nv4UWu}*7~+^zj%a~bb}>Dz8@ ziZI9D0bqAy3`5@W`+pb}LSel7*Hx)8cxh6Ds0a+=>z? zP=JZbZw~7~76M?QmT8G;qSL|>dpsuOn3mM@gHn=Ypnr4CWQm+bIz%U#mYY5X7G9Uz zy+%XWw7fwT?sYj&bRq-rx|G_>H~a`0uu&q~wA6%u*wSucsoesvx}_p+$Vh_L>meLUe_Ye$}DQD z6C9XU`-YlxSeuX8O}3~ybnO$cb)!DN25FTSE^lQ_y_T&^XM$o4&rjVE~$pR9v@UyAh zY2mg-j2UjB#9vrQg_x-{;3bSOSU5!uA6i*~Su@eKOa-PoNQhDv*h6STffhKzUQaPZ zgf=Ce^@(^|O`A;tU=%`JWSTN9uT|1cA7u6F zo4Q(PY%9xAYDuxeAXBbm49k+C4^0p~4X=Ui9fhW}>%M4tR7q=ih_$nsh8fm?iCrCr zrYA3lC!hH|`M~w$RpZHrpeG*^!6wt&#`dV#kX%%nsnE*l5wLA~CxAKytk5v*y2f>xBH zxL2;Ev;^&=^uyDve2*N9;(-?ORlY%vRXGd`eo7@g{gwL24^U3STA;EKc7l`)$OkL* zIbMizDHNkERJjL6n6enpaAg@75y~DsD=TzuUPXC`XQVO>&nV>u7>!ow>xCGl2A)-w zH<2H!WI{ep83H<9Spt~^<#jw0mG|*XQi>5)HDw}Xk|hIGi|I#0SJafbZ4mj##oT+S z9>?*XXy@_1h}zF$q)GpN_#q^$s9t)pr|A<;(>V7u(SK{<$w#b#Zv0FS4C9gG z{VF<+Xm{^Qmj0MCl>5|7$}1Rh+TS$)@9C zBa3X>FE(hfJ1;hfK^Gg*z>bRzq8%3-HtQZzt$0s~3RL{7(8Zb6LNBD1fB=$;w%9K_ zXcBi`cF=O{yt>>EF}k`81okw2#-E+=G}v!J`hu=97QKg^V4hXyW6Ob9rHk~y4=+C9 zEs`I-Pp~9P;5a8PCQq;zhVXQks5;Q2-yngchRBcR7a}K_k-8A=uwx4BQbX-h(fnfM zYi6W=#Sb5zrW3yK?`ir9IaM<$s`r?=Xs%EgLoI_JD?I58>OEG&5fs1Ic#pN9PKd)u z%u&1A6QLzV^E-_#ERfa*?yjmgx-e)^lFy_*L$y}5 z7RE7~&&+1KfiIi}=+84ni1S%ZhXHX%ah!|H%b6&1^8>f;ivx zwl`oX)idSsL21R?7|?N^RM5v}+pE)spHgRY7l0kl``}}HYmbQkGKr*H5R0Pp70G=+)r$rLGF=Ed`ifborpN8dCg(Avyw6Z}OF%1$Vus{7Jc zG-j8C_o=s>>iOI_>JLP;j#I#OIs%n9R!)g{8p;q zCQXSY0-&vJ+%C%XGdqrq{I7_(i7clHKYIu19nY_q{8|u8+@a78UwQ`*4{3=Rf3#yi zh*rhlU(%(&>+>%W;j6LEOaIBfhT4$wNQ$@uo~gXDHo#8~X*wT83N=c#(K0@tfi_Bw zN!4esllJhjLeD6zAT^)MJfCQ*WN4u6@{`N)s&A*iOfM3y`^(}RFfV)qMvFsePz%jF zK#mYE^t|vw?<$spAeykf@ItQ@5>gPoGw{L-JsNG+p!@iD^klry(_RaZ|A?Sd6IQcR z1_*}PSF^@Qm;y#?vjb)NaO_*JIAb7eg|ujTTj)Kwrf zmj%;)l}p;-Ab7f<*@EOC^KFvtV$6f;(OhkPkR0!wfpW79PoG@vbdX%P;V_bD;Z0v+ z$OZjl8riL;+pR{wG*n`(qoyDPF=KWo^_u3V3$@0MQv>Q)k6K0D$R zaU0l^Bcv#m(p5a4&DS;t%kg+Ia57k~={J&0Ry9*=;jPxpi1C^dA}5Bwg=}hm=jVO) zkV@j6&HstE{1U6D4G)#aqrEPN%28Q!pk*>1wLXM3%P}O3pDRSuc%%2U1`;qHGtg3M zz5qJO__H+=O=fwM7`OdTlCb4Hty!3y$SxGW941e2-dA*^7PG&BT^S*_5ifJxkKkTo zt$$KW;&tkf2>E>24Hz{U1IU3N{Uf_3&meN(w^i$0S$;KY57?|yU@ltD+i=+4!od?L zx3*`eMcQ|js%0Imos5#JRUVy&ya;BX|I5Z|LZnH?SZ2M2 zl>a5oH`+b~=rhPy5PztD3#}nCs~k_pLT~(pS?T}v@uwkR+{gS|LrwDUq>Y0}vlexb zxu1EH1nr)v6?{q0cz_umkURQ^FGG!2nRTwy2)?Xz82Kt%u4c1Ek)Qgq^=F9qO&mN# zGN#K4Uy1x1qZW{|Qp)6C07+v5*}E&;Sp6?Y^Hcz(0{yF3MXI6fJ)4Rk`I1p%BiXPF zHm%MVfOO*|N`k>Gf+(_JG}G&O{C|2ddS9CzBUgza4P%CE_zmj5p4E|qdnf&`xpG(?HS7bN&>U;q;I1cC=sm-;Z`E?Ej~eUHkv}XqS%tJ&tzpkCRB;G_VV<{_U{D@BBfG@Kha7IXdglUj{TWp z7W8nUEu1zttbx9xSgrJLg;-`Lf)T*Ss$`+>9+f}~S@p2&i$fyFLQ+O4fb#MHfwmS1 zS~8FkCD_mgS>AtO@Q4GY5@tDwdvj$QVw99YkYUQ51gu=jlvFyXE66t}jqt3bTtU8v zVulx^vK8S~QofF-WBfzpn3czvo-9fsp1w*Vbgjxk$onau+K>oW%rG6Hzl$|BTSx>6U)4U}_GZm8UZXd@*X z&&J9SG8G@iYcFCgDXIf44Q70YV)vK4VnR*v8~MVSwCQt8uM`;TObCoC1ny2i8%zR}Bauz79QKJi$?s(=X!w__?5`yO<#r6wC^OUQo zy2VNaMDvwcI9sCR;<;4$2%#)fPQ!755)X54Dj%Z`RAmo>Sgss}{0gNvf?lbFKvGi% zB4?FS8BMTSX#%aclrV(#w$d5a3YBemzN1Ws{2FBgWY#Lb+EDs+iU-uzD_?+qSNRwf zyFrPE+D2s^Ty9cinBJ^h1NS}UH8|d)q`>t1iZ?>vszl(qP5B!}KTv#8jP1&BxcN|- zjORy6YgpK!^u}|iVuH*rzoSO%6RCk&M!|v-4!)!`K^-$?G8$A?Iv{3)E^CEwdrmH=khNh0+izeNdRR{HZVzT;AY9os&B z#}&c?h-LM^PO*nG^8pVmWBx{}#R!qA<$s;LRuLP}EdP-tS(OC@L$8Z}CmWS7mPJ%X zvbTS0s_%FfoP<=i{{#|E5N1aBmr~OvvG5w;&GL^%S(RiKS`VolfBHsINoAppkXq)S zNLFev@9L<@RsOhWl$4qx^_Kr8vQkT=3jG(wW7nb77RfdKzf+`jL~5P?ZtbOXxhYOB zo6_ZM_Lk<^K(2+qc~5U3*ABe`qwFKOD%}fv8?yP|&0#5;uFYy7H?}QB`I*0mUpH9y zHke;U9Qeh4gMQBf9NB*M?6^Es0UK@fjC{()q`E>J=fz9VkAFtSMjO*8!S6(FrSpu; zr7~sU3+b=WW^9bnw~2wyfEiK{?&1+wLUoKb*3;-iTkDNaw9XCXpjO;kPh(ACZIvy4 zoe*mA0ymFOvcqGb)yv5HwxQqyTWl|^6s)h)eC!9>mWFbSE$ep?Zni*DEWh0wYBW;g z@xQu}5?WBvGDHOP9}B@KXYt~2UW(^h8OEwY%Mnn9v92?qV5;jDZvLsb?X|2%a^+#) z+KoDc$U)n)wnih3KM_Q=eQ0tPXf*%*n+PDs8NfUWfNKOAYm)}9eME%>8e5Wo)Fz61 zqLCau>^>FcR}Ws9KR*zbLeT>BV}&NvqA1F*9&uC@r=?##(j1m}&EEImHH+)1*zc$y zzd6$V;i*GoIoh_F2J<=LY2JO|VX!miNX*xwPn`3pC0a4Z-iqfuc+iFd{Fwmv^{udN zC@8eWj-qaK!I81bmb}|;`v0}{CGb%c%l|VyJDZE$?IfFPA>`O3>@Jvu5bgj8XSf4$ z1P}<91VnD};8=(Pf`9~tMhyt4h(6`=h{_WLMFABFiVv^%Ku`lJf}*0L{Hv;a7TDi^ zJ|CELb#+yBb#+fqe|vhDNDbN{s6vxTvo-O3d)9!R_(}ZHp0ya?RaJG7;__C&APuLH zJ20p)9KBCtExxujLIV2hG#IF#wK?!@5_h!(jKwM+#w|d4SmRPH2tdsg>sC?Fe zWiZDN;%Wz$89a$DpCz>vos$lZ}&TS}i+mA?B1rRe|rEQU?N zCQ~Mi)%3ZxD6s+FhlAfL#Szdvc**ao7T8Q2E3tii`R8R$g}iBA>Je48sOx=5%Nd3) z9WLwg^mmeTy%MR{w1k?}hel9E4sPTg)<@ zn=q<#rTWLe5hcYeA%ixJ<=O(7Hx2-~w)UX`K-^u-($Z?6r|E?@T5rK6+MMU$xufSu zS<&B!SBhD70e;g8v^?3Zy2{>=W0?;9?gec3Cekn*O+2DO2}^gjhOp9;q^vP#MY|G~ z9lHp_J;@fZWStb#fmI(Os!Le!;PQ0Hy=>TjJ|mqtO*vh!*#?8DY}U(0GwheR!kCqb zBS4*DKYU6u`k|xarPsU*Bdz4GGgKJB8a{2vtuwk}E)L0o&rT7)R!FS{<3V%CkskN_ z6xV#@BIv8$FjuPmk6NIas{S~|_EbpNkCw0s&G)e48m+jbpo=I-x(DWbyWr1egVVqx z&lnt^#6@38?v)`=d0}>zO`GkX5yQH$MvZ9n+iJLx9h|g4^WO_B`eMVe>vK`vg(buh z$716aIX-R+W-k)2bz$Db|9mcm$En!g4&}VMxYUJZ#OYtkJZlG{celvu3X{IY7`)>Q z$J~=LzZH{ry=Fc{m2ARsMw^f-^42(`_ajg<8ffD%2F4pSi-nQT=le_wcu3wfFT>~X zU50v0K)0C=?$qx#+)u;AG8P{k@Y=l^rFaa-bDxOsyRue6Jsr}G4K?+E5w`;tN;jOB z=-FHx=yyWOx76U&z`F~X@-0=5Dpdti6>0LFSLNtfFA(AFgRRraDzhT!-3RsV3!gcs z{TD<=884}?ExpfV0%NJ6o@SeZflEph#2;Nt(FDRRi;d*po#>zSLCsh4sra!QON;OK zsbpKE*x~yODO0pbF`}yxjkTc{|hmw z2TN~)uPpjEjNVx!-h(5*J#tbsw9#GIkgqdGqod-99xNyL1%}S+tQ24C@LQ1V`I2Eo zGiXes8os_Jac@}SioMIxg?m|yJrb)^+GO@LcsN_hGOrUHsPC7xqxt6F*q-}YqMTvi zn2h7)myBNcIvUmg4hEh+Dl51`-r#6kXoLhbIEkQz@)nej(l~Wf`!lcCM6p%U(JnOZ{63{|JRsz}&?Wq){&fwZOFZZ)W=q z*^05Q^DVY*U_;Xn#BDuUdR!f3!_S|1aG}hoeipuT6svl&X3h;;pN1?RIgg7i$vj#fCYpJKog=o)&D5y81v8@b9KjwC&kG=6hznh zz>rH-o@a5F`rds?H1EgUqI+K!AN?x!v@+dM^Mn}Jm&z>f3-eVfGeDN1CuGS6v9~WQ z?l0dUzUj-d*u0G*rXSo7ZbV@j(fzz2r$~1!eN5ce4}Rf_s!*i&5BZM12q@Ak_R)ZZ zEg_!i$1>X-e@q7LtMaBTYi`AMu})((e$C>mdHiNBZ?U)rYND5;L$h>8-g=SOpT>{D z{aIQ=GC$j@a)sv4fEI%v>T%q)PCVS7WDtqk0bv@*=v76|hU|M8`5#7&R25>8fMrqhf9u%Wh5@uZCi& zIc*EMIy}lHL#crD{cXjiZ^2qoSH?1;im`$h9J3w~e}NPj7cvI0#<9eFDa8EhBcf~o zORxACnct1Y4!wSjbl4Zlt$NMqLYUUjeDK{|Iq;SH-celJ6j#BADB%P5E#M8pZVOvL z2o5~? zBlxSo6ODhP$g5x|fxr4e1Ixr0fe-WbkN8+*M(|fZ7Kh*TY3?~~AW;{ECAd3<5{Z~d zcGIaH!Q(M!A(if~#yC43iwW2Zit_Z2jd&0jzX<;3`U$=cWgmiGpnpo@G&e3N>i>x$ z2WSTJ=_ie;Scbr8{TqHZWY4$Co@bHkJ84hCgsI}q!7L?+?0UVi1-KL6gjSR*ce<`S z6QMnMSv#l+zl;|0ouHFxNyw#}fVpCkk6MI^MCi`JSR}DMGS9|v;SBz^@zGHCNL~-> zUGN(KPy+ghfxnKMxTN^HO0GK}#PT0PNsZr=k5Zb0dQiCpRl0R!EaWF4?5r!;IeDsB zJB0cBBkT-ke;8X(=tI}r6>!39D6<``A8LF(I*mUHl0hbN!FD9$GssUSq#8~|=C_&v z%=||OCmOJ$=NpL*e01Y612}euTa8bvEfe zabzg-(BVNkK-{Xh_+=>b>p_uP4#p#ztpl2kaU1DDG#k!%Qld|$Qz{-6xjl$x>wsoc zXlhA_X2UO%838*eBs5!xttkf~uVgyu9xrbAQ4Ve9nrD$#4utEu3jV z(6$cHHhzzsgwVDQ&^GcXXNlA03fk5I+P;9L2-?;G+8z*LDFbL*Rt}+Un3y!eEQGe< zm_se;^V(j+n1Z$=+qfn~g1g=QYCjmx`s&v17)LY^6V&dQmw+SEJyjImMo8p>+n7Ao zDB4erWuuN69f&#!CPunX8llPdl1;~)>{-1b!G$GbUN3-7umyX$b3kHr2 z)E}>4Kg-YDV}9TfAj*wP$T2^r;NO}XKXZ?{&@dhn@I{LFVGLoejmNS+u=D4RvG8bU zFRI5vAIDE&9Ss`3i;UpAjc}(OqYj6Gf5+n%&SHm)7ee5=v5_5d((P_%0wz+i4Y(T@ z(;e~gE8v#y#toy6MEAQ;3!fXmb$6u1Bs9>pd^djU?r4;T!f?ZAyI4ruBk{*0Xs@Uv z)i?=%XPy$B#<8T}^DzE6BaZ9@ULNK@RfvmU5UnnKyh7%dR@U3=QXGa{}-s! zIAOhV^``Q{wJdO2ae zoUmR_STC=Gj?;=0)XNF#*a*?a>9B!VZEHNUQSpqC#;tf z*2@X&<%IQe!g@Jjy_~RKPFODotXJ#J3F_qp^>TuGIYGUAM^+H<6;4<$C#;tf*2@X& z<%IQe!g@Jjy_~RKPFOD|td|qk%L(h{g!OX5dO2ae9I@UCPEao=sFxGe%L(e`0QCm7 z37oKAPFOD|te4LN=TG8<^>V^`Ibpq=uwG7BFDI;*6V}TK>*YtG)J#rTFDI;*6V}TK z>g5FWa)Np}LA@NI-r#+luwG7BFDI;*6V}WB25~`7ST856mlM{@3G3yA_3}4>XE7(N zmlM{@3G3yA^>V^`IYGUgpkCe(f^j7$sFxGe8{~xba>9CfHi%op3G3yA^>V^`Ibpq= zuwG7BFDI;*6V}TK>*a*?a>9B!VZEHNUVZ@ra1$q}mlM>>3F_qp_442*Q27ietd|qk z%L(h{g!OX5dO2aeoUmR_ST856mlM{@yMu(Cyd3`D#R==>Z@~=VCH_eUV7>fX`2Q77 zP%kH_m*f2YHBL}3AC&`>+c!92y_~RKPFOD|te0QMdViV7#u3)*I%nJh16n*`y{_;1 zdPul&3hnwK1xFG&HFN!#G9EG%*6X@pOvf^W^|~(dZ?Ozwy{=32JlEWa^}2qhgznx9 z4`kOblwfYedR><(VPU#(ux$(uo^=B$_ z;pmSB6V~hc%lH|^5Z3GZn@>YARFi*bK-Jv8qRea3Do-aq2vV@`QVL4KVlKdZ+d{F# z>zJ<#FyC!J;)MBf!hAVlzFcCyNyzI0%y%AeC3g|qCMnF<1(@$ENc&ctnxrsa7ht~l zkmXtuV!kfGe1Ak1!hBtT`SwXsQw0}bzH+L7k0}>mzWAKtp8sJT0P`Ih0mVFs`MLn} z#Zk-^q}A(1Qk-=}nV8}lIM>jKOdQ;&NP^K}8{ zi>Vq9VZJWFd@;GvgP5-iFkeh<^1Lka?_h0$=mb}xZj>a$YUnJORx_u2EHFeF57xpB zF4v=l*7Te;bnXQk_~AUD^UrA}T;3LE!Ui(2G~+SIj-LvD`&b5V=7C_qsQ}AVQ-Sly z?2RWOIhP<2fL*{eQ_<7hIfL=tAV;MeyWJ;Hrq6?7lHHv|>=YIsMAD&jou)`51{|28A6|?bKAm7vsEXGV3k#qI2G)R;7>nR<-@{n56y2N)_RsGwn=cg<;suxmRLh@@ znp1QqvKZAL%=NdH1kZjVyfrrvKthI|Owy}Q%?)_bK8WcOD4zifq4NUCUI5*7yYhABAR zG<{x?WqR%(kj3T=+yOVE`qYB#Gr~5F<;FI_$gfVqBD8$GS9F;MtC#EBiiy);g{!QC zSUHWQ#f|JBl{Az$EqkljJB_vVeu{B*rw5CF+e+r?ibb!fghx*9aN(KGii6!-0^=md zdx{Ar1a#>&>yU|RIjM!LWuA#MVufu$1(U-06&;^TA=9P% zT&muq!CZ=%E(7;d`pSa%Z0a^$Rlw{F=G7L8AEvXkAs%QBy-%e58MV*j9%&f3u_x&9 ze}yYweIipa0k9qfG!BJ@1z@1wCDPtZmAW@nY6q1PV`i|lylLQEy=x>rs{mOH#GtNj zkx>`HMR>5Jub@2;+C;{lhPT391!BhxmY{zn4no;(RJLtc*>*RS{TD>MUKnYju%!jk z>F~g(ORpK4j>ZfBOqQPhVsqeZ5@~;>x#T(?;(AYVO`6H_q(WbqLjQGzEz_X;=uWBd zP`(uPV@MP}qe0;Tb@9hKa7aSL}{+fs}3ogoC&qdfLRZ)w7>*(Mt`*^nhg-lF!amY z5%vza!3nMyC0MU{D^%+3hzwb(G_RLp`%MXNH3?STBAhr1!3QM}Tf@bn@T}y zHxoqUTCZir#)wRmhj;-4JI>5z870loj?EFYOo7oB31fu*R0J(|z)%vPZ%v+x$id|g z@K2xy*SemKP|;Z&_(pWQi=_=c2xFZ7Vgx;bjq1I@)|b#@Z${{~%~ZvFNyxG|!bC~m z2PCy#RY$K0z_VZaYH>tkRco+u&s{7%mTY{`vavD{DSiN*-ALzZsgqR?(R?x3bEe9s zOHvv>32E3D(lGT#4P|pI4Kr@kuxJi|{G{RD8#FwMJ-Dr`!;?+KzBz#DQUkY@A`z(s ztG}JYGTM>VMV8EpKtF7u4iR$VTHRB6x|8MUves1?cx4g#2A?Ron$Niqi5{YD9+WDNnop)K3dusS#adOm@wCJx8>?howdTh3)>E z-Cmz1#@@rSyU=3WZ}uF;=O;h?W-pZKV*gq++Lco8Z- z-z&8p2|3~WCg6mJ#N2xU2qaZs*jq~*Uk-vvFWw6Q6NA0!l$};Vap3pGA>m^?jV3;? z`2Jp&okm^k(;M{O4HE)=uVk8tUEB69+ySp zm19OI|L8Tt;pGENJ$xT*5UCdD?*mAS1U+$G(El<->Rgr@+=l)61$(UYK8_>-wB~NR z{Q%6w@EQ>Ez~dr@bLs^$(bN!8v1gU-M&Fdfq0`!uQ?Tx zGRvMBw8X5zD4At1#KH`Q(85y~29Qxwzy=92qK1c0ce1hZ!fmpLTByfm5T?#Ch0*2U|Ndbcb<^LveUM^RkRa;=+8G;H_vR+za6TTO-j9 z?-Nr+#R8ZB)}@LE7Ow+na+~DXktppO9`e*isI$Mh7`TvibdE)>PfE@Y62!)Z zY*JPhmR@H@;0(4+f-L=LsPvOCU_w7>x`^fKN5t?&tkn50>{u&hfp%`Oa}i9g9un^^ zVqKlx(blCh3&7yyDpm-k`c|{jA)%8T(PCq^*k;FW%1z(`c9QB$M70aB|{vVHHP9roDXK1EA(p zR5MJH#&9w80ju2b8_Ko9Cu5mpTILeZV?iAQxX`4bsgFzOi&;+A%V=0LGY)Z{C!Eq< zyF%`&0SAD)dM}2Ts59bDxCP5myGIsS=#T}h>AqfLfVnbmJ!S`M*6pWSdCa~g&^Gw` z&S(}lp|>;~f65{SGrB4H`Z4^Bh_{Rv_c8JZde}l3TfB{Tc*`4Bm*{3OPOHU7PPcp%3v`f??IN( ziQ2N>)>swtZ^ogm-sZc>kaO3Cw0|F4w zn$f>o9C{FD;+HVCj@hUme1(WRT*pF=c?4QT*5Q~fO`20G%{gZCOUcDDV2;^3;KPTe zfD|#uY`w8@F{J$uVm~=%8;RmDq+8KITxW|pEACvzB7&=M06A_|2;Ug7sP8m3+F@zi zd}Uij$hO9iD{VU*=BmRXS4rCr+gi!EE0w`~*w$6XU9sPZVJCiB#!|Cpp%HJ}C;|s6 zZP#D7W{@^fxSZuV3otUaNzUp>F=IJPh^02$W(!zt_8%dZv$U2AvF6X))N^x+=9_{3 zep;5D94Y+`Q!BdQxKC&#{~7W9a+aR;HQKXLauz902n5A>r{v6g2=*$xilg=>TO1>nRO7NA7q(crEfWI~rOU`pmKv|x#FUj_BWX;wWk`)>VB@BhEHOwL8eP{wbHh}ddgYm@`Tjxg)Ehd!1Fklt zFQ&*F4C4|kJ36?K2j|3k}iD&Y4A~RFuSXC5)e=c`GC9>BEWz|UIK#j(zc+V zyaWX4CDOO(Z>sGVW@kg;K*GumWRVL)xzsW*R7yI0 zo>5>qoc0gRGfFInQ-CeF!QsVNlaA8i)BcviUx%2$ORpI((yN(m2$fPyIDku^0|DdG zsD3&qeGUZa^YuX)nIXbz<#QlNpFapb7xz`Oyx`0KNM&2(O>-3ke6SYdzQ5tX={-el z5ynNC;lObL+cfWhDmG3PYc(B~1B@u#(gHyNUptSuCUf3Y41sI-sI9PM!fPwZbd9lu z!prugYno`ihGn~=F|J$7_8t7UChl0nvZ7x{SLGS@udj;7Ak8jZ75mn}JN^I+YQJG$ ze^t~&;ox@cgVEBZ^?ynAJCzlB&8`wFh80VwpF{elehz8bY^tA!(yE(7`sQv91PI__ z=`s3Qmze7=pJF-)$s8TSnYgw~`XRx(zZGf|!%0Hx=hKIbB(-juf2cgGqZM*}h z(1y7s;?K3Lu_GEq_NTd6n?FSMI@ZaNf}ZP5B=;X;#yaM8yoOvoi1fu3u^CBS(cmsb zdhLp+L(<0>hV2}$fQE%vgf3uGoGOw8OLdGx=2pZ!;7VfY#-jvk|MHW z^jJMEqSm>EJsTJCM+|ft?Gq9EK5JY1>&tAu$ujP$o&N@VhB5Cj(d125WS=m^HMPzs)LH#4vmb z(%zL>uN`D-*{;#G{oiFhZSZZtYH{=k3&hQQ!R*$_?B3bbn=l6A7DtK(@3T+XnW^II z_t~LfrRl6P{k`!224~HTzNTX#Yn5o~Ub9D~$$v2;tIVis(-~Q52C5WOqs3-smFXyj zjf)QWh{23A?#(sxpnNYga|Dz(bykpUcI;@HznCs4m{4Ul>}5jz5{H?MNSUL^OuEfX z1<|7ChpdCGF=UHJK7^&LUuxg@kez0^?faRIpqbH${_kV@P#jB)21 zW(GQHwi#(8ilfJv-F)_l~CP7t!-LOY1VsjH@y^2BF)P#AmBqDrCs-@S;AEkR|6zZ!dCP0Zon#%- z83gc_E9~ol=zgE!s@?20rZ^xOEUuO4E z(65Mz<^zmQdbF4^z-aC72w{rX zo6t>|=FrZ;Xn@xy`d`yNQS@b^Zh(=L68`&Vf2!a7r(_nGGh=`A`VZKrYoQdIK{48jijF8 z2g;99+2KdpTh+3Ts&AmgO;-H5B6bkCF8nb5`&D*{D1q!?_@V#LsqF9{6xgHa;lC+y zNYTT8(%^GN5C6G@dPVjFMNbj>U})+rkuuoG3!a%Oi&;n9 zb;5TtC>?${Vws|cj@47zMk;#vS$(%FdiW`ia}-^j57-+H2$WZq%DD09O3YcM=;22o zKBnl`PgfLiLyVk)tqY~Ri7LWhQG6d)Njki4(DlBezjVKtJjCeE-~_ncLyS2=>+CT+ zyBn`I(ErdO;U6vZSM*trNIr$YYZDYbZ@r|KD?9F1^qr4N`awlstmt>GBRXuhHvGYM zb&@GrF&$7$Noq#EL}qIz6ussNNoWg|!t0cxpLkNHJKN>`f}$rLk!ic)*C8J(x%4rj zi~i+C3EQw$tSL8gd%eF+GCu}|@tUNV8y%JD#t>L|%~AC6+hzJzW&Hh$4&Q7=4>LwF z_HF}Jg(@! zDf$D79{$<0Q1tK*w4Yb>qH`o5s99g3?^7A!My<;U zDth>F1sp;SD{%9H30a!fSY?DC3V|mV(bWG6@&G-pGO#TdWCPwcvbO*Z|^vy z=;3=qK3DYbT8rJc8My_2ca)Y}dtq3V)EmAn$EE0=?jmlak*m)WB_oY}1-z#$uHr`% zz!nE)hrh3ES9Ex27mPBxd%}-|ylRzeAl8h60D^a*1EY*lp73R-`=X_MIG3^AXm~({ z!*;t=etnj-tA}cr{fgd0(KpLx)9Mucs!cLl@X={S56AC*Q}jSQ@r&<98zsR5YF@uw z32h7WWOTx2HO)P)=zSHvk4q}+py=ZiJ$&=SJ&Hcyie!YjK3z)`UF|A~*DM8im^mtj z12o^LfFF2(trt|_HhI(D6Q?H`NrI0tB0b@UtXx!Of65UBW1#D9W3teEr8E(qohZBR zFL58_7liK(z+bGx{P1OoYHV5N)L=^VIm!*+TQOIaYm*={#~P!0_4!jOELM7ts(j{_ z_Q2~DU0*7CIJEhrqQi^Mk+CrN!|9=M;~=8;#E8!0Ao9X7=_N2FM7uZSi!H#{D}0Ug zRh2(mK?d*+N!L4yzL!h8PAd9wMF;TEGajaZHDb(oqlYJap>6=oAyF;7+Z`AW=Cw!@ zKLfkxmslz8f0i1>2a5#*CxH9HH+|rz(I^Mrq#uWTHdGf!CP2r5)dspeN)Dcuk9Yy91xkH=xR|fUb9y9=Bo@?Lq33ptx$1PCiQ5qtNcx+Qu72wKdk8C zsKw`s9**GsuIT+#Z_ib7?6L4Uzm}vO+fDMtv`QnkS34E7YLQ7x2PSNVU250ZTvfQ4 zqQ9nkx>wQLC^{@sAE`7(rDUt+-T^9qg38}4N+uccx1j#%Qa^kkC9frl<=H_pJzP1y zn#KZstJnoYLdtH%75+p+rbkKFC4M(`b*Jcr^xhi z^*H6CZnBZoJR7F_SZr#hH1Z9}r4=fA_;xhdk_p99`m5}46!A8a8k`E*=$VUQo|&(T zg&#_>R?)|(o;^}ou|?6Bso~q|@h>R)I@NV8{x>B(sD;BohgE^_y@MwdJ$yst8Abm; z*l@gb*Uh^zV23l&mDQTKFvW--<5j#j0>8+S4|EEfm!!+Bu)%}Iu_?m08xB_VxoYK4 zJ>s;HV!#w=3OrFAi&ZP6X}_{!u2=-wwl$C~GWr_v1=s7Jv?VrCZx=(F68mtuC+|r;Z75ZC6#X4F(RZs*AEW4BsIJ~tDZo8~=(+I4bNty=q#ut%z0i-!Re>jkJ{26Y zN9BL1#=BlB`=Fv*Yi*kp9lxVPd7VZ}!c0Z~PSL~n8eIW8wnu(gfJDI30mvB+sE>4r z^`vPeGql5}q-5(+hDLt$Tf=+JfcA0;apft`$aWR=rM~Utx5N{$#t< z{o^Q6u+nH1wcjD%b2^F{D}n7=sd#=RuwCpa$yYMP&&XCkMW)A#=Btd>QGKdpa)6kz H)JXe(yw4xT diff --git a/progs/basic.onyx b/progs/basic.onyx index 3d3f1584..2ce18950 100644 --- a/progs/basic.onyx +++ b/progs/basic.onyx @@ -1,9 +1,17 @@ use "progs/intrinsics" +pointer_test :: proc { + p : ^i32 = 0 as ^i32; +} + +print :: foreign "host" "print" proc (val: i32) --- + test :: proc (a: bool) -> i32 { return 0; } export main :: proc { a : i32 = 0; + + print(a); } diff --git a/src/onyxchecker.c b/src/onyxchecker.c index 38b9bac4..5b14f880 100644 --- a/src/onyxchecker.c +++ b/src/onyxchecker.c @@ -52,7 +52,8 @@ static void check_assignment(OnyxSemPassState* state, AstAssign* assign) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_ASSIGNMENT_TYPE_MISMATCH, assign->base.token->pos, - "TEMP", "TEMP"); + type_get_name(assign->lval->type), + type_get_name(assign->expr->type)); return; } } @@ -66,7 +67,8 @@ static void check_return(OnyxSemPassState* state, AstReturn* retnode) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_FUNCTION_RETURN_MISMATCH, retnode->expr->token->pos, - "TEMP", "TEMP"); + type_get_name(retnode->expr->type), + type_get_name(state->expected_return_type)); } } else { if (state->expected_return_type->Basic.size > 0) { @@ -81,7 +83,8 @@ static void check_return(OnyxSemPassState* state, AstReturn* retnode) { static void check_if(OnyxSemPassState* state, AstIf* ifnode) { check_expression(state, ifnode->cond); - if (ifnode->cond->type->kind != Type_Kind_Basic + if (ifnode->cond->type == NULL + || ifnode->cond->type->kind != Type_Kind_Basic || ifnode->cond->type->Basic.kind != Basic_Kind_Bool) { onyx_message_add(state->msgs, @@ -98,7 +101,8 @@ static void check_if(OnyxSemPassState* state, AstIf* ifnode) { static void check_while(OnyxSemPassState* state, AstWhile* whilenode) { check_expression(state, whilenode->cond); - if (whilenode->cond->type->kind != Type_Kind_Basic + if (whilenode->cond->type == NULL + || whilenode->cond->type->kind != Type_Kind_Basic || whilenode->cond->type->Basic.kind != Basic_Kind_Bool) { onyx_message_add(state->msgs, @@ -214,8 +218,9 @@ static void check_call(OnyxSemPassState* state, AstCall* call) { ONYX_MESSAGE_TYPE_FUNCTION_PARAM_TYPE_MISMATCH, actual_param->value->token->pos, callee->base.token->text, callee->base.token->length, - "TEMP", arg_pos, - "TEMP"); + type_get_name(formal_param->base.type), + arg_pos, + type_get_name(actual_param->base.type)); return; } @@ -262,7 +267,9 @@ static void check_binaryop(OnyxSemPassState* state, AstBinaryOp* binop) { } if (binop->left->type->kind == Type_Kind_Pointer - || binop->right->type->kind == Type_Kind_Pointer) { + || binop->right->type->kind == Type_Kind_Pointer + || (binop->left->type->Basic.flags & Basic_Flag_Pointer) + || (binop->right->type->Basic.flags & Basic_Flag_Pointer)) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_LITERAL, binop->base.token->pos, @@ -274,7 +281,8 @@ static void check_binaryop(OnyxSemPassState* state, AstBinaryOp* binop) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_BINOP_MISMATCH_TYPE, binop->base.token->pos, - "TEMP", "TEMP"); + type_get_name(binop->left->type), + type_get_name(binop->right->type)); return; } @@ -297,9 +305,12 @@ static void check_expression(OnyxSemPassState* state, AstTyped* expr) { break; case Ast_Kind_Unary_Op: + check_expression(state, ((AstUnaryOp *) expr)->expr); + if (((AstUnaryOp *) expr)->operation != Unary_Op_Cast) { - check_expression(state, ((AstUnaryOp *) expr)->expr); expr->type = ((AstUnaryOp *) expr)->expr->type; + } else { + expr->type = type_build_from_ast(state->node_allocator, expr->type_node); } break; @@ -368,21 +379,21 @@ static void check_global(OnyxSemPassState* state, AstGlobal* global) { ONYX_MESSAGE_TYPE_GLOBAL_TYPE_MISMATCH, global->base.token->pos, global->base.token->text, global->base.token->length, - "TEMP", "TEMP"); + type_get_name(global->base.type), + type_get_name(global->initial_value->type)); return; } } else { if (global->initial_value->type) global->base.type = global->initial_value->type; } + } - } else { - if (global->base.type == NULL) { - onyx_message_add(state->msgs, - ONYX_MESSAGE_TYPE_LITERAL, - global->base.token->pos, - "global variable with unknown type"); - } + if (global->base.type == NULL) { + onyx_message_add(state->msgs, + ONYX_MESSAGE_TYPE_LITERAL, + global->base.token->pos, + "global variable with unknown type"); } } @@ -455,6 +466,10 @@ static void check_function(OnyxSemPassState* state, AstFunction* func) { void onyx_type_check(OnyxSemPassState* state, OnyxProgram* program) { + bh_arr_each(AstForeign *, foreign, program->foreigns) + if ((*foreign)->import->kind == Ast_Kind_Function) + check_function(state, (AstFunction *) (*foreign)->import); + bh_arr_each(AstGlobal *, global, program->globals) check_global(state, *global); diff --git a/src/onyxparser.c b/src/onyxparser.c index 3356c981..16598750 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -395,7 +395,8 @@ static b32 parse_symbol_statement(OnyxParser* parser, AstNode** ret) { AstType* type_node = NULL; // NOTE: var: type - if (parser->curr_token->type == Token_Type_Symbol) { + if (parser->curr_token->type != ':' + && parser->curr_token->type != '=') { type_node = parse_type(parser); } @@ -621,6 +622,7 @@ static AstType* parse_type(OnyxParser* parser) { while (1) { if (parser->curr_token->type == '^') { + parser_next_token(parser); AstPointerType* new = make_node(AstPointerType, Ast_Kind_Pointer_Type); *next_insertion = (AstType *) new; next_insertion = &new->elem; diff --git a/src/onyxsymres.c b/src/onyxsymres.c index 06e43044..fa72c348 100644 --- a/src/onyxsymres.c +++ b/src/onyxsymres.c @@ -324,6 +324,12 @@ void onyx_resolve_symbols(OnyxSemPassState* state, OnyxProgram* program) { if (!symbol_unique_introduce(state, (*foreign)->import)) return; } + bh_arr_each(AstForeign *, foreign, program->foreigns) { + if ((*foreign)->import->kind == Ast_Kind_Function) { + symres_function(state, (AstFunction *) (*foreign)->import); + } + } + // NOTE: Then, resolve all symbols in all functions bh_arr_each(AstFunction *, function, program->functions) diff --git a/src/onyxtypes.c b/src/onyxtypes.c index f70a2710..1960b767 100644 --- a/src/onyxtypes.c +++ b/src/onyxtypes.c @@ -1,20 +1,20 @@ #include "onyxtypes.h" #include "onyxastnodes.h" +#include "onyxutils.h" -// NOTE: These have to be in the same order as Basiuc +// NOTE: These have to be in the same order as Basic Type basic_types[] = { { Type_Kind_Basic, { Basic_Kind_Void, 0, 0, "void" } }, { Type_Kind_Basic, { Basic_Kind_Bool, Basic_Flag_Boolean, 1, "bool" } }, { Type_Kind_Basic, { Basic_Kind_I8, Basic_Flag_Integer, 1, "i8" } }, - { Type_Kind_Basic, { Basic_Kind_I16, Basic_Flag_Integer, 2, "i16" } }, - { Type_Kind_Basic, { Basic_Kind_I32, Basic_Flag_Integer, 4, "i32" } }, - { Type_Kind_Basic, { Basic_Kind_I64, Basic_Flag_Integer, 8, "i64" } }, - { Type_Kind_Basic, { Basic_Kind_U8, Basic_Flag_Integer | Basic_Flag_Unsigned, 1, "u8" } }, + { Type_Kind_Basic, { Basic_Kind_I16, Basic_Flag_Integer, 2, "i16" } }, { Type_Kind_Basic, { Basic_Kind_U16, Basic_Flag_Integer | Basic_Flag_Unsigned, 2, "u16" } }, + { Type_Kind_Basic, { Basic_Kind_I32, Basic_Flag_Integer, 4, "i32" } }, { Type_Kind_Basic, { Basic_Kind_U32, Basic_Flag_Integer | Basic_Flag_Unsigned, 4, "u32" } }, + { Type_Kind_Basic, { Basic_Kind_I64, Basic_Flag_Integer, 8, "i64" } }, { Type_Kind_Basic, { Basic_Kind_U64, Basic_Flag_Integer | Basic_Flag_Unsigned, 8, "u64" } }, { Type_Kind_Basic, { Basic_Kind_F32, Basic_Flag_Float, 4, "f32" } }, @@ -27,6 +27,7 @@ b32 types_are_compatible(Type* t1, Type* t2) { // NOTE: If they are pointing to the same thing, // it is safe to assume they are the same type if (t1 == t2) return 1; + if (t1 == NULL || t2 == NULL) return 0; switch (t1->kind) { case Type_Kind_Basic: @@ -55,11 +56,12 @@ Type* type_build_from_ast(bh_allocator alloc, AstType* type_node) { switch (type_node->kind) { case Ast_Kind_Pointer_Type: { - TypePointer* ptr_type = bh_alloc_item(alloc, TypePointer); + Type* ptr_type = bh_alloc_item(alloc, Type); - ptr_type->base.flags |= Basic_Flag_Pointer; - ptr_type->base.size = 4; - ptr_type->elem = type_build_from_ast(alloc, ((AstPointerType *) type_node)->elem); + ptr_type->kind = Type_Kind_Pointer; + ptr_type->Pointer.base.flags |= Basic_Flag_Pointer; + ptr_type->Pointer.base.size = 4; + ptr_type->Pointer.elem = type_build_from_ast(alloc, ((AstPointerType *) type_node)->elem); return (Type *) ptr_type; } @@ -72,3 +74,13 @@ Type* type_build_from_ast(bh_allocator alloc, AstType* type_node) { return NULL; } } + +const char* type_get_name(Type* type) { + if (type == NULL) return "unknown"; + + switch (type->kind) { + case Type_Kind_Basic: return type->Basic.name; + case Type_Kind_Pointer: return bh_aprintf(global_scratch_allocator, "^%s", type_get_name(type->Pointer.elem)); + default: return "unknown"; + } +} -- 2.25.1