From a59e60d2bc4e695b02d65663aeaf29dbae60f5b7 Mon Sep 17 00:00:00 2001 From: simonkellet Date: Thu, 19 Oct 2023 15:34:56 +0100 Subject: [PATCH] task5 complete --- .../src/main/java/triangle/Compiler.java | 33 +++++++----------- .../java/triangle/optimiser/SummaryStats.java | 2 +- build/libs/Triangle-Tools.jar | Bin 197392 -> 197355 bytes checkstats.tri | Bin 0 -> 336 bytes programs/checkstats.tri | 18 ++++++++++ simple.tri | Bin 0 -> 208 bytes 6 files changed, 32 insertions(+), 21 deletions(-) create mode 100644 checkstats.tri create mode 100644 programs/checkstats.tri create mode 100644 simple.tri diff --git a/Triangle.Compiler/src/main/java/triangle/Compiler.java b/Triangle.Compiler/src/main/java/triangle/Compiler.java index 8416466..5f177d8 100644 --- a/Triangle.Compiler/src/main/java/triangle/Compiler.java +++ b/Triangle.Compiler/src/main/java/triangle/Compiler.java @@ -28,6 +28,9 @@ import triangle.syntacticAnalyzer.Scanner; import triangle.syntacticAnalyzer.SourceFile; import triangle.treeDrawer.Drawer; +// Task 5b +import triangle.optimiser.SummaryStats; + // Task 2 import com.sampullara.cli.Args; import com.sampullara.cli.Argument; @@ -56,6 +59,9 @@ public class Compiler { /** The AST representing the source program. */ private static Program theAST; + //Task5b + private static SummaryStats stats; + //Task 2 @Argument(alias = "file", description="Name of file you want to compile", required = true) @@ -112,9 +118,6 @@ public class Compiler { encoder = new Encoder(emitter, reporter); drawer = new Drawer(); - //Task 5b - stats = new SummaryStats(); - theAST = parser.parseProgram(); // 1st pass if (reporter.getNumErrors() == 0) { System.out.println("Contextual Analysis ..."); @@ -141,9 +144,13 @@ public class Compiler { if (successful) { emitter.saveObjectProgram(objectName); System.out.println("Compilation was successful."); + //Task 5b - System.out.println("[STATS] CharExpr: " + stats.getCharExprCount() + "!"); - System.out.println("[STATS] IntExpr: " + stats.getIntExprCount() + "!"); + if (showStats) { + theAST.visit(stats = new SummaryStats()); + System.out.println("[STATS] CharExpr: " + stats.getCharExprCount() + "!"); + System.out.println("[STATS] IntExpr: " + stats.getIntExprCount() + "!"); + } } else { System.out.println("Compilation was unsuccessful."); } @@ -160,24 +167,10 @@ public class Compiler { //Task 2 Args.parseOrExit(Compiler.class, args); - var compiledOK = compileProgram(Compiler.sourceName, Compiler.objectName, Compiler.showTree, false, Compiler.showTreeAfterFolding); + var compiledOK = compileProgram(Compiler.sourceName, Compiler.objectName, Compiler.showTree, false, Compiler.showTreeAfterFolding, Compiler.showStats); if (!showTree) { System.exit(compiledOK ? 0 : 1); } } - - /* No longer needed */ - private static void parseArgs(String[] args) { - for (String s : args) { - var sl = s.toLowerCase(); - if (sl.equals("tree")) { - showTree = true; - } else if (sl.startsWith("-o=")) { - objectName = s.substring(3); - } else if (sl.equals("folding")) { - folding = true; - } - } - } } diff --git a/Triangle.Compiler/src/main/java/triangle/optimiser/SummaryStats.java b/Triangle.Compiler/src/main/java/triangle/optimiser/SummaryStats.java index 973b5b5..9ff39e6 100644 --- a/Triangle.Compiler/src/main/java/triangle/optimiser/SummaryStats.java +++ b/Triangle.Compiler/src/main/java/triangle/optimiser/SummaryStats.java @@ -321,8 +321,8 @@ public class SummaryStats implements ActualParameterVisitord-@{ba!{7gmib8bT>FELzhSlNOvO$NGVEpHv&@9(jp=Fj&dKb z_vIg0-}PIy_dfd!A9xXlu^Wnkp{|6Cf{%m*1|xX|)L`hJ0FMI_ZBMwt+yPp8-4m~{ z6SGfbpuNG2QjOC4FHr6P4}cZjaBFagB7-smIErQ|swd!cRZms(&VCvCR@rVp#eUUh zUe*3e&C>T^)}5a^Bd69y#pNv7JZZ zKo3{rS62?Y-XClyK076ZhS#WyoNNuUw(?>R*e#%o>f1HrZZ}8VYgxsn(EaFzyXpwq z-LP3Sz{cKX-v5UG9nFA~b9d;{PakJ@*XDZG!YlN%pFVVYrsHn)GgE;G%(H50rxHj9 zjCkLMc2{*{@TN+Bd6!#P!;RMcTR7fW;68` zSG!OM=oqWmbcj2>;<6ACHI5*W!633M3LnCaAH?mg?V57Rop)L*ulB&&eJHb#PP;#3 za{^;JslHg<4LVW~E{9k)LSTB#PfGA5*&u%CC|2fB1>!l$You#Kpn=rcz+gz9&t4(kS*v#wFF9k$kIxZ<7gsIT>yDgXV}KlYh&pw)gBQ#0Vy& z8X-sh3igz!qKSF@|EvoxF$fwX*>P}Rd3@B5lDzz%^sx`F_s(Tcq zB~(Z!Vge>)62S`-(u$~s2^mFr!i4l9#APxVJ1=C6sX9YtemsbXhBfL(D8U-FBL-lN z#u2QrM$L$FSfgQtBdk$3Vi(qE8j+3W9s&_Wb5Dc_q95^6KjG+P7irP4YuMf+5@|89 z^WEB0&Ais6w)-$X_uAVBKD<9YCoXaoJAAg|ls$Y#>s5vRmOp$z@G7zHjFlwzW)$sn zw_NkYdlvmo$BJ*Ez-r*Bt*M`9;`x~%h%k}sJ2_=+<;siK9LBZz!h4@uY1Y3tq`2_l z)}_oBW*O9XH4G&>em4T$B=&q)xl_rp;e?k+a?SvqH6%i-OC^E6%LAeIy|L_A_lm$d zmc2=lGt2zY$JuNFkEy2LS6&QWbXN*uA48&k$!#+vipw%9P>7b2%EEfV!;EPPYmdOm zeZe^v^VPvtf83_)1+zUj?J1vf8YPARgZ}D9DUO)Z8)LsR@f!Q^2*!!(j+bn{KKhX= zGi4ai(C4{)#sjZ7e5;Z>V@6r4?xx(%sL zW6{+T_r!D-RgGX3`oe;;_aTkKbWS-5_hddoyUMmg3^bm=NRvqvIUSF}gI3IY#cAjz zozeKBpCzX;5aEl)Dt6 z5XPj6RQ;?w;*c$q$i-yuiU5DQin%MS2;Z~4b66lmvr6B zF^k^4$}uaMBG;&3tnUtp5sbmq5+1cbF z$@q4>VSx%QmEmbsvryaXvc1aUXqr2dziYMq_Ii4<$>l2Xe5l*9uwGuNutxtv61p|2 z`IxQZv`D3UFsNC;0C#hqfmOWyY2#=IdAaWSE@>$;m~1-ptEEZsRfjFaJS34ombErd z(TR#f0H90VndV`D=qGOG*?1wYO7)thY;(Ag)=MNu#mwlU&VB2MOjjIO08diNuH(QScI z)m}CdWsbY^4pFIVwT5PSX)c*2K!D|{v6l~Gx!3jOg3V+-{i{p+W{eM7tMrKcUz|p& z!K1y!QEQucWih0zbQ@K4x~o?;zgU)yr_7N1lC0IFqPnQaV6aFSaJ)i+23o>6#@eg~ zfrhRKVs$nZ4nkTd{h>Y=(wNR9S1p}ZaSh$N>{JnFCmYe}&CUw9bjheT`of{E9|_1U z28_DSSbUdSuknuhJPa9eBZi!VHrDI8r$`#q0}OZ2+ano-kEUo6=b zb&@;l=}N!2P**8#f)k@5dMXJpEzFegg>X1SxXF$&2Iu{YwRmqq zu^vhzg-;ymolSKEaT5EpGA|8WaAG6VGX#imVv$8-uLbXr?Iyzcp_J}5y>jtvjMa15 ziKw^6lo z8!&G(bv+iHwyM>7_(pnVyje)&{LLhvsJm02kJ;vf>D22N?UBRIR%T`H>3DjkHvj4tYs!pg{MhkxDR4Gl_NW1bTg+nQ_FN={Z=PrCEK!+2T`&TDTr zrHW*y$w&~dY8TS}WzwHvzc3(A5|0<(SH(KI-J({JLAbD4sRtUlw&mpH++R?{dI0vM znR^jx;yuUW6z&|6*7=5cZ*{OBS@RQ+&i>kaUN58a*lqSjrlQx&+bDyIW>pVcTW>!h7C%Wy?MS;GY`bsj^uoVY=>1P>&+vo~bhL>Q2H!9R zRmr^#0#(!*?(AL0B`X_RZ3>PGQNLFBnJK1Po%Kpeww7~&@Yt$nB$3i>1wUG*4RWEq z%I4&}e#5p4sP#J%dyZ>=#NfW6#8*sxJ0uSEddcy<)BWT=w29Fbd)RY?J<`SVwL;)& zdf@)!(N}?%yd^{8o_s%s#B1mchu#D3nJ)W%u}kdHb>O8}=0+uPtEfkpH7-Y-)b|;e zg~gCZJkCYQ*AMx~C+FUiV_DV=@2~AO>^&K#Fvs56^IaW~6}fspOtGH1Juqj@H>C7Bi#{0gd z@wrc{SE3?;dUglyXA)OZc9c;@l-qk&!xA{tK`fniLQs9X>}a#rWk2Mll3GsTtEk}0 zTG!4YSMRg?cHwTR!>u!O*csQoS!4Xmqz=k6d?o`E^;pf*8Z%y1-j>)NL$okBkIBFc zf0bjVcP08vvqOyI9U2uulilHZiq&UX&AKIy?;EGn-}l!`ScmBrI0k!HW>?)Wa=i9- zMw+?n5CZjb=GxA~9IMZ57EqoE+nooSkVSIQUZ=@d#g5B)R_e2^%oFF%=vT#d)El!- zbth)m2fFalwHF3YYxU8EBF229qEUJ;WNwL zSe)%jgw_hHc5IU~uHnbwxzY5v z>qGl%PISxH<%dzg{83GW!T8mk1q!-0emiyrJ&~-NVxyb$eSF6btgs=>1YDrMnXTv?`uX(>V^<_Y>R&VCnr z${;2pXOFF?T-@K{C|3^a^pJ2E3dAyFM%zY_Eh0a08SjA4)?AIBahV2NJ-e`NaW5^D z(l0CX^+26t-8WvwDt}j|==}M*lD(wLU0eb}3vVs#nVT~iXH}*y^r`&%cwN7e=aA+t7{7EW*d>F5n@P`&L1i`@sJ0P*DBR<1gVjaoXMy z=W>Is=b0ft*Dqve&L&($5|8u8>#M(pWAbV}MotW{3QW|=V7xHtcd{U8r_s^D4b%%1 z&j?iQdl_NKlP*{`Jmi)fIY&~7O@pCj zP(?SxS!`I;T+ZX;;pX%RRr7GLlWI=FF2hQ{t3G(FQ?I2}MQ{9~Nf%qO8J{M8z525R z?}lA#c{}@E_t|UdCVkzF%SVMmb}Aw*Lj3QO!1ARV1z$^sBzQAh%!@Mxl5motcrZwh zY)X^2ao;Bhgs^$NSByo6>^PG%P9KaWU3fCOB;lFi?Kwvx z7iw(!C8g~+lg&leU~XDu#VB#1EZWPLTG%FZ_i6|C?0}&)ro+I_pk13q`&emelB}>m z5MIit5+JSL)Le+gx!TWa^rRCC>%GShoOV>EaPLupqda z_(?ayr^YhR=&?(n<;O~>mdFIveBBrMM*q+bRE&n4g`39_MvO0ly5;!TX=?kKYrD$} zW1-9uo{4ml@$0%gZ+i+#q80e98_t$FOkgJ#ybWBV#XcBnC|vs%IR!0H4@_kGZB1hC zS+$^IJhV$~Ea_%`LW%H+S1tsDjFQS_uO`o!ng$wG0KB z!+ac$LJhCcyCgkX$di9OJwJ%{&zqClx<8T2U~D$`jvay~Ab*3Nv|s-EHCNVHLnLkY zfB^L=X+2jfQa-Exb1w22s5$K^Isd$B;g7q}MiB*7b3P?2`L0Zu3xV!TD6+Q=zTcjZ zbVVz%Qq#uTstt>PZUGY2OEVL@?nVsTINUKU7RIOkHtLr553fPYh3R zOrsb~mDC(h=W4Av*9i{7vC6mdXic`t537iEiPq9=52YZ@veD0knO<^4F;|&}{Uj9= zUm@_D>a9cESY%nMP=@%Ptm0U|w>Tq5npuKuVy^8*0%E3#jM*H1JR_>B!jXQeDaY@e zSN!iS)vs(j9edR@Z1SxNXZj7lIDTih;!i0Nam@F?{}L}q?>Q$#Y*D#=U$=dK-3e(E zcZH%^0{gPUy1yzdJ)hu<-){nWum#AG~ z=JO92dw5`-RUWbFu-YWof6^4XiGI%0UrX1YsCF2PktKAl!2bT(vTIDpaJ=*;-l^VQ zuO}Fnj^_+$!C1jW1`rd?C82zT&1R$4O2Y*)l zkItj_T#9|Ru%IEWLI6=d<)hQjq^Gj^r{n=0zHSlKt;H>wNZ8VpnU6@j3nJ9%v(NsTExfWp(xeE6aCS5sRvPK5%{r2qas#BWbsgPr-Oue4LJ#p6NSB3TM3ql zq2+n^3Zr})nC6iK=b1!0A46Z_2gl(Do0dJ!eK=-1D~cBEU$+xOy_GAVBd=X*VO!3X z!6DZ^MM8PS8sM=uP4hIW{s`1Sn?xVg_^V_ay2is4Ox)c z3V9&+nwm%SG{2KLxo1-gO%i;40bjlcvXyF~p9|%+6Khc8B$GS{<<7g%-#64ERC0V2T3Dow z>xuH!LID%-9c8_+u zEMx^+TsoTXDm=$k`Q;+IyT;^x;n?bGUJ{?iBg4r0C(bCG(_LSf=CUwO@ZBML{4+5Yai{ARQS*!j$eRqq=DN@Vv$pjG>I;{A<=3tr(N_J`5N7ubL-MB zR{X1rC?e#c6w;%~a!hJO=!4O;7)INx3XVyX z+?V8*;&9Se;-lCjAr{1v{p2_k=1>&->giGQ2g)JdjY|w8MDyzxGR+@)1>UwtGmmiQ zihW2r{^8Mo!dl?pD$P9--))uWut=`sh&IOgR>P5d@ik9?WwX9zcd^o^6Xv`vq*28& zN5!#Sg|S`5F*1cQveK!>NW<9lHT*1GEk88opo-kXq}29&dbFz&A4WACHeTp+>E;pv zezE>}En+PcKQe-4&JrZoV&I*uz(c86`F8wgvoKQdiyiuZfM`UO?r@2xsnaz1dJ`5iJf;|33w)83k@yMC@MPZJ}B^D2h?8O`g$%$p-jSy*OEfQvFm7**8OavtM zxF$~B&dU( z8Gg+^SL(Neq&7Jlo%=T}ifKqh}!I6k|BtK{U(Y-+2;ry}rh0-B`Fmst9^NPSGX zFfWaR{nY?L^ak3y@$O#RPyTXpR&oOJ4(mFEw6D7zopM6XM!%q#P=~fo1HtznD)x=C zzqQ~rQW%Xc7?rG-`YiPf4pO0A6FVGrZBfGdI9PsP&`jRb zd*-{ZXvB}d6_8{`i7X;B9)y@Y%-qMdS8YP86T(h?ln*r@$U!d;yV+wR?nsekHUfp$ zCaVwYc38f>D^OiO+B+?sS{c4JcXzgnX07>~_2AvDXu%bQC_yqPHKl8jy9r~IfWYd= zG8KvFU5CR>uPM-@TvFFIqu8f{sl@1b;8iX?Z5ki)qRx<$Xm{Mq z$7gbgk~D-DaoCId#<)uw8etwz-=7Fgi45rBHT>9$b;E6+@+-zz;p2y~9>RHG6H^e5 zF0($!u)1s`7|ITn71F|70geIGb^`}+AX9Y;RYql)n?UFnT$tx1WccIfUdXVHtPsKX ze#lt~^V#NZNHCfe*26G{W5KN!!!U8A;mt9l)`{<$m|HDrdr*)} z*dZ@J4BB*FfU&aa0Ioe`CTVAP08bnq@W70wAPj5LB<;=)V7xX^0}m{4 z3UYi%K++!U0FHRw4|!5PeRA{kbsuD3Pxc&a2B#Lw2|JW%rIz(m$6Rp?(h55i<%e+| zvXivSI)JlRKk>jmvr-{-_+ngewAux={)9G|K|ozpm|loKSXn(I1gWDUAql{_xj|G= zbU$((f*Zz`KBpqtM5kA$2`Q?%@hXOIp4TV5O)1KaPdaVl=4XybTvX&4+8^ZM{lrJm z2IMX0tKWG=6E%WHSkv-yQcfc%_xxi+$@!DDtFPbZMn*jM_iV}Ds3abI3fx>e$@Ux( zA4#{n@jX*SVn2_6j@kGg*LN9{dZBbV7V4)3_GK1|Y3V@mOP5K?=h@d#j|^n3A?>k# zXYwq{_i$B$5wHlKgIX@X}9q#R4sQ15wu&eZPKz`96=;l*6N-5pJcDju1Fcqo}pOiWhc}PX=ka*bYJaO6}M3U`;w1h??A`sjviQb zI)1~myjhBQI4B3-e)V24f9j3XD!+5Is{SNSgO-M#S|M*=!T#2m-+0Vhk?XW13;&A9 zEI#k{J6D5rec8!e3yoGqY3Xcz;SN68-4C2+habx}f3eT1Oc<>*r&3x<;=WIdlT(+V zVAS&cDbDvGXXLsU>hG1DE@arC(%>fKGYHwk=aaJGfvZ|`PTK_^7@U~D&-I}!#_QyB zqSl^FMqUfwp{@*Gf6X5H)nlY*g!R#cmmIz@YZ~uHi@84qgIM0f`MX~76P2)ORiecp zrmv$qea*4!U%nOD1dwg%CUkR*m&IBt$>@aJlZf(`ns#hk3-8g0Rx!4CK|Rvq(3KfsWjdhNukCCNpzaZ>(FZAx?Yk?-Zj8GSFE z81$;MYL|&?S}W+%RyT@e6q);2sy#8ahi>HxYe>^Q-d-krTafGz>#)QTN9t zVQZSoj(YrNb0q{vJgo(*BtdCO@dQpesI-km<@|zz<>zRvk9-!aKT+6u1%$6)&Z0Jy z0cPkc1_Wk3g4#iNpI^Gob(J%)-Z&G?nA6_ZZ{Fux7iF2R$?WfVxC>>;|4^PskY0i@ zl2gWW6UZ{}RtZxo=1gRHYx#+f>BI4xkDJ;~-Gr#<9LDrI#^G25pL?*i_dco;NOqp! zZoE}tx}?ef36|77!lMXqU%LonN>N-b%%~T`a_UGp(jt)T7-8-g;;w&}x935P_$|3G z%B&`z>__jRy=-$iK}ZYKpnWwO-a#U}~O7X;?qedPZ6C z3CRb&qkBIzx+wN^YO=%i*5nB8Vk3(!pg2fPF4~k84pHcZ?^xnqBqxjP#PImzIy%jM zi@~4S!ayxK;hm@}RZL5f@3W7P(=oD4_fkAzQDipL%hPo4)|(B6ws^ZrwKr=%B_X7^ z18vV{u9)|73@zSnfBDMn{SRB2Yg?B`lzdG1tIZ7~r+3k$+d|*3_tB%Nj|y48M17v% zGyRU4NA~Lji|Ersuc1@13!;fo3R1RQYM%SvChL}JueKX?j#Sehb0jFNDQ7b~d|1(N z#iKD9JD)H85apWz>xT9Yc7jEZl%gn7cr9}9u*PM>#NJ%fFoKEgb(i;!XA39}F;M*-(1mk0)Ma~<%-<@-ZI?qN+Ib2$Enr)7aTfZy-_Mq3-lBO)gao?6 za)#}pisNK>@2fQJ$Qt7eAy2|rjDd3^df#woY};{s%CF?J&WelPnB!aL7b5F6=U+X@ z-j}=#YnilTJ4$JSSZ%t^Gl4!!etQ$E^{{Tc&wB6_qj~*9sob!Fpo8DUS~cv(bzUld zk%eiYcUx)YhSe6jQ*K%0!(_XYV_D?FVe9bRvWO62(es5jUTQ_gkNMso$^51huxpk4BLPfjstu%=jYV$vjv;iR9tz>Vl6ptL0y6D9$tr zQ})U;*(!>?>L_QvG?ja6lK4=GkQ3Y5-J8&H#C$QpFjGpW1HArGQIb?mEwwHy?jFg5 z?tJThEo}jc4gx=8BdP&Zdf_ULs2|u zy-|!yQ>y}PK(5*AzUy*7QI4_tc@GW}1(Aj?iGUiGL;#EsWW+}>_(%sp)&On=$gvUs zNd#vY0wn+ZD-qmz2-x|5pVO>|0bL+l1fDwsP{KbA11!M8KZct;2n^>KK@e)uTX&8! zhzR~-1mFV6!`nsxC!k&O*6~})A_XFbyNn|A{4#&xOc@X@ymB0Xz)wd3QsCW#zkGsY zfHDA)|3lbsh2IoG5DcV$z6zeTEB+CH;Vh3pB)_Ua;40&YbW+NWwl(TlL% zt&wd9qJTqY5T)oH|8YBl@Nc^dodHNeRq&h{z#52lyY;fp0&;+W*R7G^1;V+Nj&=YT z@Waml7U1ji%SQ>vUI0+x*RzPk@BbzmbATW)Y+1|$HIj6Vbi{^2ts>1Y;QV*_A36Jb36$JlEGVZr5R5zE=N zi712vU*1GK4lD0&rLJ3m6sR9wy#+i5s@rcFX$K;LW#E5D#CaQWM69~tZC?R4c%+>X*c3A|NVS2?)>Vq_f|vI2crCiS%8{>TVlQspul%_08wCU_?AeFAO`#$>br{w ztr)w-A9fL2i!*g=Jefjt`&*;3htTNH+~VXt#3dCrdu!bN3Mc>;pKguePl&tjcL00= z1VR7zMzn^1{0evgKbLNGh;|+T*vq#@(DMI+em@ZR4iMAgt^8VAD)_+xa2GCqfS5$@ zZxVliI0d_Fe>9?i_QoIMF1%#}v3}--gKh!1N4p zt^Urde1ce4r}KYZv*(Cy`R!`>mKY$5$JVorM6cYUDH-I&{0wB7L zyF5k2;UfR0@F&Os-YvHNhB$i_aOgM0Ay)?9dKHWrGNJ__nExIrCfa|( zU(f>oykLJ#fldBD2@(Y9t8_g4#U-E!8u;~%63)Vikp4aa11!MbZ|qbSc)}$>0XM!v z+|=Qww?-|(02#u$ejp~f^8;W3CH(qX4b%mH`UB7a(&FLIe!0H>00aOtIGp<}>~fRJeF1Kmd2XL4?j_|AobJ0K#7w0$;g7 z?Cen9Up}sU#P*h5BYZMH5kAF&zkE-BBCe{9qCez*vLP}A9$o&Qx%JEc_)+046e;rIUM+NdfoQe`)W6ki`MV>c7ZvHR9dHw1DV^{>^`C9M}A%`Upan p0c2|b5D1(dKo$hF-rf>KMJ#yiFA~`F7x@Yx-@n`R9zbmE{{in$n{)sG delta 11730 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 diff --git a/checkstats.tri b/checkstats.tri new file mode 100644 index 0000000000000000000000000000000000000000..0a7878be2ba945919c952368ca856287d2ad4727 GIT binary patch literal 336 zcmbu2%ME}q3`4_L0uG&tH8`{X4ERZnYUPThs7{`fM#LFIlkDGq8Rvp~YcD)Zm1stPdSqPWrw<&|eK%eAk--a2Cp6x& Rp$GU&?c*O74sP8Lybm$v0D}Mk literal 0 HcmV?d00001