From ab85fea44d3a2beec709d4d7fd921ee40800c3ea Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Fri, 8 Nov 2019 03:27:32 -0600 Subject: [PATCH] Partial initial upload --- Coco.exe | Bin 0 -> 90112 bytes Parser.frame | 156 +++++++++++++++++++ PingPong.sln | 66 ++++++++ PingPong.userprefs | 20 +++ Scanner.frame | 381 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 623 insertions(+) create mode 100644 Coco.exe create mode 100644 Parser.frame create mode 100644 PingPong.sln create mode 100644 PingPong.userprefs create mode 100644 Scanner.frame diff --git a/Coco.exe b/Coco.exe new file mode 100644 index 0000000000000000000000000000000000000000..809efeaa1537f37a5a52e5e77d1e5ee4a8363d75 GIT binary patch literal 90112 zcmeFad7K0R;g8L9QqWD4-yRAc*1-K@d?u!2?10$nX6;Pjyf4?ga7k`RDt3{n(_d z>v`&_r=EJM>Zzxyt9$ldexWjzQWma{KUQiB?({c@!%q%2Ah{v;od$JJ?3vM9LVGeCL|uJLm1QxbwL3;YW0*Qt@$`b>DoY z_6nKmj%ItISK2G8A(RN&O7(=4>J;qyxjKFb?j#-In?!EJSbn;z%}58H{!lMe3jo93 z-A`tkJoqlA82IK%5rh9Wgj8}c?$f}XN<{;7QNX(g;O-NTIORmZXO7nOqPl9iJu+lD zq}%Ox4+DZ_gN#fw2lv3=94MsQJ>u9h2w7Ih%yfN2=yncd`z-pI20qikXBzlS1D|Q& zGYx#EfzLGXnFc=7z-JoxOauQv(!e3KuErm&O$}UoJ*(8OT%`z$3ybjo?ysZAQWt^| z@}^w`Yx4l&E%BB_OR^=^(rmRfhcnG~wmFh%j+UMVb0ZzS%IzXbEWhK0k?E*$!J6!{ zDJ@9IE*;+-y{e2=d^}OQ(j(r*CvNwM(*ucw*=E}b6EaS+Hb*(@?8zU0{4wf~*{Pp2IQ=*Z^I_DXIcE2#0W`?)cKX%!-| ztB2NrbgYV90WT?1J-h})t4Gv;bhyh(#~dRat{xe{+SS#7Vuh6E9V@RzY3W4y4Zc-K zz;X?MTkV@hsa)e0l|6A=rZ{R zqzAEGW~Mo^wR?j5@}T@%+nZA^cB|H=Q{_ft>T}+zoJKbif=02K5*Ln<<_1Tl8z#@) zPWo~J4YDJy-O)8$fEq5{U3vHwz_$ZG0-duN`!Z+`{xkAuy!d2Q9~V|o292S#&>3bG zB3Oo1MJ~&z5KtZl28C&chEVDFnks5-0YkS=k|YnA;#JhhGCI+dPOn0VmeXb!MrM4R z0ULKpx4pasWO^cvtU+5TcB*>o#~AknLK#ePQ=Jmp*AFNDV$tv4vJ_S zdDPmbx*7`IiT}KMRfwr@HY+3?3uTzhO$0ZYr-)}(s4OYaWHqp2%ofp)St0$flF-XL zpl@hOmq#*ejTm{fQ2bYuLr8#rRW#~1iKbL6=U5FH%(1IoDpVMzE0zHhLkgvOS?YSw z!{($77EqKirNiLr8RHo_K9OC@l1DCzJ0}@=)Ew$1bxxUR2*@hkcBZ*nir#>FyT%#R zW9>}uCzM7zh9Qg|Y6YoZ2kvNK^e+-4Zj@mo?1W*n1d*hpqEfG2K?ie_&crQq+4-$t zlaMS)!;}ut5V6N+mue2rUn{BB)IS(e;gzxb(R<=4N5xP$^#OET>DyXY)a*;OaLqko zg%Qesrf6sCBwg*%!D_cS%1e)F4fOoU%uJ1GY;VRrGpyE{Vhtd8y#G(A;%P{x@}_p` zh&0vGDNTk(EaNtEmg_=i%iTOWQ*Hy333|LqBW2`v!J0D0xE^Pw^k5kkPO~13QmXKl zHn7x2)Y9fYLxbRgH6qHgxZTw)(bnZW@Dfr=M38wjUEGN1(MW?XE+XoF!z0ILfs)Zo z??{YwMny6ISv;cB77wOq%CR!KS-4%$1^5pwizc@xQ(L_Y3`P$633ZUT-MImXsTsTT z5!_dD*d4Vyse2WFsZ%{TT)G29b|>*z$zgGZJ#r;FknqaQUYQKUQ-OH16&Z18^pFvU z#&D&rL*mYncIPY1hr;3%JJ-0fIULLZGvl*uj-_c-cqs_8HgV43DR_rrq6H;jV1b93WP`+ADm+_|zGmPaDp#z3%h%X?qV ztxRZ|$Y7dCc4;D#TM3#~NlgS%NynFGzXY_=c0DIPcMOh0V0UB&EzM9k>+)?pLe7s-sVS0WaS=Pso( zDmP6H^ZX4I!GAOtQMvS2zdXat4laf5vZd}ro;b-lyb4oi8QCiOyoLE47RLe-HjW^4 zbVvus0<#zFs@3^tGM3+2uL~jv z)0XN=$vhEyIjG{8w7LG{D^!0#tOl-mE>+CxTxefA7w?Yx#R);YI2;9&8j&%eP1qOc z0CJ*u_zYt}U{t72T(D+pSF0CY&V2>uol-J3W*Z^NcS2u=EuBc(fcjtecp*TE#E|_B zieTa(4ba?7t;V+PZj_CAFr5W=YHZ9gBwo^}P-RmFSGIXTJLjepmk0-EfpE;li+MXs z6Bay5&L0)^3RxD*oPBf-)QS5FPZU_Sg`H_SJ82G6iX#Sam|WzkKvNB^ zyDqO(q17FC`2V8%>~H=8a}(zN^uL?ezXaXPm=#hgHx8|>X7{6$#K*gRwpyEEW0VIP zh(m!8JE{?<03n7_BQ5|!ETl$U1B94Hjkpa6v56Y-5D;PvHR1^%Mh1(07Kl+n#IJzJ z$#kak{E;y6AdL|LCK1HM2_v(c&NYlMGJ$E#2*NZ3b4?&jV-Qmyj7)Ew>)*{ANP$KL zPO4RbJ7$fKPp?9oTC;W@OMy6WYk;#)rM2aP`B-I;R}34h)I?k*Tnlimz;!&X4Y)4G zbv>>-agp777T2$Fy^ZT%xZ>bfYC#}HkDxNGQrJg~6vW>^Diosx@tTjw#RT(w4HFj( zl_!~U3BlZ6!z2ZBbq$je%sDko17n=iG?PXFkI`V0fGafEEa2W6%nFFHK`PBjJ)9{T z94D!r8XPYmY#qcB-A;=53c8AEv;(8xf6wPWx6g<3Va4a+d{sU^Yi>e6A?F1kKdrvd#7sLTpzc*ca+Ah>~7JqRa3pjJ*@}L zO&W7zN|mU3dPZ!mN#yaL?(_ep@NAWO+ziDCqD>H2 z_=t8vkV>_x0k%4 z=wU{bj`=suGMsCok3O!nq=xSFHMrjA6fPBO1i?lbs`exOOwSD|CtP~_f2eqB^$yX+ zY3P1h$GOQhC3~^|OS9iB1?477Nlk&09FKpOug&h>UA4Tm`px)1bh=A*>5i0sF@~Jx z|7qKNwBP1qeJTHAn_sO9iFbQdOck-nrg2a@nU&9NKgLHcsv&Frr)DLQ>|kEy>^uVF#E4p;; zE|AsNn4FX~vWDpt3~fbgn$d#!ur|?;5zOyvn6ZNSX$><`Fpt(SdBNPp80j#>yuR1% zt1rghE%&{hd?Y{65MwmSH%8vD9maeeI2OXxH^DWgKj*$j)+8s!*TH6)P>&ia!VDIH zsl|PAv?{hW8L*uS>{T8`Rpd1qya+wJ^PCo3u84LkG&{<|MI&H+ELp;61Pp>+%fw-h z*rDMqBbk$?z9W0CGf^hCx#1Jh^0pE|(1krtRML(+V`)Fn$B$3&5;#)r1d-rnBbD~< z_5hzI=0mB%2TYlixmAfZ*!jtt4a4X)R&G+y_a!;FcZ_uh|7k%u6Wlf4LmcO&@$(Hl zw-`%BSXJOHBU~L%w+5>^0e9YCgyY12-t&NJLFl`Le%dzaP&wkeQ0NwWbTE2Bel6Ag zh@hpqKM^2>^fHLX6dLPO(3k-lQ{}-Au4CFLqgwHJCXq=xX(L)j<>Cd4_W5`p&z|~L zgnJb2&7fWitA|=1r`3pX4pVO37PusNlhB^}dRBJgNp4e38IreM=Pjgk?t+CJUhdz5 zlkDRg{0s{F?rF0;5z?IqFDHZ@gfglSFHb@+f&J}z&!_6>Yboi}sxI?&8dj^&U9dJv zWB=oP?6ZWbD~Kjr#rUxddgK_dVqxS(%e5#rK`f*FeE9gGxSerlVR?3goptx+d#k&e z?``gBe6OBR%ji-x*XZZGT<6@ZbKa_R-oy8H_aVM_xKHqXg!>b|k92><_fhT}e9y() zcO?>c|0$7#Yeh+@T+(fjNXl)MNP|0uBh~(zTKT_h=RftL-mgh~_DoI;q448Opag3EIqi@A? zV`xi?igULE&+@b2;U10{o^M#;ei#lrZYHDIW%FT+_zBn;+)jZB*{2!cZa% z3c+?69WOqCR&dmA9@q(TYP=vh!CpEZCpjuY@^)a%U4=Ww9n23G(F2YtXH=|=lH(_0 z5E*g1LSx>PC-;_}+Wvj z$<X3?`uCiFS@JcpL@pjV2{^AcdQ0zq^gDl{<7 z3OWkp-T`GuyNA{DunQS(cP{IX#HWOG&Bu-nfXmZsNu9MMzsodRP7B(<)@ks-5*4(8 zb@kYZAhJkRN&g(t%A$%2n06@ieWWg2sPSu)#z7%+Bbv_YT)U{=ruB>8tRK`^le`J zSvC64UVK*Q#5+S6{{Q`72j;zpkPR+enjUoeT_NSH4Oow)8RZcrbMO99t~i^zg`J6voQW#vQC-S>eAWh0}OqH_V#)rpCVkykRZSG_I}4+4b#_Z56#S`L4$` zP$(28XATnraYDm?sya*=HaP=5+oujafRiu zY=WsSpr~XC_)ao^!J$oK3Qt&r$`M$?LFEWi%CUx&8FwOfWlxld$%JlQ@7a=}N{~pz zG$a*h=vJd4$Say^!?I6?Hppk3hdZ|o7s@$dM~O_AK)Ida!ZYC&OUMWwkGyG$u%ZHL zi-jIPBbOYi=b$nv9uKOpR*KfEUkZdJ-aBy%;yj9xOMNo$Pi`oxH+;E3y)o^0HEdz^ zQ01^{p>o3tyQ2K3{XOcshB3gAq4iBzT?wjo?yFf-+?Qo#$Q;kZ^+Bg+R2Rn5F&n)I4B3av(dHux1_`iX|Dw(W#6P6+1A zJJ%CZ1)qMbrpMDK;@;)ugQk%$8^}uSe7={DE768JRM15&_7vjIiH6iIQN&pst{QQn z2bEL@5{c^~tVJZ8RT6b{7j-Pvjm(UTcjqKFsvFNV8P(8@M~@tf{W~hstT7)5O&bI2?Z27Q|S2f>dFf+r`oNzc}v zyp&|=Zl_j?%s6;;xGgLRr)>vUDDH1(!L}YYA$7z zuCEdN1q4zl)|FkM5zA55lyjJtP-9GLw~>%WD>S@@S)99*PU= zLjI$$Y0+jw&tX&Sl^|ko~c;Dj)}wG z;;kLUXW}(knky9uK3%z{U4c_$mCr*qcQqQv)D18P4ZsX&uB16=47Fe7JX9j?9Bo%% zsxh=KKsaSP>3Hapgv`S>+AhW}by!Ll1o^mm_%Ctkd^kl(9cVxvCc&5#61(yx5MXA% zWHQ$7CO^@J#e}`{+cx1$kBD*Nw$=UrG!!k(%;OzJkmmC+>*z*QDEHckEHWP6nvQVy zPDTru!!di)n%<{E-}c&m{vz5k8~8_kd;5@5*jM!S6uQBoe?EeE$wmtNJ(?@Bku(zR>T6-Dzw-df`e?8cS9)?oHiTt z`a;0G?zZwU8@5h5%p-Svsj%f@Ru@=m7Dnn8zkvE}Z8|EG z1@pHNzJ)}Y80}0R7Qxm9Q=hsX<-*{j?bcHL#a>L(_9DvmBCs390#!-RcBV?o*QVpg zbxg+qj^hIy;X6iTI|M4WnOh_q-}+ZUQPSNfr$4pzNi8rmm8>i?0Acn;7o z)Uk9IB1UBm*;-c*v`WHR ztZfIkvst0a*n#EycG%T{D*{Pa3mj@yNS%wrf|)Wr!nIYov5r;YHf%x@z#6Z-WN5ol zeRhJy7(TE+rkqk>hk<6oP|Na@ug_VNKz*V6mf@R}4F&HDPd-MkHiwy(}Zecov4sYK&PdsHJO%gvRxF^c7Sy zU1~$54(DkeXSk-Goz|rkvNjuhP%v*A@_CFS+d0{<%W;D{TEa{^`x#M@mU-&9RJM@Q zJfpG-Bc2f+FT%Mw;^n0j8Aw8!jCS3uYdzbONb{T`;D@Rm|v+sm_5H>T+h(4OnnBv zik{Q7N#(V2A%$HT8nU7Re_zbx^U`Febqh4m>r2NIp+6GhP6Cfl@=G9^UMx~S_&&;^ ze5J1<610^;pCcD5&eXaU<0V{RO$Lwr${{Gzv-x%v4N==(NEF+>PKEs--(FMP>8#TQ z@pg`M7ozZ6q)^AA&m)UYZDgv8Pz`RQ!PT#lWCqJORP6s`uoBL=fz2%TM9*H_4A|>IJ@YAV`v_%KlVT^Mi#q+hCJK9J1AM# zx=+`dWx%|0?7u1XQrv}*YsR6@_=T#8b>KY~9Ng<=X6rS*7a8W2V z>+L@OpuXv~yKsEPA6hAAyFdZSs66oLG%8S&<^CLgnQU&mTM;GyJYIeqZJ@3DWA%%e zEPhaf+G#J(o|n~}Z~Dtk)O6?{wawl@V}=X*>Ci?QqG-P_JHSih*U9+#qxSM%-Iib0 zL~~868auO|?!)RvnCAkOo5wN)=SLw2!o?i+afk&idINd5*$byX3NZstuJ&;M<~y;x zHgU(LJg2s{Rtac6=^P%YjNTNHN1MStqJ4?WH0T{xZz_t<#o0mDWgZzwC5ts6mDf;O zGndxUjMS(7!s)lvt{u?r)zeacwT{#@Pe}hdPObg5w5Oq_hE`n?N+W5Te`JR*Mrs$2u}s1_ z948?F#FM$6XiqwdQ)|gwlf68e>sf|(40q10iuSZbb4T_x5;hl)F3qi?gh{!%oUm&k zVJ;8xbLsvCkSlJx+c#j*Bs)Ia z17nx>MCkh$Vf8!o+bKkk`I?TEl)guPhEyxJV$SspWtVa_@d{W^&&XJA%*?A%N-Q^V z=0?8v%zOd&(m|k&gh^9d;&wxRekh1Bf#SF{*}e*5TMj06fypB?909kr7L!DSJj@Qib^K@+1N#!Paym zmL}-v!!gv~{Z1g65)LNRfeEAmM>)f6-Cmjrz4Iq|X49!!ySxzU3ZCtO`BgoBo13Xj zvsI#2is8{Vb>~E+8BerxV|peaj4hi_I~Q|s(f;1i`T|e9ACnu?U2qP?ePVY8;fij< zSz^1pqtBJGsKOq_(YCv=2CcB&B{gWF?JloDb8PpJ8Z^~*kE}uCBG}OiM{=k4HraTD zjunlq`A0FAb8nz$Dfp5BPHn{a>C5aX@HGNer{^0xK;~YEZRAl4n;vq&u-JtrBY!B} zaftbN-0`p?&Ik6_05I}LA`JL%w}J=#nO$Mt{?)E)ah&JLYiFA$)D+g>P?V()wH%8XMnKU@tjsGb22(N2iJ7n*_OZLx3EIWYXbu zq#qVtKP*Nvii&sr9FO)JWLLQ{-G~zsjk5EG(m4Gbq^Ihn<8T|kv2g*k4AxQE?rgy1 z&>YJoGbwaZmLug%^~C1Hcsf?W4yKikS5CpLXk=5sP!t$S04C`b{rEPDjuy;VR~p5} z%6+H;zK*f1Ihsv)U&%n(-9XPi9GxpNV+q16z98Yrv-1FX66A&*hjQ5m!sj7K27WH$ z9*eFG1j!~3O6GxS`HxVbC*Qr>kk4+$Ku#wo>+=x1s6yF0_t2uSm5OZz@>8Btv*U6G z!cYf>_PO7TpXu+u-akd4L;ILMDXavVrk@~ zo_LDIPuHB1?cPRoDO5V{Ot#%OYtRVWozdv0HQ4Tk8U%-l)M>N(h;Gg6h~>D;TJLzI zaZ4nep5P(?d-4t?VFxf?$PC#0i5g)$e;CxR7X(k#cf7qd;H=$;`hK*pX<%$&CnjBb zAHw)!bcurl%Oe(yU3)kd%D%2Sz<%}$1gJKbsmmddg zSJY?|=JgifmbbPu_`Jc8_4j{Vm{Gx>yfE|Hp=Vb8cAy?cf6`A(e%NJJ_J#bF@d&K) zTPOk@huZ8qv>ANjbme}IGvb~c=a35v$SG_ zcSsVEu3rz%mo!tQ^T9mE8RbcILvfLz;RTR2&_pz+Mf2#rb|I}v+~3luI0~q=Wph%O zpLAK1PIB6!nmoWvcQ7d_n_mqUF_tqGn{gak&~c^LctY)>yG3mW2_Hg`=_SCm*~Sdu z3nCm`Ul7egN^{ay7d8yszx!fB`+K9tIFW!&5vqGrD1!r}GmhdN9oj2^D=~CGXMAvs zx4ahY*}9~h-oSDf z>lKV{t81ih?Dt92GNlVhHgIg!^;-9b_1C(#=bMQ<4Qj_dhpuzU7T*GS=&y7w0_n4D z#hty)poJ*1X6d>n55db$5n6*ON$foQN!yvDjY@sDWQ=Y;ru8U`wCA&@$H8yFz<%68 zVh&)VEp<1<)q2!^2MX8w+HkVa*(HQuH)wmBF}|b$rzPdg4Yq=Chy3RHG?Ro3GixVVx`dGdQH%f1vywsE^_V1@}>3waEe7KsebsU7zgaBhaa6EFj=0 zSPD{eltn5u>O|==aB=im&4=KX=(C!zm2l`H;?UvgZJ=#X)SO^Z%~muW?3rUTkQG(e zj*)g9uJhXlcGvbwynh=dVud2_=gT^NjM{az=lh(m_Wp&$p_;mXq_@MdG%Z1I{U@Td ze#~+BBu2m|jyXHQ1?&ZywS|M7Wy~WCgs_v{z%Fvqjzr6gfsRJ_c=8dl&c<>&J^{Je z$Ne@cpih+J<7rS?+O2ydvX1j+;WJGsNB5lRlu+|GHpDzr} z4qd~wSFcmyk&;wc3I)!443LTr-PV_iwpw`CNAJ4)2F()OOiBzJ05hpwhAR;-!8#ThI&DbDV zfbY~rI&i?Yw;&w3aD0)ER>mZ^>z}a2(d4B(oj3HpuG8rJOIkjD!{rhykR+s;u7E-k zvJ@HAOuj;Ni_V~Ln|)gKv4oRD+tEDJs`fn0>!V*#Cw}O~uMHg+H?-frDD?Z1#Orq4 zPe9WAKpP#?p?tHvKXit3HF!y=^j#p)O`-I7JlA9QWNd6xVSAJ|B5iC`Wv?k+4iX!i zI}3Wo#d34Idt$j=WzkO#)g)Y)Cirm4Y}}nSv0PvGF0tI=?mc3;rQQ2DONCh`dkwz8 zAsd{C&XZ^>qSGbXhA7^jqk`KJ#i=ohjzSb?`zSgBQ5^51=tx8jyii2nCW^>{eg~dW z$af>3AE(vRW|qHMl8R+=J6;=WEgwL2v@=&F?Ce!ZcMo*8NO>u6@S7^|udOaToZ=4& zI-}f`!Bn>&P?Tx;C8Ei44woARW%+N`&0q+g2@F#%8d0 zzNY^BPP-!iOyqBY`8f@I6HY9Gz0c26G*ZBXx*o9zhg04#BUMVkxl$r6#_-A;MQ{?? z7cPI8xZ!N ziY}Ch*yRfD*rHj7o6U^yfb==$Q@{Qrz?=Sj9aDXwV`7bW_%`6i@9rG}nps*;8-YyF zZNLaU@zAeAQI=#;0SK_Wrji3w|vBCJ75;Ic5Ea#tG@$Wgi1Ojba)7{ME8EH3wpY2dLVp!3Fcq+gt(73nLM19NTuYBx8eXINhBxUh=pN=Z4$1GzlXtRzS$1>?m0zZhh_^_Q> zo=33JF2r^P<3bdw`$q$0qd#Bgq(PlFq|c*hY7Z3X_xT}hcDB%*L$`4CTq32hQA8QD zSqJ9<6~~itIXgDR!rplYfD3@`v9bxL!9ND}Dl0Qu+C^5dEO=X9p*(w^0t zS$0{m$sW&V((t_{DAaQH^r?z-kVK{6+#%hh7#sr2OW{$Suh@!(HW3I_lnQyM;=&Cn@J;haW+<^sydNKj8RgL1*ped)I*xP1>O%4C7o_5 zUP=~L;9(Eq5le_Ta65i%`-jF!zk7r4&NcnWvAu-TEkZ`PZbhh;Di-08U-<0M^@(sT z6L!IjbUkfH{vGnxA*6fE7it&qCMS}l#dw2d5Kg4zW%QDY<`C(6-Cx7dJ}dPP!dDz96;C=XX0(jKZ5JXq@<;4sHW7BO`LaKU$6_QOw;cMdsXis&uK$)V?3cn&_3Jy? zt8W_hB}ws4U()Fa*7^;<)-TBGxg_6zml}mIs@zj^$ckjgTA4|f4+UWL=x#d`yEJu34~oFWCcrXtB}RI-G@y6q;U08Bp4M6 z>BK+X^9N!s?eb|41L{A}rrj#$_2B31P!O^5zJgc12*B3t1ovvt=~7ZCMSmWyLdp6J z2CV~?I!R^DQ`x*ct>QXTKbUD;*$Y6!epSfj;eVS3aqPRpcX z5jY2{G@d?W88u_<4tM{~D&X`DY1hoe_*tBsTF!ExBYgDvG8z_NPhh6e;l*3bLdHD^ z6&%uAAUK^7$G)ewebjl%2a}qqhkdnP9@JL!gYQl?sH{1tUwL!rNYvLHdZs&O=2sH? zZ5`=m8<~MTl;3@s1TgbgKs)(4oK5eA+UgO|jG;2v4#rEj0~XUHb4L-b`qk7i-XR{6 zB8+ITh|UfYbeBi^FCitfFqjk_iMhpE26A(=f~e)e`jXU zvT3j_3L8`DemLpmT8*!u=`j7{`;8QdR>>taDo_J`=fbX1#KA`WmvOhNRZ6t040wKs z#q$*A1bix-JivIk!D$T_QfjK0FkX?xvlM?sqTVIdn3OT8!vr@ z^-G?6q6GI!iN~FE+z30I>}*DB(c~SX`AzD9~SmXAbwJkfTgCU zi7*3+vuMc@YKH}FKoU1vserU_bd=X8U57?1P>t2KJjyvz&caA6Kt5f_W1Okz#5hyS zze6$3mHBsQB~C?2204|5T@|W!^oE%5i*-o%;vCk6MSfd@j`r;=YOxxRLGxYQi4eLhPf| zN-B&?2L?lPgfpZgG91#<<>~Dq>iWn>bxjT@3d6rn9`+@=!j#U^9ktxD*^BCyD%a?+yafhAI+%49D**ylL zk~Z{sti5H;9i7E;rvER?;7=FwnEEpWCH>O5gf|eE7AS;EFH;ThGNU}vNfr}fI_N;H zMqlZul4PcwSxrJhzZHevZ;~vy(B(G??1AdRH4K+?3bw9EHFzETdeAtl2g2TdcUDrp zcMvRr2c;H1DKFBf`JiDg2d5qBy`@(n1J}LK5SEu7#6*QlKSGK|iIuVn^gM$rE#|Ra zbNp9zKU&M14d-v5x-TCH1EMaG(W$d^s)h%pjv5F9qS|_S`Rp*&7uJaX;C54c>E^@W z-3-V*%j>+(0ra8`Sy4~X_*x6}W(}@0$?f-#G1{;oYdu;Np?$Q7nix`Q5!-R1GzY$5 zO|FlPJxJcX!;+Wez%Qxbsm3@XYTE39Gsm)$|dj*PO#adS_LQC-!sfNQ_CNa-$tH z7LizoJ)eVsOeVv=5WergLf9g;9psI+A^&JHYCt~!dAKhoTg7{09mScJjsSBy^k8vF z`w>S;se<6GGaPM`-Lj2fm~?g(0*!<7XU9EejhGjR8}9)moe@J>;i1kKnF~H#MQt+| za=|oUZ6Q0IIE&}GW+RM9G=CF_3pkvQ=#7YG&?J!^M8BJ~WbZ-L)_T+h=W zM~YwS)BPMRY)yxnl@S{j8fFYr`P;z}+W>ds#uI#>?%kOAqdc#s!*&(D1rK#lbqf=G zmL9sZn^is;xezC=JX8M;&sp+cXO4*6!8|2j3-5nQ9R9>6$Coz4DC!Wk_NX||XSc&u5L&R4{*JXf;oNw3|H1iu4_pST(9oK&xb1O^@e z(0zIJGJ^8AkmNkz<4yx!(4w07?EV}~xp`np{wtI-535L>joS3SkWx#z4qpXp{bY-x z?#E;&OBk-2U+GYgX0h2vP7E0wrkXxnFEyMA8nX--=}SV&Hh>PP$@45tbsVU~{R$ku z75@~*(3eFtn&eqJQoxsDxKRH&7B)k%=3!jL6C|p4l)EHBMB%q(qtf3Yio8_MFG0)l z485PZ+(^O;9WTrHQJAbXQux4y5Zw);7aE3;n6bK`K;U;I*MieMT+w$5GswFV7!3iYaX9(hx7=6JE~t zf^9G2dk@zGDM{LBh!wyq*-6@K{ydVgb-zV_jEnloA5q3~lmWX;eUN>#Md6l34OV7f z{T!h5C}?EBv0mu=Ak=Gn5>{VC+zY4C>cb%ZCUpiFqxb|(&g+wMxUbL{?hBxbjo|>a z$l2SdU@pd&mKv}VfFD$G$7eA4M6=;OnP{SV?uoVqvgsr}1w~~BLUk}=&HyuB)fB7- zE4#1v%wmQ-N@H6*8g)95bZhlPlkCZV4Y{gkA;3zQ;`;Qf`2IV9eg%&wN{Tz9Y_=h+ z5VIJwD_GFN@yEw$hy#@T8+RHiA^SnRuW!)%8C<4O5gu*WR;O%vEG+o7d1@n_{dN6z zKG~!Dk?$asEoar8b>g#hVE^A_-~V}i6c{Js_5izfybQ%XK~i;3kY_2~7*?A>rssMsyb7N=@{-}O>8{PH09=vHrhyPCqsX!vYUXbH07 z+_40^p!S;LR*#2(X5<{dQE?1=DfaFCuQS5ec?04C{7k++U& zpSg>}37d%|etK^f8v)KDkZf^cD?I3_fV!Tn^FEQ3C%YZApKIVt5i?iTJ5y+>5Zdt& z8vhlzD*RnUZh+gpy3l;jnBRMt*7IR6`FoVuq`w}S_)zf;c-=vRW#9nfHIA^eK9&w& z1)~GElRoCRNAMgL&MMM^r?ptb6m>6J8Jm?X1XdMCfF2;1oEnM45OS7IrheFb{|ML} zIQmlW2v|Cd6F2ZxV;8KMeF|@iF|S476|_^_rZjM=%|us6sQn)pdR~jx2?;|fv>4j6 z0=Ydiaxz%TMx;nb7RD}&6_>pLTg(Mt1S&cBU86F2F2qqfa>tXrO@cR$2_Qd)v%Ns_ zl6-zU{LaIO-_?PaW0_QYQO}E^KKJRAhLvdlX)O7r%dC%Ai@5c3k? z?&0JDIr;upcbk`{X}bUi_J#*JXqxCC%0#n+?|`+SNu;Xe*>b6?JkEYqkMl5*0%lGk z3fh@7Jf=GT*9XDB^m6m>UvLq>_ef}+#uzgF7aQTE8zn@SzVIwPt3zl3gy=a23| zM0Fv6>Qz7kaVjD3=*q4V7o&15!UC35w*qCCFQ(A_64Bs!BBIw*^io8%ErPYR3VQ?q zo@g??+w1m!faqzk2plA=Vcq9FD%<^8tpKjpKLG1o$D=HM9Vff2HpX>1<45~sm=Wak zX^@ERp4Ywh12GF_yU$aU>yzKY75ux85L-D%7myeOLKW4`9EgDZX7NUk>wvm`T{p(K4&r!|LeQGM?2*{+KPW2gaRt>L zyIL5;4Mr?~KeXjP^!c;hGNh;DX(ua(y1nk{UZ-LkT&oZN*f1tNTF0CO?a-fpK4LSn z!=-u}w<_^N{D%~$#USEOQT(eEZ{g>axP6(R;quf+Hj2EIuL&LL8jppjL*YiF7&lUe zmZ6=>hdsbya@bKUMJ#;k1&b^BIIY?H7Sq+f18;iYop;*tv~vOo3n@!S>VF5`7$f$0)B6(f?g_a43A&^ZWLC(g!f)s!XnxtKZf5?%0Gxmf%5lap@x|? zK7mg2418IIlJT{kJ&}>VYI$e0DEvS0k;^EBevBhg9Xp#*q&KEqI@#W@^ky7JrZ$tGWlkuyh%e?7&=69?32VHh#}*gh}i410W~$6^xJ3coc#~5nepp8M5%t z8Ps+vw$s0&#^5X~c=C5G%TqWxSIy3Y#%5YGIJip8}zyq@Qb+t_XA?iNp z^Z3ddnw1WB;@Kp3J>Tl`vq`(Hry3kiJ&-Wz>>cr{E)S!!K^K2}OtZugCPe%AeQMb)_0~fsfAwx6bTGIQ z31?dH1uyInK~wtZ0XhN~`VSNu^zo@o{leFy^|sL4WH^dn`|o#{>&3@Weaw!ogei0k{f7Qw7`SxU`B`gZ}BZbU>|1QA@n zfklJBO^pxsaTxo3ftB{xwM>J8`($*LUHORL19m`blx~3{bln4QlBR;K-3>Y% z%fj0(nchwz3d{H!TBRcmEP6?}{KF^*88Ga**2hq-dA1b}X8wC1(247i7%)@v;Xtnw zeWOld=`R@irFSTJ6M=3OOGf2Ogb_PV&nQrwHUIF5x(CT;rAEwwW9>KM z0_bBvBWfpV5FYLZOFtgG^e39hpt3Ot4qN=ZL~RIf$6b)e|M4KMIcs=Iwl@%6QT<(e ztEKj-dj~TWWwE7$8WFp0zc6gS6}P3mvhL~J=9=38Mb}0>o(gZX2V(dR=rr3ZPMiEu z-FPFD9oBfa=eowaBjHT>C>lcE%gTXwU7!EZ`}Ulr%4nMU^Vyu>d?sIM3T{#2Q@Pwg z2XO<@+z_1F$e8M>ZA-nWP0zDwwbwyI=Qi>+Rt%I2VtOA-=nBg9X@z*Io)F&rI(N^Kgx^WoYGeFE6IMH0Vl68_3m{9Q^>a@>(R}^%t*R$mSUo;awza-~ zO4uDy1H`kdWb<|DKlYnT9=6#08#)6faNiVa>03p5`2-f{EX0P9&emt=bT(*&)i4%|e<5kmM zM0w9Vg;SF?C(SeU?|2MoLBl=#uO5cq$7nx@etv-y{KwwlIu%^IuE%C`y`R{@#P0js zc>l*M>O*48bB@RHV-GXfOP`&9>T3S!j_R<@L-(L*+^m5&hjFj{Q@w9iTXjKAB#Cas zL#WqGf#egglNQNC8gw4JdM8oX?r1_>L<(ZG0PBT1! zYIrI64f)3?lx97lmd&3<25i~oG5D~T_%na2PZxqkqjrU{X;x$X1EzkohWH^PUiA@D z?7wQoV)?7rl_D}%5UtAF?A-NIlXTY^um$)8GoDCkTq|ZQ%f<4ZXeb^S{Hu^yX zAE<2$aY5`G$hHu{ye%ZFarssDTAw^lb)H}En*(75Kac;6%Du#5IwX;(I}@VnvVB$8 z{C!PyKpi5TiKm5b@LQ@8YpDQ63}J(x^7G1aJ*pu@XE2dJSZnE2PudIH&#Mc+!d~UU zq<_dx_QOb#n8DG;R`ouKKSgn>I`HTW7XPSy^?pJOm+gs`D)oJ@3>YQ;Gg_-ZA|m%P zNL78FqTX-j5gVib9kh3qN|NUcMK524vb9bfW3U)TN1TJ@wyoA+qz=5Qn(QLwI4M~B`8oD_L z29qZj@fh*xS{@tGGMX8qm8-=(oO(nj5Rp+K0l3i88f`77W){fBQsOf^BwN=AhVa!Wh8h^k z2vm4Xi@+N^w4Xq~!@Y)N$Vy3zJmycJ-u%O^&CognptSHI1FtTUq3b=P@+=Z?a$n@Z zTx4bNsWm9u<{oa0$UjGQ&sI?@^a5&EejBoSAi-Hll_IF2>BDcV58_0HGcc&|R+g3u zCwBDO`!UsR6Yf`*WoquUC z?OOrbHrfF7o42F;#{mc%sx>~X|0N$B;^x}mGj#aLEKwpV_%jkFm(s8)a7_Sg;Nh2Z zxqBfWDuOEoIWlEH=5CZRbFwZlsFI1;WVb&@ zD~S9rkj==Y+w!nMwlOS}|0V8ta)$ZHs*==F(+JJ3ARN{%gf;zUXFf?g2)Sm_unaXi zKIrQ%kFg)8%HLm;Mbt|nd|c9Pm3$K^i@(&5PrGP==u@ExsG4C8pACA z^lFA1p^E);&6U1t0X-948KYK5`6C;x7gCqt6!=9*p{cL(0)iR0!F;+GQ8BO-@Gh7L zHYJ#SWG#EyPbnXQXko4URmyub=Oq(X#xO-*?uJv`yK0GKF3R8bv$I?oX3QzyK#Kdr zfpRd-D5hc7nB#(Cji`w=g;H|ExP|oGvlYo za_=B+QcSe`HR9HbNsVXnPWqrihG#ZrMucJgb19>`uPw@!ZP*#5*{UokUpQ;kjCTAbLX~f7;c?=P|>uEe6 zGx!^EqlMS6fOU2ZYQF_P!>6sg%2Tr0XY<>c_+rrz{5ixvP?MJKdxGHb?i;$_!Aq&N;u<(1NEq9z&NWNDFaPh2u2cC-M0meCeC@?0ISUE-uEWZMgsN)Meyi z;tRZBubwV*K7 zM1&_QP9xZdg}pxJ80meR9$j!BK~1e(7Aq!hS*=L3uY4YIQ!ne5UPfa#%zL0Pd}(7q zcO`Yi&CC+fh@BPTgBsC4RSJ`B;;ZDOktO6xz2NCTsGZ^Fg6DH{r#8@Sc~8U~zaZDS zbP3r$o8NPQLX^qg!Xk^x^lOoY@#IPXjdhvdQj1FW4OC)VchLBB%=yxwWPGYflo4d& z%+N?T)lFLmK6^Z9@#EZTy5da7-)mfCWg%y+{bMHddjyoQ$n48?mXAd&GZpGcgR!`o z(EF62-Z8>xZ$90UFk2SUbk3&l^g!iv8{pY zniJ^+9*#pv{FB9-K{gL@@19QNvNM+eiO5L#+CP!fsmN8peqG<6)%V%J5uUEU09RUp zNT9UbNN+zOn}TNRcvAe{+z7Ze*i*?<6D?e@ zo!zHB)E-I6dK%$wAT-hoabyESkbL;BQFFH%?n7rr9_(gqQ3h^m|?xwWeM&8J^ z9%-zAv((vQcmz&r1OGoBURc2N!RGP6@VjAi#KiJnI$y0FhAxaUMmm!JEkuiu8(W;B zM+NHLgjq1chYWam<&4%4^nyy&TR@fIuzDV($;%`om*c)wdTeOQXx-~%IM8mqyhJZU zA08L2vy9x>fn->c+4zZ6tg(4r#_f`e>#=~(K1QQe8hvIust3m2njce+^ax{SI;IH< zL4sV&qlla7xTc63xn3Sy_$k9}kFNjs{Vh^V>1Jw)K#%x;%ikgq$(BtOi%fnqItKsI zXCVFgCpQYe1ugy&nJw};5t*bSfqVlP)zgb)8I+p)~ve%0Rs|Gu3^0$GAZEkqZ=|2v>|M=%%xh?wjp7@5JAg0&0Q!vc&3@;r{MCM~N zhfi)c;ogC30l|E{;<^skt+?*R^$4z~aJ_`(=UTtCM3 zGhDyH^?O`@#`Ob_F8iv5d+f!@frFM#5#!*Ug@8+mQ(HA)SAu_su<>;R% z+SWtaUZdzVj{cmY2XXWnik`z!I??Lh%TW@~eVL=TQS@VuUQf}9y~ONtitfhIFH-a{ zj&7jnSsYzQ(Qk0{Xo|kf(UlbaD@T`5G&Pl&?Lkq8qdQS_K1YibUCB{8&F|s|?La${ zqE~Ws7)9^qXoRBAaP%XzkoyOYzDLn;k+Qu((HuwNl`3~OM==vBcNs??r)WP%zeCaU zIZE@Q`*n`O`&aJwIC>>Tf5}nW>T>_Z(K9HT-43NW6?aFz_q)sZevG@0?}xcx;`@Q_ z^L$_Ij+{pHd%AP^zKeSp-)FiT`CfFd=exDMCLhVE zS4NJA@V71LqzsbBP$?nRw8B%?zVx=O{9&`0Dq!T-qEc0^u{#mEs8Y4%Q9tk5VlBvj z@EhSi#wYK*c)`w|IZPtuq~7k{?(K?Gr!rNT_S@8)PK;|9h1+mX4nutLiSC-?k0Mi{ zwt#R2mQG{$TdZ2v$gdrZ-EF@;<{@ny;4Lwv?R+eKHGu!nFGB}hcf+I@MyL8`s7Np3 z07t*u$IsDW%+#N7eTa+j5Rz>bkrV9VqBvbJaf~CpcUg#|UJS#J!Ee-#KzNh71mUm{ z#cvI54%upkL6`|9g-2V2`MgE(Q=$|q!Mv`Gaj+Z(91rC4J_*|o{I+|E! z4rg+Ba?=q_wz{;5%G%7~vrWXOBmEKZ)6zu0K24bC(s!n9^&7>sB#RI87iqxhE8N? zKQ)@6(-=AcJ(=>IuAxZ`ox{*_NN6JMe3Ti+t28b{cQSM;W-QA008^f-)-m)whSuY2 zVU+d+LuX)KBk0EreE}sA^b$j7s|^foW#~M-y=5ScY-AXvl1*#EY)7@dP<@Fh-)HDD zbp=EJWauVHK|HMxQEpLBGn8QH1@$IFBLJmPD)n*9cnws-OX|<6845i+t?<3fp98Y- zi<~V8ci?a)hr4jN8;5&^vPkU<7%E4a+z@24P55@#EkjwUOiJa(EGkS8{k) zsDRWhp&sOFG8Q9jF^EG4hn)z~4~@e>(`B?HoB|AfKalg1Bq2qTgcL~Aat;sXa21C~ zaJYuU<2iIWJc+{!ho^IRCWjXy94KvHh~&JMrM-c}n^?|U%r}AG3w5{E?VRgdEbR^< zl2c^9&wLy42RYY69Eu)91K%=7V2r=U_4*UX-!~@$^H1g+vWS1DL1DxqoitlVAsk_m z_QrAOa5$C2nH=tHktX*<7*hKoS4bTMJ|T6O<-q4%XH7v^v5F|=JZndUmvi_Pgdz0} zYc4RqXUsc@htyvzs{2i0qP!zaHN7=L@_duS??wpoNMr}YR!=kLClM;WFGRJLw!TI5 z$&?>Pb^~Q!i0DN#eIde#-aO1vz|7+wGBHXuEkuQ9Kk&uqdW37ERPH(s`$FrDMLb?Y z>Wt_Oa9b~n-eincS4M9|{914bskcBGQh(<#6nh)-B!?M%u{W5@)797*l~~|#2ZWyX zgePgw(_~+qq^-vLA;Y_I8gU=QY4rVzLm9>YX1tl8)Hp)SS&5s#vjcIj#G2$G)syHq zLu$JOwTP5hYqb!M;{7+ghrIi5c%Q@n;V_&eOp3!+4r%P~zhM-|Cm>w3p*KnPp~&Gh z#?0Yx7li1s$@@)P_YJZVw%R92wqjpSB^hj%$5zXe4}kLE&EvTQ^)f@xX=rO`9@56q z!bxq4zKOJmnx~<6Lkj>ECQ{l)^#RhN>OqD`&KZE7W9SEXOKuLn`TcaBC@*R~*eC;P z!PdIes2|XoK6DCvmI~)72R^hzXtY{Ao8?q@S@T0_EzW^ur=NcLfXqw9JCTZQE+(DhGp;>@R>NySV257qa zNJ9(5P57mnal1>t<>B+u@1EAs5peBhs=hra?Q*p)d`W1Q+MuEJfOb?{G;}VYoz#*A zM7dF29KJF%Tb-w&q_H_PS3SbeCUtrErqIsnbq!sO(sxl8?oIhNsV(7egmzIMXz20q z-J$tv?LtX=JpAp@uIfzreVhBm2pQNjXs zY@bku?B_A&?p!21qxLUCd#U`slGb21;d|rB#R83h>#(TONA7Wwv54=$5@ zry}3}>XhXKZBm;UYC2G$3mIxzA<&Hsou{FD89EV<(YO!V?}hePEh`0j#(qC^fSSk9 zCiRkiQ)sCwtr9N30kll@94gQo_IkBkoygEe^{)M|&~jBcOw#^^v=!>`BZOx?ZXJptWkXhTe(HHBL}>3dD1cs~+>AJq=gAttnM>Ut^tGdZI`ckIpnsQrBo`cyy_8 zvU){BBcm&gQ&ef4C+A$_G_}Nsjxj3g6dyX-sH)8ZMN84o8ynOs0;##t1<=*aCrNqp zqi4Zl^EU>dmnY5h0IfJ#(jGDAs58`;H59c8dPGBeMxP3uq4>Bs@+|~(rdoQ6-o?$PJH~mcr6SO`!Sj6en1+53?FaNL4ZR5H0`)hBHmVn+j~HK4mwt}& zZB)OF&cUxXzpf#&C>N=5RY}_=_I~JMwY!EE#GVRWqFQLH6Zsa$eqdaxR%>WQ>?uGu zYv|}$le$u^K3ynJiM?c8skUh7ETmnnPT44F*T%LQSF77JbW`ki#x*Jl1yc#%i2d2P zPDRfY=>FIT#trHNhBm41#X{zdYQq;OZIgOF7Bj!D?%5=iTVqY;Eo#eI0=*S$H*ZsY zXAAV#*j(cdwOK>|2J}sJ$T^Z0i#Mq|)twA&Qdx$^ol9w()Fg)9{Gve9;$zG^)n4Zb zG$%gU{Fa(`K0zDR3cNIZpE^-PN5yL4&F`ptE)Xu4#g~{5 zsJ9u~s5ZwBG9OZJUno4k5kJg)ST$WN(0%cv&F`suH1rT8`@VYR5=r|}e6I0*^}%HV z{S;}Bs=^fnZBnl>wB;&>(Cc;xJ*sA1EtE483)Exka1HI8IN5w$ZPw79iPOy=s-A0v za=*kE%qP_0*9vra!Zd!QR(wUEwTbi0r`01Gsw6HppHYupCuwISt}=hD`Zf!6QDU?C zoVxTTfv!w6sTWk?>jHh1p*uBn2Sa<^ENS0mXx1$PJJ&Jne)hinMTJj3xWi^7fSU~yBw7(~R zX1=cOc~GE_lD{*5r?&g9K%vxI<{PT;kU-(ob65>09~LN{+G_qmt=3R8(*CGce_ztt zQ!4b9dhk(!#-wO>2VDk#8&v_6Z>tM6v^}7ARL>76ZIjv=lz&nmJV}sv@PAUBKO*P{ zp)-dQXVul}YU(a=$;kIcWTw|%HzeW0SxQaeoA= zm#1jIZr=vl`P>qs`0kHO z%o^s_2=V_W!jLi=DHNU!h#OjlZN-VRq3I8^>X%3~9%m}otK-+XERirMk6>M6zt zIZI807@<6fwKO>H={(3e$p1a&k70?jgfrY_#4(9NGlcgvESzCXG{#Vkeq3lgX@$Rp z4}yuI9%4Ndp)tI<$hlSpLZJ+{*ZbUOx>y_3LuiMBLZUPR@epA}CGl z<`BJTRl=ZD+lsG6E(1G0wGuC2IX`51h;vBQLX^v?qT8T`YkW)|DHiKCtfXEft)X7x zywZ+BPjOTI(#K1^O!Zm-Lv=LOI{{3v=Sy7plitiaqfB&F3vs?f>)C)*e`_+3>uEeH zwbW0z)0LX#Lluq8%r1&c8H66c`pM-A|J`_ON-5G~B`&!rZeZuvlf+O5BCn}dF^3Nf0}|fRNTJZ*Vp4pE zP!Lb?_nGn|ga-E9YpEV3@i&-{a1-l6_S0ZnYHB?MF;b$0+rr0(HDbSKl`4cxYmK@g z6|+uIcc&T@*>Pq!UV++^f0p_zBWtF0jGlxT&@=uVHYTb)k<5dr}CuAm!WfPyd_A-`y8S_bp zs21ta9~)1y(;?za@lEzz^3wHjymusOD2}YP36ralL`76B z(WGp5?X_1+iVur5Un`C+ZPqULa^{kpXkMO&M6O~$3AShqBu$+lZPHDFG!2jq(A_2} zk|KWu$pT#zSZq-Q4N?>ZwgI{=(l$VYVo{{%BmMop?;hSe!%N%UphW`=iMjWlbH4MP z?|kob?%@zua%L<+9*!k$o;A+31ZVfIdHpOY**JUEc^B)p=W)Gv_A|~bdSNb!pF8_i z=as~d=YHMce81^jG~YZsXI3!E?*a0B?wtF%V07}3l(fw^%=OW~<-TiP9VO=Tx$nBO zra1ba++p*<@F%nHn*Grn^rSM9O@9M0Z=>enXe~R88U5{KCGlTIe<4dA{$QqplX<_A z9YcK^JD3H$)pPNN?lP`ZcuwK}J-&tKRs3%P*KFcj-Ca|Z>(5KgFW@biYkmnQNL=$( zaNIS2C^g@enm>}7KgPQ**Zhh3OBO8i?~pTTa2YsM2CYcBbBldkz$tj$v9=abD;3P-U?;V()3SCfSN2Usb( z=2x+{13gmnU8(sasrh5{1wBbp^}Qsi`cv$KfS%;9r05#I4iAz}{Uco6)Ni0>I7K{X zQ^fpK>L>9A`?UFb_U|YEMe=PYVg5Qi(0ZvzB?B`J0)qWPUO8%b8!#{AT7GnQvwOAoHEff5`mT%zw|E z8p;oi4NVT+7oga68+W9%>?>S#{e#`kC=UdJnINx#po%22Czd6J1m^{Cay&bb4%{nabSF0Eoo!e$*p;2pk zEg)1pESjy3*YVA~fS`M8&+nKuzuNK3ptV->>!2CvF^;+G)%P&250bo2qh%JC=gp?q zYWpqJ1y5$F)oQfbX6c~hH-+Y9uj5sv)~tDzx|uGq?}JLcj4$wLn-Y*?ex`(ZRV#Jh zJoKuj?jLl_(#En`TUp<}{pRxW(%tRVrS;c~cg))S{l1!=?ykWH6KQq$unJ;!D^;I& z6p1`w#>xh!+w#4dY3r@heiPIOb<35ySFL=>Hw)E9+c$T8uWUAb{{d#)(Q_pR%-JTs zc5o-mI%ri43;W&r0}2bIuNuFx3pSgYcThC-1|LBT1>C`$O`}>~YE;|ij@RDrcso@e zB$56ORiSN~cp@V@RZL>KBrIF0S2~8HE$o~5av9e^Kr{AX7NYV?4^}H3NC;{ISXC`Z zFVLmi{ysQgG%R9@n21bq$KNwPB(hsM@XOk#M1|7FY9+uUbwIDxb?l}!P2H>cW>1u{ zL*n0{WXpcl*J%qjyaj1S3r#6n77piKCnAW|P%$#)j##eh2#;#VtRt#ICCX;pUv+zB*OE5NWiI0tk^NWI*x)egnc0F~U=ya)a= z1v?MXuzAw&JU)@aayzYJbo4CLY<5~k7%jvrF411#RN5&M&>s3uG9xSU?0TZo76Oc zJ5o77cbn*ifPjI7iQ>>!TZn-{s99Z|RhKUgY2%^as(MZJPEZR*Ec&U{ zS-KzqY8lT*4~;7N0DGr>#I!Z9^#G0pmQqHwnXgvY=~!4cEA1jQTd8HVj$e$#;z%K4(Mcqx zz-KdH0x}4lM^6ko%J;4P%C2^3ckrD)U@C>V&+x){0!yfoK!zQJzm1lehXY-ym#SSF zz>zDWl2xllz;|1X8bSqY{2+SKp#;$_@DF1!Nq+Uh@FAHQla2$92a<^Xg z;LO+`Inh3NL{Gof@tbsYumN=l?5;5aV?*B%*MdH4UZ=EgZm7^sf;UbyB;DR8AqmzcWdUC1z0e*!cTAcHIn^ADc%MpY3o>L3dO z48CZtrgtcXIJcly#9X`GKoHhPfrWyKi$qm0)wX&zL4WiJwm^$Sse&Xzk{a6E!dq7f<+$Uq2(!n6Fws~>p~YW_l8Z%@eF}4Gq*$7^;&hZHAv?d zD;_d2+7(TIr@ObuaHk`7VejzG92W%nDnRB{fg&Pr+?Hgof;Ym&Rt0H~2bT`MAsa)u zZL|)>HUfVmo)&97UmjNKyAAQ(SYqs!t{h>NoK~NSE;sdnaRnT-`Q`JXAb`I z41Q)`zA?*)#|Z+W-hRVJdaCq_{5&KD9do+@zGIQW8B#|O%9da$!P*gwj+6wZ+iKAh zFdT5@Vpd=P%|=^NP<;%<$QJRNUh6P|BwE>N9m>FO38RRfM8e&3ggvu2YxZt3w};hH zq3HMJp#s;|dSDeyG+tY7cPrI09Kn1OF%;H{Ud(>(`ZbWt^#*~Ri6;a&6#a%C`t4+s57RzOqP zKsMbPvv%PSDm3*uT3g?R`?` zi$>3NMWrpNAsOdmB~e9~SjNsk%Wv`qqg|^RjLtqZ6#_*L8fdEj zDQIe+_DWsgKrGGVGt2|2eL!^3aL2Dg9FVfkZMouC%Xhqb8KPp8sK|DKS{+pkQ{^`R zJ-2{UJSBXdH+Qi=IfZ@WCf1k*?ApF!uH$~w%;0&J|8?^G4SdgwhhA780?I=_-y}wE z;7k%iYEYjza|4?OEK6(V25_^kic>~)>6thewoe2003UNTtSg{L7j;d!7SOK^I@r4a zxW}O9Jv{js0}E1o*jh#zz8GWjS~lj&4gCF4L1xy)*kwG|0o}p90nEN&OE?OZ_%i-h z8w-0Fn~wv41suaurWEjpeL6KP;_);M_7qW9z&{FnY&L)h;SjKOkn|pENLsYE4Q!U+ z0thpG9ZUudin#7}xev8lnRGsIfyuP|m!Cxw4KTDw%!ZGnI#eRN<=VJ81I(6H-~gOhY=O zoSqjdqmZ5`Qv*usp${b%%4J!gNdxf}z)^CK&(Gtz0qS7PI2Xq8sAla*U+MzBbU5G^ zd$+-DtYt9H0ZQ<%c*0@0NS_ty6Qzy@SOXN*p7g0sQB`*V8`2X;!Cw(Gbc^_Bw8zXCZ#XS*fv;aHq2whDzul#GXGYGBCQ`+Yr1;70>E zX|&YPU3_@2V!WnJ?g7P{JLC&c~(EPFg1di}y-HEm4vPe8? zFFFI-j)nE`bR3Rcr8_AB14oNuw;J2)Ak_g`8Bd$U1~&W9S2@8}YJrtKdD{i;h;68& zU64=YADwekcv(5p82T=Ac_H9fzq_;C0L(q|g`C*~Y!$tBAW2#r$88ChICJ%S55y-f z8QKZ?avee8)A*O@bigL$!i+fGlu}xx3b{P;H&t%xsoLNWPmf%}N zDLS%wn%Fkr8Q+uc5+FA(Uz;pr769@l{2PqQ2_Wz{E5l?l;lqtjJdzqx;8VnVe|iUXbX8%|6sb zJwIFMcW7t&OKqS(it_IbsYB{=LG^)hP}>Z(hWUhd zptYI{gk$m)N>F1Ovy&V61Hl>e!2PtP6n&l!pQBG^Omic~HkCc+C=^yKHUGEoiHcIh z)KH~Bo_?6D$aN;1>{o{F;+2j((~ozd5sFX!Dxa;S%;&V_`@KF4WT`1BIc3hPmRkLv zRSAt~?JRt(NbK2@M>J=mdTy?q3>m_iE8(;C-n6FPzP-4jJ)&^EP|=p?vq@cs-ChlH zf~zKxnMNG9HcAgb-DKoSTwaC^Xy(N-6LxY+wV71Fj<0+eOdT?$?=cxtV9r~+W7cNv z-8>&+D3~7rTz`%i<}{+sH~vqwIB||qA)JHIfx0k@hlZUd@c@yB^|WJ*7r6mgxhSW3jc3|EL%3OPSN!!(2-9JjJP=I;t^*)+oePNf+2* zy-SR)1^9Z+wnJTI*2l3md%~Mxlu3i?GjWCbg{>0Igz=oY16LMyW?z7f@b?|5VFY>{ z)X-LIpn^0hPTqHbAy(U;{Mx-9_L8Z0g&?Y=GLItAgpdd=OD$5C$=I$;iy?g)I5ttE zYkUfbBrmzQ>FeFkP9u7GGp34ae1^a9Q&$OdoSa1#7$0=SzFDBY{OsX`;X^Ua$ zEI2cYK^1EXs&x&|%HVKx;Q#!e7k|8(0rNGg^}5hNKG1zp&1|x-u13-{IBUDG(KKBJ z$T^X#R2ifKpN)s2igJ0*d6N@N!gytEP54U+q4wC_`S9fyWkN-QtHBoxf4twsInGj@ z4&ApTZs#Y#d%Fi@_lC^5$zU!eB#A-#h?G_nIy2F`P@&`0C94?zY;SA0YZF}pvJaOr z>MEwe2k!Nl8@+wGtwX)0n;@5TNqyAs0=IjbFiY}u54`U{!^2U`r+Tr4lzc?Lr4@`y z{bRDl(R6HeHmv6kRu^rwo^ZTA>RwtBIPInS!DXo0(22dyQHK~fKNH9bPWnu=&X!)& zR556~r6mN;ACSwJ zI?U`z)}lJDJnI5`+uGMFaT>4gUNwbd#K9yk&<0NaHRqPFm#Q|R7J~iLAYJ1Ei1v1J z@7@;MuYhkNgA_-s?FHpg>*J_hvX{CMM=_!LH`iEa7poeg;(8`Vq6-j6{}rp#YJ2o& zv@P9@wc&dWb?V<4FSbPc&FAB2unQ2YQ=VuyIbRbSp}lHQWx!>^a2$*IoYKU-X36ZGmnj+)tem^6l;_>#Zf&7F%W;-9!}w zsm*9f>($+EqP-nykJe(kPm`*c2}*s8xB_<()8jlb^@;>`^W-baspuy2G_rRRr6lWS z$H``GC#%r5r0_c3=+td}begt3T1PnJD9J`_9xSUsZO2TGw`m_p zqYt&3+Y!vJ`=A0L9v{ifD-Bt}S%SrAM$8daPS(+uutiN}4(Xw;gMv|u!75J}M?#A_ zYIB0Qk8o??06s*$h&iWaovX^!JU@@oaFQb8^7p`PU48V=1(c+se(f=~V=QGM9jLu* zYqP*avt;nNAv{(Z5Y1i)VKkHIeJykwz4ilc6oYUSdekf;X&jxL6)2pDldbX+UgL47 zU&@O*#^S5MEl_J;kx~m)2Wj|xK|+nuxoBu4&-jw)0k%ABKEgHHNug6H8;NQbC>6;v zSJ6$7FJNQ$9gIZXFd6EF+7UOKn3GKjN9gP-_z2Vpp;!ts`YS9`<`uD&DDH}EJxH$< zWGNDew#RvPOAS|rkQ%n!sTFZA@67rBHoj;yqs%{V$!5l$P@j;k`CGuzzqU-AKVC;Z zNaiHl+_#{swL+29`&){!PhZ&94X$u94CG)eKHW%$$dja|s zjvMAKe4WE}w|S1-?2VE(4G33g>QOZ3v&l}sFYl-61(UdNS@eY7P1l$2;eH7j6r&ur zbAzZ7dU-R#sAh8rKwwvhO9FivPCj7`HA)JU^LoI;yuy_nSKz%Hq2Y?GABS2eEc@Ig zv7o3=G!wM#-pEYNQr?-dEyzoKE46zgO=5jddN&U=7FDJ~WtYn#caBowi38So)(DgvlymLR4^E9t!#gp?jGk3mq zsn8!qwgYXoF+{UU^ODVYEGK&TNa#@0m8*{>!+HoWqPAu|h-TSn#UY97xE=&oWE9Q; zXhq%FNk?eRx!x9u(ih_*uZ~8I$4Eic4x=Ws0KVQxd@P=v5QhW*&z*H1)gu%z%Iol3 z;PmnRcC-eRsMMI%-vxh|vnIr&SssanNmd@U=qcoK(sE8CL%7QY%<|feI;An8XW#v4 z%Z+yAWe@TjIhepc%pIu7%y~js`W)2Yv?SZ?A zS;KV;u`e50S#i8IkC{D>Uwk zb!0`RnSFdt7VhG5H!U1FeopwKBaFZZtuOJz*K0P5v!mG>BKWj6rX#Pm&<%NW~BY1a#h`=W>S8fsqU%sZAau4 z>ZigC*0x(|9LGi-3N(G5bD%`&Q`EES4DGQ=JEML*CubQ;%&dJa&ivo5;%ugIT(2RQ zS3j)Bhtp#=`gM(#z;%0QUA=EiKLX!`9tfnhl3&X0Bh7w=t>g#20^cp!gAZZG9n}ZT z&UnDeq>#m}^~*by5p%ZVFP_!Ma}?6TeGW#dI`SZJ?K5$d#_>GP`pkB`^%sDfW08ZJ zNuDHcrHI-Wi~lA1y{fzqIPSwaSAAEY`prEh<{*6W|8cD1BkVlEtdhs+VzTB5^}f0u z?9YeI1s-zYpR2mC+;SwaJM@?hfpH+%t z+dysfSn5eIQBK9e+|U^vKf)RdJ$4EC;Ylsi@huaVuwN!b2>v z_%NETSYlg2|7-F6&~huj1*5%o(r7}-3H^ZahvP9q?)EtFNmNe7_XN&sC$@ay#FlqX zY#r}0zeme4e9MSS%&NE^H5dB(S$Zmn7>LMM``g1g_24-Zu63}Io#px` zd<|xISad~OMT_opa7RejzX@Z^zyGISUi|&v_=l^%_M?}+RxN$;iE;n&m)?GB?8QHP zA77>JPUKQJ2bdgklS8@GP<}YguP;jD*QACfGN>6%4kd>Q$pjuUg+wBM7VvJSkj%Mm z8f6!|HRzj4o?;(-8z(kD(G_4r`SU=L;&<8+Fekl7(L0$gnEbF)NGDwUq)B5s$qPW) zbrK)^L;C#qP$89Yb8ec5(-~fdc)>URnY7Cbw)pVhws|?t%P=ozc*)@c3gXfis-7D>P4H0CFe^ zC{P2Yuvo|!AZ&Mh95Y`O+Vwhz@*NRSFeMZ~Oa4Xag*)0;<#{Ym*iFLba%Aa!(2~Ri zjLapOFQ%tZ#wgH-^q=7eFjw%ohR=&KB(M1^WOM!+u8@!D(A=p)CXt`Z&w;Hn)SU8Q zEqyC7_dekyI{U2tXI}i)cvZ^^V(I>I_sgzj!u3b~ax)i~h;{ zD%dqgGRU(8izq;7!5|{M1m_CQZBo?0pFBfVydlWJY*ebO6ZvsMPzwnT!J$OVLNKcN z&kymhTyeqwQY4ON@cAM>WdVE!98F^8AS7`%KczQlFH7TuI4ev!n>!1br;_|iNTUK1 z7ABKv;DzcXlR5f;9Ev#>b2(9j+~_=NPoW}_8;51)&O0M$!Vd<`<)6v#=a=$L7ww=S z5@Dng6L@f(w2Ql79fvt5Pn{a|VF>O-22ciqspKmF%V@Cn+Nj2^ts^v}za%2L*N#w5sGd z$73&d$Vujh;qriRSO`yI#(*)_l*ZV^%LMHwMWb`a9S5cl<00JPu#;f{zlZtv=+ZzG zm`|RG!n0uVPktl==1z=1<-qFrJNo3Wu>%?=#!rzPML>dJxg2#8)w%o>97lc%lqbR6 zKsuZV$r*P~WAI71ghLl&gQ}VQjC;yS^G@tUQ*_`A`NP6}SAftYY)P_@m_LTaon3>O z5KyMXIv5eDV%;S13h#3{jGnacSx71DPzc~Cx>O1h$=?v?_2m7O3w%%BcM)n}K2P4y zopOe7gDl+?W(b{x-j0tuXYrWKUj#~g-2BV@O=4`B6+@3wo}U~AN5%IEm7EOt2C@kJ z-iYIhd&i`tEM}7xfqXFL4CkNxgbXmL13?JrlRt#Ur9cjhav}#+0!0|mNl$=@6DgG3 z9K{4T!P^};LEMUPVqox07O_*lLcws>_mgDbef_1T6oW#MoJW0<`U|lLFsvm-2&g3* zU7BZ7#C8P?r|Se%E`Lp~SIDOnDTOA}aHTUnp%S&217GJzBz^csnbpxmXU*5My!v*TgtSd>if-^T88!AW0R4A(BhUVaHMBfHJtl&JYwP&{ZONJ9u^i4++bF8>25v z=AF}+B7!s`G@>lJi^UXkFf%8eW5+2ltNdUVDa?ZIWhMv5CmsWG0#JVPDQ6g+ z#;Kh&Yx%`UNB|Vw3^Sk60~a1QUm1P!TS$BI6GKRkm?0UnIj?s<*ZExF)A64#M&Pt{ zd!f-eSf-)uSwv~pItG9Ie8jf1{@f0V8DR^2L>D%aA3fJ0S5*g7;s>~ zfdK~w9Qc370shB%W1cbQN$;2mSq0C;)D!LwKKH+vFyBswy}q4%5rwz#hG!dBehJbR z-n8+ngSK&B$2&Lve+OfJJN=*kmtA8^MR3921j-MV;lT<#sK9Me>fXW|pBC^`@RkbS z?uYkFJQL2JNyA=6wDJrFzqp5|S@c|t0GMA*Uk9xT&=kJ^KaR;2m>HaZ)87~I_6R&M z^$7VzYTp61{w82n#>BMR(0!f9aQ*EaEIO6XZdNxuk- zFui{X9;G{kQx5Z#lAbJ+(=NbQz~?ogV?$=8f5kvL>^w-7awLu(<>4m!hTk0!&Oq_M zD17OK>E}+!7xKuMm!;1<_@`%!cuI$V2m4X|&~@-L;J|#{Ke# I#B<<(0|q2NbN~PV literal 0 HcmV?d00001 diff --git a/Parser.frame b/Parser.frame new file mode 100644 index 0000000..1ba73a3 --- /dev/null +++ b/Parser.frame @@ -0,0 +1,156 @@ +/*---------------------------------------------------------------------- +Compiler Generator Coco/R, +Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz +extended by M. Loeberbauer & A. Woess, Univ. of Linz +with improvements by Pat Terry, Rhodes University + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +As an exception, it is allowed to write an extension of Coco/R that is +used as a plugin in non-free software. + +If not otherwise stated, any source code generated by Coco/R (other than +Coco/R itself) does not fall under the GNU General Public License. +----------------------------------------------------------------------*/ +-->begin +using System; + +-->namespace + +public class Parser { +-->constants + const bool T = true; + const bool x = false; + const int minErrDist = 2; + + public Scanner scanner; + public Errors errors; + + public Token t; // last recognized token + public Token la; // lookahead token + int errDist = minErrDist; + +-->declarations + + public Parser(Scanner scanner) { + this.scanner = scanner; + errors = new Errors(); + } + + void SynErr (int n) { + if (errDist >= minErrDist) errors.SynErr(la.line, la.col, n); + errDist = 0; + } + + public void SemErr (string msg) { + if (errDist >= minErrDist) errors.SemErr(t.line, t.col, msg); + errDist = 0; + } + + void Get () { + for (;;) { + t = la; + la = scanner.Scan(); + if (la.kind <= maxT) { ++errDist; break; } +-->pragmas + la = t; + } + } + + void Expect (int n) { + if (la.kind==n) Get(); else { SynErr(n); } + } + + bool StartOf (int s) { + return set[s, la.kind]; + } + + void ExpectWeak (int n, int follow) { + if (la.kind == n) Get(); + else { + SynErr(n); + while (!StartOf(follow)) Get(); + } + } + + + bool WeakSeparator(int n, int syFol, int repFol) { + int kind = la.kind; + if (kind == n) {Get(); return true;} + else if (StartOf(repFol)) {return false;} + else { + SynErr(n); + while (!(set[syFol, kind] || set[repFol, kind] || set[0, kind])) { + Get(); + kind = la.kind; + } + return StartOf(syFol); + } + } + + +-->productions + + public void Parse() { + la = new Token(); + la.val = ""; + Get(); +-->parseRoot + } + + static readonly bool[,] set = { +-->initialization + }; +} // end Parser + + +public class Errors { + public int count = 0; // number of errors detected + public System.IO.TextWriter errorStream = Console.Out; // error messages go to this stream + public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text + + public virtual void SynErr (int line, int col, int n) { + string s; + switch (n) { +-->errors + default: s = "error " + n; break; + } + errorStream.WriteLine(errMsgFormat, line, col, s); + count++; + } + + public virtual void SemErr (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); + count++; + } + + public virtual void SemErr (string s) { + errorStream.WriteLine(s); + count++; + } + + public virtual void Warning (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); + } + + public virtual void Warning(string s) { + errorStream.WriteLine(s); + } +} // Errors + + +public class FatalError: Exception { + public FatalError(string m): base(m) {} +} diff --git a/PingPong.sln b/PingPong.sln new file mode 100644 index 0000000..285ff96 --- /dev/null +++ b/PingPong.sln @@ -0,0 +1,66 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PingPong", "PingPong\PingPong.csproj", "{D5DF4388-106F-40F7-B54C-72E71376AB43}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PingPong.GameEngine", "PingPong.GameEngine\PingPong.GameEngine.csproj", "{9C0A0C83-B112-4959-BD94-D6A22AD5AC90}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PingPong.Generic", "PingPong.Generic\PingPong.Generic.csproj", "{630BDE02-B1C2-4D9F-8BFB-4FCAF128BE14}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {630BDE02-B1C2-4D9F-8BFB-4FCAF128BE14}.Debug|x86.ActiveCfg = Debug|Any CPU + {630BDE02-B1C2-4D9F-8BFB-4FCAF128BE14}.Debug|x86.Build.0 = Debug|Any CPU + {630BDE02-B1C2-4D9F-8BFB-4FCAF128BE14}.Release|x86.ActiveCfg = Release|Any CPU + {630BDE02-B1C2-4D9F-8BFB-4FCAF128BE14}.Release|x86.Build.0 = Release|Any CPU + {9C0A0C83-B112-4959-BD94-D6A22AD5AC90}.Debug|x86.ActiveCfg = Debug|Any CPU + {9C0A0C83-B112-4959-BD94-D6A22AD5AC90}.Debug|x86.Build.0 = Debug|Any CPU + {9C0A0C83-B112-4959-BD94-D6A22AD5AC90}.Release|x86.ActiveCfg = Release|Any CPU + {9C0A0C83-B112-4959-BD94-D6A22AD5AC90}.Release|x86.Build.0 = Release|Any CPU + {D5DF4388-106F-40F7-B54C-72E71376AB43}.Debug|x86.ActiveCfg = Debug|x86 + {D5DF4388-106F-40F7-B54C-72E71376AB43}.Debug|x86.Build.0 = Debug|x86 + {D5DF4388-106F-40F7-B54C-72E71376AB43}.Release|x86.ActiveCfg = Release|x86 + {D5DF4388-106F-40F7-B54C-72E71376AB43}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(MonoDevelopProperties) = preSolution + StartupItem = PingPong\PingPong.csproj + Policies = $0 + $0.DotNetNamingPolicy = $1 + $1.DirectoryNamespaceAssociation = PrefixedHierarchical + $1.ResourceNamePolicy = FileFormatDefault + $0.TextStylePolicy = $2 + $2.inheritsSet = null + $2.scope = text/x-csharp + $0.CSharpFormattingPolicy = $3 + $3.IndentSwitchBody = True + $3.AnonymousMethodBraceStyle = NextLine + $3.PropertyBraceStyle = NextLine + $3.PropertyGetBraceStyle = NextLine + $3.PropertySetBraceStyle = NextLine + $3.EventBraceStyle = NextLine + $3.EventAddBraceStyle = NextLine + $3.EventRemoveBraceStyle = NextLine + $3.StatementBraceStyle = NextLine + $3.ElseNewLinePlacement = NewLine + $3.CatchNewLinePlacement = NewLine + $3.FinallyNewLinePlacement = NewLine + $3.ArrayInitializerBraceStyle = NextLine + $3.BeforeMethodDeclarationParentheses = False + $3.BeforeMethodCallParentheses = False + $3.AfterMethodCallParameterComma = False + $3.BeforeConstructorDeclarationParentheses = False + $3.BeforeDelegateDeclarationParentheses = False + $3.NewParentheses = False + $3.SpacesBeforeBrackets = False + $3.BlankLinesBeforeFirstDeclaration = 1 + $3.BlankLinesBetweenFields = 1 + $3.BlankLinesBetweenEventFields = 1 + $3.inheritsSet = Mono + $3.inheritsScope = text/x-csharp + $3.scope = text/x-csharp + EndGlobalSection +EndGlobal diff --git a/PingPong.userprefs b/PingPong.userprefs new file mode 100644 index 0000000..3e8cf60 --- /dev/null +++ b/PingPong.userprefs @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Scanner.frame b/Scanner.frame new file mode 100644 index 0000000..abac75d --- /dev/null +++ b/Scanner.frame @@ -0,0 +1,381 @@ +/*---------------------------------------------------------------------- +Compiler Generator Coco/R, +Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz +extended by M. Loeberbauer & A. Woess, Univ. of Linz +with improvements by Pat Terry, Rhodes University + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +As an exception, it is allowed to write an extension of Coco/R that is +used as a plugin in non-free software. + +If not otherwise stated, any source code generated by Coco/R (other than +Coco/R itself) does not fall under the GNU General Public License. +-----------------------------------------------------------------------*/ +-->begin +using System; +using System.IO; +using System.Collections; + +-->namespace + +public class Token { + public int kind; // token kind + public int pos; // token position in bytes in the source text (starting at 0) + public int charPos; // token position in characters in the source text (starting at 0) + public int col; // token column (starting at 1) + public int line; // token line (starting at 1) + public string val; // token value + public Token next; // ML 2005-03-11 Tokens are kept in linked list +} + +//----------------------------------------------------------------------------------- +// Buffer +//----------------------------------------------------------------------------------- +public class Buffer { + // This Buffer supports the following cases: + // 1) seekable stream (file) + // a) whole stream in buffer + // b) part of stream in buffer + // 2) non seekable stream (network, console) + + public const int EOF = char.MaxValue + 1; + const int MIN_BUFFER_LENGTH = 1024; // 1KB + const int MAX_BUFFER_LENGTH = MIN_BUFFER_LENGTH * 64; // 64KB + byte[] buf; // input buffer + int bufStart; // position of first byte in buffer relative to input stream + int bufLen; // length of buffer + int fileLen; // length of input stream (may change if the stream is no file) + int bufPos; // current position in buffer + Stream stream; // input stream (seekable) + bool isUserStream; // was the stream opened by the user? + + public Buffer (Stream s, bool isUserStream) { + stream = s; this.isUserStream = isUserStream; + + if (stream.CanSeek) { + fileLen = (int) stream.Length; + bufLen = Math.Min(fileLen, MAX_BUFFER_LENGTH); + bufStart = Int32.MaxValue; // nothing in the buffer so far + } else { + fileLen = bufLen = bufStart = 0; + } + + buf = new byte[(bufLen>0) ? bufLen : MIN_BUFFER_LENGTH]; + if (fileLen > 0) Pos = 0; // setup buffer to position 0 (start) + else bufPos = 0; // index 0 is already after the file, thus Pos = 0 is invalid + if (bufLen == fileLen && stream.CanSeek) Close(); + } + + protected Buffer(Buffer b) { // called in UTF8Buffer constructor + buf = b.buf; + bufStart = b.bufStart; + bufLen = b.bufLen; + fileLen = b.fileLen; + bufPos = b.bufPos; + stream = b.stream; + // keep destructor from closing the stream + b.stream = null; + isUserStream = b.isUserStream; + } + + ~Buffer() { Close(); } + + protected void Close() { + if (!isUserStream && stream != null) { + stream.Close(); + stream = null; + } + } + + public virtual int Read () { + if (bufPos < bufLen) { + return buf[bufPos++]; + } else if (Pos < fileLen) { + Pos = Pos; // shift buffer start to Pos + return buf[bufPos++]; + } else if (stream != null && !stream.CanSeek && ReadNextStreamChunk() > 0) { + return buf[bufPos++]; + } else { + return EOF; + } + } + + public int Peek () { + int curPos = Pos; + int ch = Read(); + Pos = curPos; + return ch; + } + + // beg .. begin, zero-based, inclusive, in byte + // end .. end, zero-based, exclusive, in byte + public string GetString (int beg, int end) { + int len = 0; + char[] buf = new char[end - beg]; + int oldPos = Pos; + Pos = beg; + while (Pos < end) buf[len++] = (char) Read(); + Pos = oldPos; + return new String(buf, 0, len); + } + + public int Pos { + get { return bufPos + bufStart; } + set { + if (value >= fileLen && stream != null && !stream.CanSeek) { + // Wanted position is after buffer and the stream + // is not seek-able e.g. network or console, + // thus we have to read the stream manually till + // the wanted position is in sight. + while (value >= fileLen && ReadNextStreamChunk() > 0); + } + + if (value < 0 || value > fileLen) { + throw new FatalError("buffer out of bounds access, position: " + value); + } + + if (value >= bufStart && value < bufStart + bufLen) { // already in buffer + bufPos = value - bufStart; + } else if (stream != null) { // must be swapped in + stream.Seek(value, SeekOrigin.Begin); + bufLen = stream.Read(buf, 0, buf.Length); + bufStart = value; bufPos = 0; + } else { + // set the position to the end of the file, Pos will return fileLen. + bufPos = fileLen - bufStart; + } + } + } + + // Read the next chunk of bytes from the stream, increases the buffer + // if needed and updates the fields fileLen and bufLen. + // Returns the number of bytes read. + private int ReadNextStreamChunk() { + int free = buf.Length - bufLen; + if (free == 0) { + // in the case of a growing input stream + // we can neither seek in the stream, nor can we + // foresee the maximum length, thus we must adapt + // the buffer size on demand. + byte[] newBuf = new byte[bufLen * 2]; + Array.Copy(buf, newBuf, bufLen); + buf = newBuf; + free = bufLen; + } + int read = stream.Read(buf, bufLen, free); + if (read > 0) { + fileLen = bufLen = (bufLen + read); + return read; + } + // end of stream reached + return 0; + } +} + +//----------------------------------------------------------------------------------- +// UTF8Buffer +//----------------------------------------------------------------------------------- +public class UTF8Buffer: Buffer { + public UTF8Buffer(Buffer b): base(b) {} + + public override int Read() { + int ch; + do { + ch = base.Read(); + // until we find a utf8 start (0xxxxxxx or 11xxxxxx) + } while ((ch >= 128) && ((ch & 0xC0) != 0xC0) && (ch != EOF)); + if (ch < 128 || ch == EOF) { + // nothing to do, first 127 chars are the same in ascii and utf8 + // 0xxxxxxx or end of file character + } else if ((ch & 0xF0) == 0xF0) { + // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x07; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; ch = base.Read(); + int c4 = ch & 0x3F; + ch = (((((c1 << 6) | c2) << 6) | c3) << 6) | c4; + } else if ((ch & 0xE0) == 0xE0) { + // 1110xxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x0F; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; + ch = (((c1 << 6) | c2) << 6) | c3; + } else if ((ch & 0xC0) == 0xC0) { + // 110xxxxx 10xxxxxx + int c1 = ch & 0x1F; ch = base.Read(); + int c2 = ch & 0x3F; + ch = (c1 << 6) | c2; + } + return ch; + } +} + +//----------------------------------------------------------------------------------- +// Scanner +//----------------------------------------------------------------------------------- +public class Scanner { + const char EOL = '\n'; + const int eofSym = 0; /* pdt */ +-->declarations + + public Buffer buffer; // scanner buffer + + Token t; // current token + int ch; // current input character + int pos; // byte position of current character + int charPos; // position by unicode characters starting with 0 + int col; // column number of current character + int line; // line number of current character + int oldEols; // EOLs that appeared in a comment; + static readonly Hashtable start; // maps first token character to start state + + Token tokens; // list of tokens already peeked (first token is a dummy) + Token pt; // current peek token + + char[] tval = new char[128]; // text of current token + int tlen; // length of current token + + static Scanner() { + start = new Hashtable(128); +-->initialization + } + + public Scanner (string fileName) { + try { + Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + buffer = new Buffer(stream, false); + Init(); + } catch (IOException) { + throw new FatalError("Cannot open file " + fileName); + } + } + + public Scanner (Stream s) { + buffer = new Buffer(s, true); + Init(); + } + + void Init() { + pos = -1; line = 1; col = 0; charPos = -1; + oldEols = 0; + NextCh(); + if (ch == 0xEF) { // check optional byte order mark for UTF-8 + NextCh(); int ch1 = ch; + NextCh(); int ch2 = ch; + if (ch1 != 0xBB || ch2 != 0xBF) { + throw new FatalError(String.Format("illegal byte order mark: EF {0,2:X} {1,2:X}", ch1, ch2)); + } + buffer = new UTF8Buffer(buffer); col = 0; charPos = -1; + NextCh(); + } + pt = tokens = new Token(); // first token is a dummy + } + + void NextCh() { + if (oldEols > 0) { ch = EOL; oldEols--; } + else { + pos = buffer.Pos; + // buffer reads unicode chars, if UTF8 has been detected + ch = buffer.Read(); col++; charPos++; + // replace isolated '\r' by '\n' in order to make + // eol handling uniform across Windows, Unix and Mac + if (ch == '\r' && buffer.Peek() != '\n') ch = EOL; + if (ch == EOL) { line++; col = 0; } + } +-->casing1 + } + + void AddCh() { + if (tlen >= tval.Length) { + char[] newBuf = new char[2 * tval.Length]; + Array.Copy(tval, 0, newBuf, 0, tval.Length); + tval = newBuf; + } + if (ch != Buffer.EOF) { +-->casing2 + NextCh(); + } + } + + +-->comments + + void CheckLiteral() { +-->literals + } + + Token NextToken() { + while (ch == ' ' || +-->scan1 + ) NextCh(); +-->scan2 + int recKind = noSym; + int recEnd = pos; + t = new Token(); + t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; + int state; + if (start.ContainsKey(ch)) { state = (int) start[ch]; } + else { state = 0; } + tlen = 0; AddCh(); + + switch (state) { + case -1: { t.kind = eofSym; break; } // NextCh already done + case 0: { + if (recKind != noSym) { + tlen = recEnd - t.pos; + SetScannerBehindT(); + } + t.kind = recKind; break; + } // NextCh already done +-->scan3 + } + t.val = new String(tval, 0, tlen); + return t; + } + + private void SetScannerBehindT() { + buffer.Pos = t.pos; + NextCh(); + line = t.line; col = t.col; charPos = t.charPos; + for (int i = 0; i < tlen; i++) NextCh(); + } + + // get the next token (possibly a token already seen during peeking) + public Token Scan () { + if (tokens.next == null) { + return NextToken(); + } else { + pt = tokens = tokens.next; + return tokens; + } + } + + // peek for the next token, ignore pragmas + public Token Peek () { + do { + if (pt.next == null) { + pt.next = NextToken(); + } + pt = pt.next; + } while (pt.kind > maxT); // skip pragmas + + return pt; + } + + // make sure that peeking starts at the current scan position + public void ResetPeek () { pt = tokens; } + +} // end Scanner