From 311f1aa6b500a71028cd56cee83b6c094024d76c Mon Sep 17 00:00:00 2001 From: Gwenhael Le Moine Date: Wed, 20 Mar 2024 07:46:28 +0100 Subject: [PATCH] 2018-09-09: Updated to version 59 Signed-off-by: Gwenhael Le Moine --- Emu48.dll | Bin 315392 -> 339968 bytes Emu48.exe | Bin 311296 -> 352256 bytes Emu48.htm | 55 +- PROBLEMS.TXT | 6 +- source/CHANGES.TXT | 2 +- source/DISPLAY.C | 14 +- source/DISRPL.C | 16 +- source/EMU48.C | 39 +- source/EMU48.DSP | 10 + source/EMU48.RC | 12 +- source/EMU48DLL.DSP | 10 + source/FILES.C | 191 +- source/KML.C | 93 +- source/LODEPNG.C | 6300 +++++++++++++++++++++++++++++++++++++++++++ source/LODEPNG.H | 1770 ++++++++++++ 15 files changed, 8379 insertions(+), 139 deletions(-) create mode 100644 source/LODEPNG.C create mode 100644 source/LODEPNG.H diff --git a/Emu48.dll b/Emu48.dll index 226115ece53428e78680eda8a816edb218b40416..38c60d161c2e6c1ad4a6e1822e01d58585d3e9c2 100644 GIT binary patch literal 339968 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

8ltPz$sJ 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 literal 315392 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∈@1^_u(sEXtp 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 z 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

W9}9A;C0!RcwL?yvR~pml7IJv zr>CGTN55J6=jD^MHe9L#m%UmT4r8dA<>`LLw@(@0zQ%9;_$}Y~mSKGR0>8b5=wL1z z7e@#}9d*TC!sBTkG9aZOwf0=-2{MnigHx2BXnSc|CvU7Tt$UV6>8$jEr;k~>V6uWoT$CX^q8p^ z$ayz7b}t&n`ZH|H$msnN1mQ64uQ z8V6^MhT|K%*pfQ__3d|ow@S7yL8X^y&M%C_yOz=H|45_#0}#G*dMD(>l`((VnxlYdf^#W>#*y z3|w=mwq0u+y$yV`Bcl~tNnJl`@HOQ6^T;=ZjQB9)wOIQzY!u*~ z_3WnFhoc+GJv_B9ZyEhRb?YXrRN^h;I|d&58^Er%gL_IkudYD$vvKt`=q+gw2tt}q{kR%`V8 z_ksC}$b7K;Kw@2t?|Eppd~HW)a)Frx*}>~x#ey#t;O~R(b$%{S2M@nPMv$f6Ii=!j9BlEOf*djVCsvQM`FgSExG`?3WQ#w~SdFQELq=o1)ep+Ti)$9|gNKJ8#tIC0fH3WUozt{=aj?+^^#He9 z#Ebslv%k0It!8<_T&gWa+5IE_%-Cvt4CYdIVTA_7R`K1<_wbu`Iq>EQQ=C-j}c$WbOD!=3@Lj=~od17rr^e&h%fjrLeUrlAele0G4 zlO_H&SZ<{+H&vGc9_X>w&OHNE7QBhw1B!;bR_7vXZQNsbX0&A#eJHVO7^f&k!~F>< ztw`C~Q_4aErYR-k6wF{Q;gifD($}Hz2Srn@4f}`SiXgmKU%~ox#%@JeloFia&LxeO zimDkHX`{ctOWYID>^VXAAS8{AU`mEi&tl8X7E4hULgOs=Kt0ODWT|MiTYa2h`45X_ zEr~GM(vGED+)r+~%F5?73wGDyIm0qPgU?x(u+8Gl4GvhB-Mx(M$v?nVUBKE0Y>i#pfv5v-L-MrQQTB~txi6HRZIbKu71rKTZ^~V!i-yT9S#yM+f!V9FXV^!%D6k5zM1Z;2^k_K*n)iFDEoZ> zR)6joM$1QqrSHQl{h8j%HP;|Mn7O8yj{*MN&+s|K?;eY1+l1)yJFS-0B?$X7+eSsN zSO9j)CAIwn+AeL%w6zU^tZ5qSrr%202Ej1LRl|*G;NkhPVaFj! za@!$wH21T&;%_97%jf8ZGISTq^2@7+QQ+>1=8lNRn;m;mo&Jbdu_9Tc^g|Fw0dh+M`N~M!d%~>ngu~kDHomh^G-}qXiCCS zB#>2Y1?qdzVfFoU_>NH=Uqp!;+qgE%bJ1!-4es*2mW4HToI3)eD`WhH1R47UECQ1X zGZA#vtVUP?^h-?j{=EL%{DMK-m6HmyB+++}Xf=`YOGNeS)*@H;fhyf$^8dON#mO(EOWeURbe6olzQedj+FQgU*11w&n z({O~2Pzbl3f^JTi5GVE{e4F$WQpi;kKvFthBHxNz!%xBn*W4=0c2P0gA6E* z##K{;7lE-OI-*HCq89}%W-x%}Mt?NhYFTTA=VK>T@!ppk%%!ncph0_^?2;n<66wvx zjNZOB!|OCx++Rp_FvcxM{z7Vi(Mv9k$APc+GffV@TbdkH^YEYwh{wh1afy0dsvbl6 zh`xhmWG=KngE7xsNbHx0=n!xqNF82Ojaqd*6AiULTcX$xSX}&t*tgAjzKIuqAu)&^ zLm{y{Pk^!ixBy6GFEwYsn%RY`aNPB<*kyRF`xDp@Vz*c{w_xj7*e~p!;lXW1+12~A zo(#kNsDETbD;}b}MMw0vTI!i6=%yN%WG=qNp2Mi9)WZ4RD^^pr3+m!#jM?=V&MylOjquNA|`>muL& zKjyR;ndFmXT1}PLpyW5kWs41G4I`u1?}nk}c7GvN*yw-XX0^1gca;O}-6FRBC8jKIk$Y{jDv>_u&K;zx)z0+u;8CsW;4^#SG)kRi1^h zAHqx$JqkD*%23iX*{l*~B>E!qt=>bNyNTsC5_+0aO*d4phuPgC)@oV$S;gESL(W#M zbp~B+qP4&o6y&~BIz*Nx%_a|C!L+X?3?~P$X&o_FbiyW68u1LQ=bNIOO=t!%-1RyG zAi(A{2Rt~cD+nB|4u>nt67GI=Sa6c!l2Qj(Q9Of|)brT|9t|XBl*V_3mrGMq5+%MV z5Do(+cC}He*NglN=CU(aZ?WpVmTziy9}VPUWq0qDdmlfmeF|J|v^57;Q27>6bD znsuGn4OKuJlzW3U@5lH>@H>uQ=9AXEEAX3+-xB<0JcB(S`tyJB!daxx#F&JSHIeX#CO^j@;d~!Za92@4)&hg3! z%H#UIA1=kdv$TXQopk2zj(F^-|+=VrT~dDNGwrCXQ9 za4aiML0*GM?ttNmfb(#HE6hr`$bJ^e#ij|EwqffiW}Ki>MY&R5H4Em>=$6ZA&md^c z{%f$s5bS?N|JB@#0#eQPCs-gn--|KiUqv{mClA1xQXZX+lt=^nRk60WVzxRePGt=Y zeWH%oYllnQUH2`eTmPL4WFgg{4d{m*0W9Ufu-Yw^E521>BG#8dEcF%j+p=OVOnQl` z!A7X6RvzD_P)7x|algi@^uWqQC8N)vW^DuT?o{;uRRSb%I=Jk&ixwzMajN1ZDdcj^ z{sbuCE{~Q}7!=Sk++?4QEU(-ay%=9e6$i;f!ldlkkS1DrfZM@vM$SA}4Vwid%O)1( zw+Y>`OJOf}DM;0&+$*)RKOsgkYxZ?OVGt3BBH^1o>L>j+%)_&*4Y^Gkx6-h+z*c}5=g1LL23hJTNC&~v>GpcFMKkG=*eogn4R z(u2z{lBClCJuqk82f`^cuznI#C^g&ZCy;WquM{DffZgy?p&kZ?d_TBjU}YEd76#Ns zS_0R!qejthJsBUZ?t(`pD_OdI;c}a14>qnsSBAdLv;VcDn2y%Wg3QK7|8?MYv=kQ` z(RDwENNvn75T_MR!2z2%l5jV0D)t?TdyDY03oj#R(nSm8SKRjGqp%`rEzv2+hR%IO zTUHrkuum7zrlZc!aFz*qfsz|x$;pRORIs`g_8ROsxeSSTJZ*lJ1-i2EPZd9vgNv$x zf$C!8??Mo;htvC<1DB-60ib)3RW7lR2<$)Fqf^jT^DVSDwhj@MdGS3!IqzwPZ@`MS zynEl*rGk)1IxZZ*_qcr5BcnDE3vzL2Lf6rqKJ5Kl=%J#kptLFukGt2Bok`jfEYZ5| zcOc9Eep-t5O3 zI#)+Be*^ayF!|CV0R-9?MaLB3D9_)sS|vN5rilv$4h`LZ=T~qV3X&dv-~ZzxT1cB} ziiYDc3}rw@SgIR}{SOsEdRT(kQHDd$hfKKGYx5UO2@b?+eN0k-yU;{J1i8s&#DimvK z`?@gYitA|_<=L2IOVDK$nelQ)kV6r{m9K)i71}Ov;_o1g$t`Vm++sEu2nZWSP!t`F zXx9T91ttZ&w0}s;ODxJ)2EV%ZFst!J`aKDXS_U^@Z!_NO8Cgf4ml?QlvYr9BYUkkr zKYcz{i{nc!ePf)~HGFA2BX|J;W$N5#h@XPj?Dz{XL(^Lb`Aq7o;99EvgM9cQ~V-&s6g0 z<-1k++4NPg2oiNnJ9vjr&xL*CcozpKD6Ff>@nY7GrIoRfgRQFNvZbf`_Gbkolv-d4 z{jzm_fz)MjNru7UDKiukfpY@tBcaNAVk#4@CoaJqRPyttVAWqdMHOum^!0@us!~$T zbW|w`FR2d$(3%GPF=L$4J~|ZQ>e~TYqdf>Qn9E#3-6eH|vP69P;QNlS8Cci$b|gui z3Xd6ec&whn%`e4tfv36KkpRn2_$zJZYjEhWQ65CXv$aoM=E?Yox5w^r|m!*B*xrz8Wkj2x_1OxlHrMnDK75vS-*bsC3W8twE8aBH3;dUO)(^RfYDO{#wHSMW4Z6mxTWtfxn*c z|8Oes%Ozhs{%W}U)R;|R6B5FzeeaOi({0}#;Y<4}_@~>xJ;GlF)aw-d({0}#;Y<4} z_@~>xJ;Gm?#Q${L_b#@c-hbIU4Fd$*v%Z+{@0Hkb{3|`Yelmi+?!Rn813r7F0iW%u z;Iq31L|&W@{8c9S?41UDwx@#s<1>QKCN%J8?=;}EJr#U**VD(JO=!Sp?=;}EJr(>v zoDuvU+qWE`_4b{^Qly91-+^G?w6DNd?R&cLR|#J2_^Y{3XkUS^+V^zf_t?GyU$yV) z!e3{?|Ah7x_^N$R5q>2Me>l#o7|_)?d>1J+{$7?=CgHMi4D04ZkHqt@RyKiQbB`~( zN8%?-8i6pL;YGrJX3nOKqMPyh1bo=CPAA&KYTRQd?VmGQ5Ek3i@He8_j&c;T%w38&yg=@Ka8-&A}=0+sQv zfsa7w1ANvAK7WvMC7goKZzP_7Q}J0Z@%(GxBM?p-pK?Izj-ThStTg;QpYdt<`3}aH z-OIn@8D1nt+JI;-O46O2pOg5U$j@ec%=~P|$IQ1nIQT)vCnYGtC)^YqFq`nePq0et5 zo_|y6vtHu)*PxF;=z%_Jy`YEn6g5xkvYt|m63puW_n z6nSD^P|AK48@aTtH`Q+O9;oMcZTou0tNmLkiz{gaezuwbs!pf6q;y*LCzQvcdn%9L z`>edvqgOdl=u7&a2(NqkOWHK_XZ+cq{|V*k^zWPUQr2s-)B?$gt48bL8Nk!;WSN8u zip5ZlJ_nBPb|;e0nU{ECi$bU+J^`Fc3ON9>^XQ371G?~ zYh?~x>ex_>7qKZu>m%_v>vR4=QBvQ0dweK0jPlLa}*ZD6E{DFN#e_V9}{yJm$Y4Df! z9nnYdyQTm7vxdK-zX2cqGB#~|JKEeA9{7l@U0l%y!&iownSF-r0ZAoO1tF`92Jj(& z7`FkX_`jrwM@sez-i+SCJ2`%=DDXRirs@;?ba-pKg*WK5=(iW{oaymPf!AyL`FjVi z*YumvJ9sC@Pp4n>x5@e{?OeG(Hei1f`B3*VH1mp@g_G+tG?{6Hrdh3JJV!;e{}paI z9LVIH#>zFOx^Bvf=;@TliY3eA+ll2dwr|SwZHbR=sU!Zj$f?&*)lVEhD{VMcU$?A@ z-A&OImr#jfD?X~W7V!>N`YC2tvobSq^KZ@$tp#pv-nacC1PtCJ0d@G;3vB5ne9oh~ zgAad3R@7904xjtGdI_I1fbQU*0A9!cRQOG`2iwa!qK!SHkyp2njINDgO0u?3 z_2lQz-J}9tdC^4r58kKFUXyoKvZ`(4ssw(X^AkU8>Vqwl>_zD|#2QIjF5d3glnuIw zHXo|VuwvV0TYp6+(n#q?O|>3Qtn~DYetE6zk;(EoM1EA3?A*W|7ttrj@f5WuvX@MBw4nG67b6n) zkd#M1^S?O7U80H+kH)rGlsPN8Be~0F1t8UXe0Kg%dVEH8hfm!T20oQoYsl#?{jmQ!we+p^*p^Q}waT@2IatJVQFIngJ;Rpc0TN$yyrg3d z6DapJyXTVV0h}uFbF@e`l5qFABw@g4zT;!#@x#(`@$cdIv=!Jgx=fC(=kg@Dv^vzLASG z29|7Tc6xZA zSHS*Dd}Z`Qw0J(%>|h)bYj!-Vr%hJBF-`x^6l;b<_3$T2Bz-X1DsmwD$Y+ex6lQy~ z>cUUqyp|$RCaZ1}gBMRON3ey#0h22v;BnMFi+5EN1nlS*pvR5`z(?@#46fUY2k}q>qz1J7cO0f-@XDW6PfqLx>`Jn5YnYuPEvQ@Q$WKF0x zQ|(#{&Tzn)4sT|J?jsIQSa-e_%;tq2emUP!_180lmz{JE(&d*(irEn5{j`Hh7AQ<* z#vnejgST>178?M_iq;XF4rGDquGevKTCkeP4&U4H(xoq5A1I{K;`w@TdS>tzhgR5* zH`QR&MIye&tigvS!L^q0s?9vOYl*NIx;D1hwl3hQ#V#-pqZ&n1SvX@s`aOw8BFT*% zUJFvme>UoO_@(oxf@i`HDBGUOBf-*? zr=4PXC+a_HKPJZGc9dXpkBAQ2)rrFvIUsYmRU$r({sbkSIdy9blww_8Dpi|;O7>l5 zw3LK#brW8da@-lIKAPtjJ$czB)iFId1xJxDdpT*?>S|+3Q+{`fNG$vaGzg-mPin%M zY7`?%)IoIhT^&1Lq4W_PJU7!Xe- zKc)@ULLX!EX`1=Is*emv#;C0C$6mv%W?L86bk&feR1f(pO#zRF3S01p%-|Q3fkgQ4 zV}zN&IDfQ@*+Eya70FLz8SIZgk-yx!qNqmE+|Q#B)3j+lCSR7|s%wagxLM5b9`xrH z<5fs_a(K6KhOZ@&hEj*UumwjFWZ?OSS+80h4 zT#z22P_+ zh5xr2{NHfi@IUdN(j)!(Rp*2F zX=EC18p-oC9Iy?Hr{qs@kuja8;UL?0Sa7zyK0?p*T%;Wg&aehygR_SB+gji34?_p; zi)jmHFKmq|n}HuSHE>V)z5c8sn>8TQm4tm7DdGcx=cGBaDK2I z(;X}Jz(+h28nArmq6dd?i6K>)RgY4Mk+bErt)YkS0thXpy&IC{GsQm7$+_m*R_(a< zqSmhBwi$6ppa6LQN-hyq_jPhz(znT2(mT8OlJ!1L_^$ex;Y-&4IMJ6~=i`KLvcHuB z^N&-1`*`5HD!~sQ4}6pT?c;&(x<03`dA&7)<+65^U_LL_Shzi5$FIJW*6aL2;N;Tp z0VBU@eGKj=l~@}yFT5&;J{(al+uK#1G@GoGD;DPUu^!arADk-p14Eb!e;Ashkg=y7`jfUJRxn;ul0bex1c=6_ed<3*G}BT`6ei< zjJkf~3+KbG2X9bWYE#+_{3?}UPZ}d(!`mn;mc6v$rIa@XW%sH)ChUXqNRVEY$Ao=Q z-s0Yt$AqU>o?^|!{(RM%Vp;3zKX2G%Gt`|{9j(J#)J0at(!7{irF|0TCz>1tlsm&d zx-*Cyc(8C2kXB23Q!|D)@=mWQ_2T&Twcu2H@OGOL4RrZx)X!s#WDVX2$1f2w3JOlO z7v5VSj$bGGeJ$wbD0*FbNN-tS9D2@*D0=Arar%P1uAg%cr_Hc3Dvrl)B9p&e7!~T# zAL=yW_23Vc)sw%SvFSEzlcj;YnLbWH0}mZvCbJ z-$}BXd12O%Bl0Bi7P&C%xA+2YzhbE$xzt;z_rLT#=CpccL3h1U3CVNY|1QY-nfl)a zSwB<%JHPA4foZlcoTCqZNe^D7pr;%CCdlO7kedfjtB0MfaZk-RPPINFNAz+0LZ}aW z*M-zR>`fO^eK>j<to!nk<)efp?yfEKFYjv z;^fOV!~2e!jZKi*7%zhV=&eSH>6fyHChT9mtRIIXee$L1$A}3s8@nLt$L^(1zEu4f zF+pZy7exKo-BQ|*5f@PVarn}WAIbiwA})ybOWXfcgI*BzOWXfchrA%_m$v_1K<(FK z|2q#BO_IZ3AC7-U`&|I_>#_e`0QKv!|6Ks}OWXep{qq8-U)u4{&|fZq`laoEhW>d0 z)GuxSJ3re`oo}X}jX!G$E=*3`M1k|vs!ivqWmrY!r7I|-yy}h2IE{$_^U+(<9xQvH0QHbpKv}~rmCg5 z6NIK^WS(j*)7H;r)KB4JK3*X!V3$+l#K+Nl+4=9h_=aJ_2(qb)ROny&m4n z`VM>BKDCzm6gN~4K8_9cbZh29w%TA12wk0-kKLr-l`WpkwQ4M95#yM|Mlr`N z!our9bu5p55M!e{R}bFNq3cdqAs;F?-zz7Q1u6b7XOlh@W1(sa>%Y?{9sh8c4#|lh zf2U76`Y8V4VDWeQq@xdemfA^i0)2)V@~2yAA*0hN%B7(_$)%5#{P{b5Fn;wQfBsG% z(5DCa^D(0j7SG!uEJVLKVLQ6{MCiedP<{-b(eW1KIZ^kKLk+Y;H{m2w=Y*kL_hi`n z-f5{iJ+HGX4Tri;s()D;C%|r09Hrm%ZT%^CKgsoHzxX8ApBl+0x&9nCO!Y66u=hPt zHBRiYr=w_`%)jlt>i?g(`giI7pSb#W>Hp_-{V{ychSfy*?a$T5(Bxof08|NJ1gW$& z%=7KGz>i<;eUdb~OaD|WGRxdUPNS*jcJ3LWCpiL!9-|!ac>Z`e|%!-(R=yvN#c)_>K~sN z{^+Ir!2IQt#2=)}$@J4t20eNyKR#jnaZ>ql9@0b3$Hm=-w0r1h*y-jE9FCE4l%4o| zv?E#SQFhj`J8Azg9qJrfFXBU%&+48>hQoU=2^Ss1D)p8XSIr*Xsl6B+FsWskqk4aq ze?ZXrxr_lBTPL;n2Q14T)$)YZKcFpR?9S;od-p9U30EJpx*iHIk_{osbLXt!E9&Dq zV*T;JSGu1pzkNLLRrF=|_*meZmUFMxI?t4M=~jI<_%|)*p3nG_AG&hF`HXKm&OMLu zmE*XS`(0NmpP%wqjTh;-;{3!{$+O}#Tzr1wOa4{v8fTRsQrAsvC*B7^6+$!(i2KL!HuUZp!Ja}`e=$t-)|slLL6 z*a9%T^U655P4x;uoV+ zoc;PKda@PIP5sz%-SZ2Mh(|Zl&(PC*Ahv>tcO&FxVh@PAI#9o+*}VH>rq#DUOHQ=k zpP{W3NgALe4LvA?eS{UoxtfQxn5wRRqJ4{YOxvNotK#(gwp)0by>>j6Eavm<+2_w5 zzS1y{5bKWzzNBpE5n}!Ez*o_i?ATZMn)SPLXulfe{M@Lm9g%kb0MDR|78OtittYJK zqy6gq!dKX~NBheUB>bF!g zIHj~<*(>IWSzx@%o3MYK_4-nXC+o|%pr3zLedTLveHqnreVIb9FN1o0RlbkBzU9Cu zSzo@XYs6K3^eMhm1YfetS(A@_iZ3x$+q*s<_>u*Cw%?tP{6H@5hQ83A z27H|Kr}GS7B_Dd|Z|51ls=two`n6{&B_qu@N3<*^~oWqEA!la>cl0~<^1e`@=K z(t~{s_EZOibT{c47C_TQdeVy36D)}fRBrO*gzmE92E8M;2AHkTrpZ%4l>Mr2%V(>8 zl;yLPKg#mi>Zee?ak}QKS-R25m{|?Xqy&E#K8SqKRWibo;Ne{I27qXJtb% zl9hyOJ67aWPtLP=9aQ?>FWFMsiDJWlGJd7ezpmz<(GMi(w<1i$n(zGRn=6TW1xj}yLR$FqsAX+7Z?PSOqb z6`{guyqdr(gX-XBV*~jKJWTG@)^YkSqvXmaGBSOqw5_l10Css5qJdt?H})LL*S^J%jC(%gM@BuL@grlNDSk@PQP<)b zjM$V#btjUc&NI?-Dd?2yGj`|U7cbeO__2EbvFb=(Nk{O0^4X-wvh1QPzl4MLvt=_H zg8#uU84Z&nDt?)BR0Ixsl17Z2zD~!ou;Ha=a?%q`N&V>y{D_T#AH%`>*|Nk>;Ys`$ zGVo*gT;fM;4Ez{Y6eWHNPvXarfgi)?62HYJ{1{Hsk8i4d88Yx=_*~*wjPeZnF|6p< z`sztIuPGhpogIFg0;~*t7&a)yaDq~24IlE0K_7-y`x*E!#=wW+vyTt?!@!5(;Qjn- z;KQ(i55s34pD8HCz=z>v|KpqDB8CjC7*1ey4&>K~?WgcMU*tnE=wZ;0;iP=v+ev!i zM?$~Ff>&SAPke>ULcY6#HpPy7&^VPKZwOpC27*wzz5$;{) z-G%ZYm`k*U4t1=BkiwrUv{3weviw9_@|U!Vwsq=!!!N!~Evv&91La)D3Cez&wC6YHGQTlj>L zt0|hNAS03pCnk5ge+s8=359i`%-!VRTk}wO+V~KY;7>^o10Tj1_()jrVdz}oBW(23 zViP`$G4PSF;KR_lz-KYaNu>{C416Rk_%L)5eA4L;YAkymnUx)&7QQ0nGG!0&-1>wS zs*AXQBpn7woZdKuP_1c9nRwx?M^_N$csc0{(nS$Eef*~Y<0Srk>y3j)H~2GqH?AFL z3x6_O5`Vt+#$lry{F%KQSB)mF*Z7bvh>yaHDhWddJ`(Pco%&IsPE0*_P@cnq8oyhQ?!)D(COB;ctlJk-QHlCAb@1#;VwL})oUB6IQe z8KA4JRd;z6wSCeKPiD4b6B4fe4E_Y&WAS$lX}P)tfBbG0JC3pZUHvahC zDs~QI`N{8=Xf>TXY0%Q*D7adb))FveV6PEDLwbKW7Q3=&TUBU zzj*n@!Ha_pqZ-litsXlTy{uDL9vzQj?)}>W+!De9)6Iv|;=}gt6+TR;@L{O>r1;!` zRHuOt+rL-%FrmVSp_Ah?_w?`~KlBP8CRF$^baH(DQOCz5FV!TvTl=kUx7~kiwg~9z zi0er^q)PBVivcPa5q`LjVGo7Bgm6g&PHX*ha(28*-G^r$q))v(GJsJY!>T-n&Q5u3 zV52;SRe21Zo$}a#MtKaY@)$}}p3h;y2U}u1Q1A9G?~X3-nThw+;f7Zi+4G{_&vnL2!mBp}c0D~Rrqr*+-^LVaU+inOsG&y2nAqhDKa8)cd$k@`p1jF6kFzzp#Pz%Iu2*yRwqHpb!NE!EelnF6m9lTD{|r4)X`eof$#v=4_2cp+P0dVfmucQ zu9_g;)?2cXxFayFC~ri=5+FSy_=92pYRenGH5ds;?PDXsy6k z>vb;K@r|N94OynQZ3R|GHGo4w(~1U`ycGO%$qU09gFh7@FEV4e&8{A)U_6;6eeTb@%wyc~yf1YP3SgZi7mVedkj=h(LulTOj zYH@7N%(7@l+8obhxUwywZ^f5dwWiRlBG)6n*KD@d$gvFD3(*#$4GwrJ<8 zC@5>;@CZR1-g|q3k@fO?2eM~Z&eM)Ab!aaDPF^$znM=YOD5^?!2In}PykV_D+cC3t zr}u5xUcp~w|1rv9aXl~@N|FlJ>_U@rso68?Q-y z%}ROoHD_yojJ6$y{0V#ehi-J}jbS^oG(%^e?d@QmE$dN`Fpu3C*>8soYn?&n3C+6I z9{v7@@wlF^?Ag(v&2_Gt0E_X@*iBRqA?$jfjsSq_qZ@=h9>SySF{Ji>sruM#&m9|G z%#q-RvKdzc(4DTD?<2bGCu8t3)-zG`J0Tq|BK#XvG?YmwKs|E8NEtnTea|a8F}Bt?_T`+ z0f%z@1Q$nd{#j3&DC49l^aQq(COkJOh=yH@lMYYgN16ydY$y9?Iavam^`t2>&PfUu z(unAYL`OYNR-84tQTc{HJL1Q)wL{aWNKkLP8^$-0Ub0yUsSGI{=-{v^CF_-B#BYkK_|I!y- z_x%O$B^?`(&l38^glsmzm612>Ifs;v^iIfgm$UR;*8_h*0&N#mkN8+xU z|3Rd!J+=bi)bKaeRr5F@r3`BW9s@3F2_9a z{yQy}**Ld0m(wj@V`g=1_S}vaFWpkPa{u=*3!JANTN&{?!#CHudq0!ipbpK5Bq*@4~sd#SqE~eZYX}`c>I{EMZOx^a}zfIhuE>R?ED0}Ixrt5Jm=@+g6XvgxM{lPiDAV=|TT0tyw3VcJE13pX z4IQ&k{zxN{AlHIK#(><_NI>>*{2v+#TG|{N{_lWni#DeyZ}j`453PUh*=L_U{6^%> zjOYWz{{7L1E2GbsTP(g!b}g#CpgmU^9q>9n>|$uz-#X)Squ<15!u>$hS#}Z^iNrcAXiY!k_ZtA!i`uyotdg2JJU3+3<#CNomWa zJFg4ODYAR4(-Xv>XYK{xCG|^UDbzQAmtHa$-$x%&MEV z5qht|0hd4}8v>PVkZvYQa6p@5y|jNz^m71F8+O%vA*<9oDRmQWGj6OfXt)~&bY&5gUSLN>N}6VbOk3mEPX(7#}Qy=ud?)TY7^`eV>< zMrz~pk@nrkmpnfAvG^XCD@JNZ0M2$~W!!?yu86J_{h?nT-ZA>rTzT9CV}1-a^_J*?$uJ82qiObfDA#CI#)RC`y|A~Vorn-ikI zv20Ut>e=K=6$A#6ccO5K_afj!&QY(PgKe3rWmQ9$gcp@=TX?7IM;vj;o2e4Vcc7po z3=ZXt)dFLBHhxYT)yvCK7y?DAvIynZv4W7%|AHOHe*uoTj__4H;08j@#OX42JhWVr zg{-&7NPmOE1iX;XYTX9NRaZ$BUVudZRD4(2U(tYGcOn_;iG&5Wm7|h65bytR6yewc z0+H`a!oE!f4R%Wx`APdU@H(LIisJDUn*_+QUnn~30x5Z!RKrXvy@KVbY85;%xaP)BufzdsfvGPl`rzinDUx4pM z^#5n?ZNQ_duKnSe%t@Fe6K0SEf&>XLC>p@jfF?|W6G%c(zzHD}q7d+2q|>SGP2n6s zO>l4$o0-i>+S1nkuh&b8`nT2Fa$8H0TADDJ1Vs%X8pLaZT6^N42B9QC$a#Nj?=$%T z?5*Cn_j%vvDGw{_?C-VL-h1t}*Z!E~YvrU;y-TSNA$}u`ZVa}%br1_e8-SIXSBCdr z8i!=$be9j43azn}4*mvY{Ut<$=$Vubss3j1&>BmlhEnl|G<806`uwL>5Q*myw#TsF zXh8o-+Xe2SlPm&Iw^;^Q&Zis%ru(pnuBC2fUmXv%u)sde0L2Y>dJ~ukoN2g@<5@mf znBmSgxRc`o!;d&FHk^b>H9hNKu&u;X3^}EKu#DyrGukcz3%`_W&|Hyt zfuV1*W!uxrU!%L zOf=w6dW?qccav?E|G)};80|#?!s+(|L&w;M+QsXs(H`cRQa^7&8i+L4iiL(_&r zdHej$&7;o_Mr8yiHWHI{&W%d&Cfff;+DNUGlUrj+NDvEKV`(>)z6OM<{}eV9%h7Yp zSsMOY0@Zd2*hYPc)AFoYNetvsUC@h?!yYHtE0`-f5BiF=4)qn)bF|6}a(HazPU@Z| z9!lv=_fTV^%1=QOf@@=VHX>WWT%Nheacv-vm?^Tc*6u{!EQNf02aQ;0p)7Yj@3+B6 zDA!=S-P-iAv{vICr#|Icv@gy*A>^my@X0H22TnTisJ{2(eHY^YN{9bz9Ibkd(D9)N`ncSr)7DyFAU~@#P(r{@4X^1MW@7sSzi6{ z#I|9H?N=nG=#-c+%kvDO9VHuvCH`}4wCYi^DLN%4%<>wBmwf8Aq0ImJ6^SW2B_<56 zVWAi08cOb@#2xsWDwS=)DhHM29heN9`f-tA(%&` z#zuTC%D z@;q}`;)kwCOwlPZVU|}lJaOu<#B;AmOwlPZVU{NkPi!8R*my-^icX0Mv%F2i6Zc|G zG{~?6(D;TkjG|Lw!YuF5@WiKvCI0Rei77fICd~4h&}W7)taDi6JFZAf(J3)umUm!y z;x~sSPP!s7MW@7s8{6<_ZyQp$cumzxVo}l|@_h-uCERx>#Zu=}P|EfuoheKA?m~o} z6jhyupq&)b=tKLv_C6IQK^@8S>qLLt`}kmf6iYorl%-VTlNYjdZ$0HlQPmCv?WB-K z6=KS@w|XGIeUvEa6nytq4dzF&)SW!Pr(h|3(Sx9+dskC_6jiOK{3xXHaS-X+%Nu7o zg4J*H{GNcw*;~x>Bj24AOD*O3?Lg3r>l+Utbpi?i^@W57W4B)@?#`m>Xg zsI-Tb)wH%T`6v}QJsMZN1pmEua;D*r*XC)5p^-1i*Y2daY9FSRy{SVYG({t*Cut&2 z>ZHc8AVSHDX8cuYTZ^SM5S`>+x>v&AofJ!LK+sMKp`{dbWl~zUoHD~VtEm*bvg~mA zi?o-v&jT(A6Yq<+!i~?|GtZ$zCNG7`u^rPYq^E_Jb0uD**Ra%s9DG`eWi{y{>?J!L zO;KjBT01Q_AqFkwLfU!_rC7X~5sh_Y>{yUlGNm~u$F-7bj)ex+s6@|xb97y|<&*_( zP=^=a50|s&?PQZ0MrGQWr#Y2eu`gK42~7{&5Ai-gYcgm}yBe)8*zL$pxrt;o4LBDF zO>>tFA+#5SQcj#uO-{gc!`DO+vl#t~oo%(JBa^Zcx0XUG2N3BT#N#aoi1_^$RBUDO zplhf`zvUF^k5}XVRqKV~lhM6sAvdHQu2wf?&VU3VN;wCXqGCv?w*cC(B-#RsMO24s ztBgR?QI&Xe5P3tE*?N1FxyyzA#Ope|J)CR;(FTn-by(AQNVO8pE)vX z7ocFYEvKObrRxn2Tg32k7g4z-(Q;9ySMrd~=9LhUl)L|}LP^Ktg_2VEzf~ydhP+Tx zCjYkzC7qHNN=oSeR-vSe@@Qy^Y2Un1Qq;eEp`@9Ai9%6JQq-wHR65;5+WnPr*|6XVaT;)ZKdF?_a!GN7|G&W>sY!YCN?fJn5!5=0KcGh<2I-85|1I)=d`Lc| zFv7o#{OgDKllln%Jn|pVACV8~itwjnwOoaa(nE?O{FBI^G)JyPB0i~&@c#?u;6c3+ z{-h(q|G&t;nBtR?2!B!#;r}xElZG7iC#?|v{{eropTdoguk?V=bm2^bpO2?%J zm6rj-maepXWqpw}5KGCG)BN;-X+DMY0BD9npJLm&9tl;1w8#>u0JL#nD20sT;tIJz zf|6QBZ)dKm#P9G%l}AfddF1*n*B_xh9v`mU4p*<($6PTH`hg4DW9oo{^+n2~GIN;L zSV}UmLCjzSD(-;hcw8j-m_`&#A0qsFLLz zRI<|ML-goMqR_OiWPavl%mpOw$Ljs5tfX8p8fZA9p`QIUU&b8Dt4WZ0j=F&B+;AP;XS{l1Z{SasKum!u6CMafJT1w40B%iEeYR6k6Z*NO&+PT- zYr#1S{TWHJdM%73*P0FFPK7&}+}O^=)-6Vjuoil%kjjfIK?}VG9N;!JdooYO@Ie!j zeDvSawCCvJf5KtFn4Xi(AIAk!79oL_LT5d)4(_}k4zQ4(YnN|kDU=xwu8{G9y4F&c z+e5WNbaeV2+@o`X6iIogQKXYsvLs5vX1{>hoVU$2IE8@GF%icU=p={NKxcdejR?O6 zr*|+qyH@cGFn+ZZI&i^~C_hXSZ^F?UOAZ_`aPnJYq(3B41APDXgE{cv2 z|EYA)ER|lqbSmNWG~I@&(Xo9?DV zEMu0c>!v}ZsQ2S?D`i;B4GPG#qraf^+ON&T=NR4(7BuT6aKYzbbx!aqrRw7s2uR0(hO+Fj#O%IG=^UZ-GDX`fb*lY=GwgomP^I}Cko$eC7 z*bb1+QmF2r6cfQqaF?nrH}I~WlSi~ExD@*)RyVD&FF^rDwGHLvU`g5#Zq#YG5&(N1 zHX_q8_2Nj4_&`VI{kJshgd=RNJ%Y4uoqXCY=k>+Wp{cCO#tbg?E)>g>sIDdId`^Oy zwK&d*+MnPF0~3e^VhdN$4WbW$=$r}EzH({fV9zNn^s%y> zrBKteDoe&XOOeiJaSp;-_b8>Du?XRz`@dy?T;8PTz-Chx*c-LsMhyPKSZ-l%i7hc_ z9L6O{Zhlc)K?DRu4n;tqNM)1Hsv>Cfbb*sWEan?t*u3Ntwm=1ML(g+2i#I4VVC+% z#6zq=9O_k$BbKvZkYL}I9G6hF&uCJ@#LCIZxD@QbA&XQtH+Ye~#=`hXmcz}RwzVuQ zD$IYl_2=LhRmAjKofcSP-Y~N3UYxvgtG}PZOJNhJ9Rw4OeqjSz&~$uAXH-So@2J1u zWPLOR9Vyyec|ykF$UMn7Fkm!WfF2;mc;ZfKOf)1&iIz5lL=*|S3J5v{^ssI^+9o-= zaW85t7j<`;1JD_YAn+`KB3qy+nI+MX6!Ib8jV{Y&>@hwNA?GlMN`0Xtu($>RcX`naDr&<$dFHxLZrC!y#*us$L4yYx=7q{TJ7l;lYKv zgD|7~uqn)3qUQ4gZVPX(K-I8{4~^?qA4unhrTI{VuWcb)5!e2$Aazl`IEYBksoqDsf0~xO93AacGQ&198^cf2IECLbnK1qGt^BFGpAz z6{xff?OKsBtk{wtSYp9OH^pD4vvp`!7$W0rY|Ky*mkf!1xs1y?aix??HofM!D5Tst zF6G|F*-B75v=nfUgb*eSJ9~w5l^7~G3qR|3>89p7;_Y|orY7R1u^EFC+cDlPP(zy7 zt}={yuf|QgN1u%H1_ybCWQ3x`wZAja{(4FK3rDp-uKElil7wOq(rPux*BeBhuZzS5 zT>Gmu6N4+k_+-YVl8{OB+$Fk@O1YZ;SFW~9;0)=y5$pjA(pIg+VuKWKdMzR~sv7hD zyXDkVsDfJd{w3Uqkgso?27!Yk&iLzb;9!FkKA^H9=kB;f><=y>S-o_j0V&+BkRr#8{WT+c*qJE?GQ~2S| z!3^@W*7l-|851$*TWg`982oAh6bQudrZYN@pQ>*BWxw`f7Sa7*zeD*QSisGupONxb z`#$Jj>I=`@Ye8WB3VSM|r%^{}!P)z1>{2Ea+nq>n3e6K)N=<@(=#5X?v{dCvu-S+zlN?q!^dmWNqiF> z3`u8seDEz1#Abq6`n?&Ruf3mWlV-Y*?Vmvj>+X66QNgR9{03)bd;Ooq)@ctDo!j7D zo^?Xa#v+fY=;%kd{1(MxJzJb!beOKL)4c9C{+DDPL zz7Sn1rtmK1vz9_0*?{iZNIe@}bsD-e`uk!G3;tCqPxcydcpMH)e$>|ws-rHa3#&(D zF%W+GkC)L6f+zx#zIA!fz=VzU1SzLv@ctMk`>camxOGzub4Y3(J*;En4J40s;*9rb z>o4C5&Dw3cF#qsJ#mc7?%36MsvHx(dqjz&mMn5+akO3g$Wm9jcP-FMor(sS>&pKDv zRFi|1aP3}j>6Q~1o%3o>C>G4tI6iLO_7iFy45LtTw&QTkgr4J$^VMVN;062*k!7Uk z1jo}2GF#*Td82J{ah_}~bw^|gTr<~cN-k8tZ1_!gd~OXLMGQQvW3RW&EJE2yTwRQ&lsFS~hvK+0XZs1J__+dEEz-8Tz9&2q3CG5t6r_|9} zX02tA!qJO${Dp=Ps`lbH@JIcp-5RD0965U{ky~}ZFUxU7Y&jzjod zroKD{1)(9$(9kfFImI_eJHP`X3&HD)8$T4hK1#e^f#)oAUR!G~fj5HMm&vrwJHjG# zgk^TSm`;~^O`-u_Rja{Z^a_l{Wc3Y5Fq$4U>tiJOkVPt34K`tB^ceLD>s_Kuy>=L> zsl!Qq9lOK>-2$YFzWOTl)&E2((Qe@cO{wLkV@q{1_xPwRvTH+nX6z@5UDy*Ip!Rj> z57dXJ3QGA(ISos8sGpk?sLG~Z`i3M=FH;Rv5JZru(zdbScyz3FgrxCw3n@*VLXkvM zTWhlsg}sWK?d&k?71J&^4?IJQUp@^ka^5t<~`5z%*!KXJoSt8)`|N0A2?x0 z9B)O_%XjXj2T>w+5eq}ypdJ#jhLS&ZFDafVVF%APmQHJCs_TC?NcGpl$eQ+Rv=mYj zR^Br($0v1M(pbtKNbklr(u}#FcC^z4Io$svf0jf6j%MW(v>&!Gain+B-Pf? zT^J$0xdv-(5kAmR$t7;JidL+7Bxf)rnTjnxhia{xiU|1h_qwe9arh3#4X<-O1|P3C zuEEF63FDEW%o=lUj&<89FgNQ6d?x2+TDQIjS8mS3Bj-)eEUGU^wj-O&nosMF2%#B_ zt8J2PJar+SD7w#D_X|q>$(*nLgy0Ix_4&@)6Y}SE2RGl8aagEu+wHZ)jAM@W>M@~e$?kOQ52jh`CvN_n zazP$+ezzJ2kBMjVvhaJP?6g=G3u`BI6t*8a${N~_6Pb}36_RdpgliIJ|ADGRry$my~;-vXCm1rRhCoWKr%6WdwhC6IaAEVu^L@ZxEl@_a7WTJj%MS z39k+mg%%aJbDl+@U&iztr^c%bAPyFun?j35Y3Or%V&UGL7;| z_q+p5Y_+4UW(C})kR`wF+~ylY)oFIt{JR7s`AN^kJzrnDc5Qv~Z9QFh%aQGGRwtU; zm(-nOuRMGL1yr*ZY#NTzyHjwPWQSZUe&8HBvoMtrOQI?qeWSl(HOEg>^oi~2G2;52 z|9s4bSbvu(V)i%3uhr1;s7GTLXv;@*gN&Qtdp`QcK~kQZKaOSl%bPn#WbDVUd^UH+ zWWWgTO{M*|M?%T_SbFTTb7;dls#*yEE4|qz!bfM=YM#8Q96VHNB zM<3xRQR$5jZVQ5f;Wh98Z|+Y_ZKFSTm#81$La81&^NPTh!N5#C&|^pk1NFquP;H&B&dW2Zw-w8qY(vfHl_HWuO@bg_XDz;Oz({DW?_(hr-6Nn%>?~j z1e$vMC*v@?a;u}ic_}`Vk(q&=55BrK3&wP7@GzOnG1Ub32QkF`?_0C>RK!Da14#o=z35 z#&4ws57T^Rb2fKLOO(%X{~Wm>Q7V6_Dj?}80U zCS1Znu{)`3{E{*)GGm5Nd;=)v$weY19@J7hL>B0zkwcJ%CFNB~ga5T4Z465ya_kpN zcm{$@+KeXVWAW5R+@Jjv{`Pc~m5p!m7!vV#F^0(8ojVYNUYF=bb$1?sgEyt;aeVEp z#h*Zuk7A_QFi-IymPBphXj?V@$VxKwH^GH!HHRc0OQQ1d5vuiR&|sU@1Z@8y3?;?z zGI4NCduwMKVnr?IeEM%dPnOC_0jK%V5leJf>yCkyrJfxFH*I%N2jJqnzs+v_DY=3j z=VGaWV`K;Qid%6N3rSh)K(7ez1dk~O?+-KVJv=|&f?_*h)&67y?;N-vjHD=%3~9ed z2l?F<9b{N540)It{u9s& zTK674+$tTU*hxK%b@Tqhc`&TEwSG}=8|1``KONTFDhIpUoqxT%4X@~RsOYtqbvIsV z@kRl!0~k0>h+O`TI`2$@6zWYoFY8Q^SoL01G1{lZ*3p;lQ7P23IU{-38f;k6x$u|E zJO3#xi17#paT4zhgQ>y>FtD|4&mGv=9+x|?v5kii`PR0+uT6(c_!~44BIE@3)ZEKRJ;^lrZzE{BUU|&mor*;gEV#^LkOoEd&0bkNxBZtI~x}~R`j++ z|EpTYr-2!i*(#hbAbMF?TuEbLC~Ev>nqWESH*$QSk%ls!8hI8i1a}gKKd#@y4+R+- zX&AuwmLY>cEy2bG@9erK4H_PiC#4iT=?;A0?1%2GYpRr!g!sW~rwN4(+YV@O4=v#{ zJg2CSBvi|)i|i3xYrXn7isfMgLgm~4K5Qr{V<1*&7<1t(dLO+C@kPTb6{TMFIReO$ zNf=%e>=#>ONsge|4LnbMvJtXG2n=Ei6{7Q-_=2Mx>@-f+X(`0*K|wO4?z}|<(b?)N zRDJ!E!>T?+in#wi)s6O~@1PfhCE|xPghWZA9w>VHRpzJvi7eq_WJv!Dm%4|}Lo}a6 z)e&LY)@L8C53!bkj#Bt(*<3xDP3p;z*=P2DH~a7c(Pe0> zOKkQBkBgeU9ZaDKmCc}zmDM!oC{E_{5Z0|7!>NzD_i4b=$Q8qw_p!ii^3XHj(`>!2 zr3tnq(WGn^YFA_wR2jsE4W?};O|?)O201nUi6NXKMTmGDiOx*qxQZe)oC%lBOq3?T z86svTLFKV%e;VU<>l%r7E*|8-fZ^H?DaaU8t+A=NtO0AiCI%Sx6EPTRiB;}`{-5Z< z`+EjH4a3TewEjFEUzsEBgQWD5AD+P?UuCN9c^00K>IpbEu;l>d7skFa8^vOHG&d

nuqXxKRI*W^WOSrT0up`(zN7y~5RDGE!WTwz2=oJ z$~uDbVJva83tGyD@X%5^DRC7%~@QN)SZt2`O8D5e~CQ@XnjL9jmn`Me7sWV}%C%^ZyngkV&+2*%k zX4*Ijg{G##b1W$YBT6-)j1_2NY>R$~rM z3~e+9lsXHd%bck;cD;B`fjcHhMrNTtO2 z7bnL=Vtp4glsNdqixpxx;>0{gB92&DYkmB~Zr!#KA6|r2D0bh)OgX-_&_;Hf$Str4 zZIYAlyAb3>Cwn3j1B-1ri*3qSL{zTf;rLA!#T=|O7Eu{^TN#{HY=1Bz&p_c>op|f+ zGn*}5$*ukgMhFm}*hsVor7C|X--^T*g}*B^a!a(XiREr}@6f1gnN&5U6{7eK>%Oo{ zeF%pA3T#Gq-R4+qTYoE4dQn@mLpi%HS+PWEaJ;gCm>@;st-n-krqcnXmlgJDg?+)) zt~C&KtT0(y+{ad0u%&0i@$@)WXbu$iQ3F5{OZyPzVP*WYMrE$QGe(ZzQbQ*id>i8- z)28Pry&G;&BjfO(T4A!W)i4=BGD_>!A~xh}j}bpiVrmH#_9E+86dW)iYK&}Vg}t!I z7lM}FNFpmFV{=R(n~qxCb1;mZJ=sn}mxHQ8b@Lyvh0EQg*kR^ls3v&<_0pb>o_G8m z{P8btb%E(4u}Orb4u+*6EZXf;Dg8jVx9Q!!109rZt@A-~ICA(nA9p7(?oKo6_G!G^ zrw(-cWWC$l^lpEbG9o(UDpw5*I+BNDggk^ixBz+3d|@I9gx)Yd*#0m&dnsFKc9++k zP)2HsMV*8Pt}D7y(Q6p?xX&pgasK%Nyt10Qs4Hc`0NH8%?s2dgf@`M*D`m9=MxTlR zF|fi~yB#4ywr!l}E_JE5L#mN5Yl1Ml7|Fl^FzC^&w*t~_GMnF5>}Xj>^KogpT7^a| zB@(71KmUPbY>PYpn(Sk}$m6=gR;-{}Q_SjPLLzMN zj#C4)v{K9!cuw}ZwRGhI^5LBC-Z}}-0bWbiVHmd7cpCZ z8_p@T$Z1897G&}?G6CZwQ}O*1`VJLokyJRgQtpM83S^McOjiba+NVJ9ak6l_JZGiN zU2d&?8%>cjfrwPbXo^iIGG_#DkgnfR6OL0mAz`$|HZ(Rw9gz$1*1RCF*b=37269tI zTX)9=R!04lO{^m_FE|3W^jP>t@Pyui;OSs{pv*$`MOBNUsnh&5;ADI-4rL&^lyxE! zpLMV(7zwtq<7;zPT9nka{u+w`r``)~h=YDIKI=r640eOKr$F3V$4X1Z_$Cbf;z$Dg z8sG<}V3e+edW;F(Qf~dFj7Nm~JK1|1lZN#e-di`$aZI4OcH;!}fz$ESWB-C4#;4l( z$c%cYrewIi=4e--nU!~i$o1J{or8*b<`5b(@?Qdtmil4bSj^(ekpK~D%qB!PY*!tVTgeirVgW<*}pe&I*)!IF_9k7v@@kjj__3%jKG?4QIoFr38 zg9O1A72BND7?8bGgo^Ed?krdT9baDKs+_!Jj7wz{BAYd=8u-y89}tu;3%`Dn9LTdF zO8o>2Ma*q{T#zvt7GQk2L*MChbgvuD=#)4}^M5KiW>b{)pHzBMiLPX#Yd%V=sPLqd zM;dwD!aeFv+#`=rQC-8TFi{ZT)MzQSAYfJ4o232-1FM2QKII==*TiO^Wqr~>fh|(x zlVKWLNgnM|K&LjZOWx8&-!te>oss*mKb6tO4%8XhNoHnF$wiHcVUP8;d`%E9Wa4bU zVy=%XYKfau6fxnOmD%c!uvg@1!5D;2u8#}m8;kNW?*3A;R6Pm3G-#;Ey}1HgZ!2V} zC2mC#rbsN_+hi-xE?!R%Il~HZEI}S0G}j)K@lxeXiaoO^Xs#bwn8agGR{%P^EpJed1Ff5>gy;U&FfnmW0*fbk|1VWlP}%i zzt3XuISeek4|_LIR?PB!LEal55%SXHjNlpRn`Nu-{0cb%)Zj_P!oElx`ZVN})0b^f z-e5HrB*cVp6BjrWGcG#%F|qWQV@APgb`%ZyLZ#dBc6p&0$_6NaxH%}Be3J~UrVmLM zIWDd%_SYmE6qu@nf+)9wj}p29&F^r|&>+&#jcr@54MG!$$w5f#TqlAo#dCN!0*ryz*Ty+nYIBZ^Dc87c`I^k#8@5(pSeklLBS+&6{ z1zzvMD-K?7Mt)SeN>DtnAL+uOd6xw0Bg7@wVwfSRS8S+UOZ}`I7b9!>*FMLZ>lY_B zt7d%;t}jejg}J4P^fm}4ZT1?BYHfA_ralO&1aAz9s>iWi<39jVCBKC!ryrf>Tw$Li zAB0>x7#<>UOVl<}cq$;qgmPRA<(Qa@f1n8}AUe(m*R$i8Fu|ZEJXn3)^eXE|UqACq zun4~=GG~FdQIe&F3wsW;=6fnv9SqZ?EM{VoUKRq?25q9E;+`-)+pAWfU0}aWu3$ac z6Xm-|Ma)i>7YrK*sdGj`!7nz>Sz?q&XD>IR|I3N2IU>y&DPxShfdpePPe-TT*rM#~ zWcs80XS9HpiVXTKu`n%sXz5W`57ufaGDMiyxU&Ps5j6-UkEXfYMsniC+@#~c{9t+W z4D!P3VEBt4sKsCODpT{$ck!hrVI_cBAfCUyf$4Cama+-i?yN;isNYY=MnW27vbqjq zK)n@5wAD=z73xuJ%4xBw2#L(aRljB^^hxB}{Ckb#oFtOxO023PqIw$RQ0;|^r_y^< z5sSaqq>Lz0H`5{nt%#fXXdf<$&=y#_;rf#j4-*NpFhs7$&N#6SQDh0ZyZ`Sc+HHqo3q`m|xvkt)s)i}fIm*VQTu+gHB@&q?6=E zrJoYXiP-hjZdJ2C#jx?WNL%_zsjEJq&8Aog5=8-1F65?EbeUL8n`XB^w~h)kgl2K9 z%q{n(s$WBPd^w_+y`$6$8k4}Upj+a0OhvhpAT9z2=0@Vw-+v-Pp*&Yr2WwM%L8{uzCj;LsCbb7oajLCv6#;i{b<2x31cb|WM zUwQMVR-7GwuzBeytgl0g(=nX z#s*WM22aqAmK=*lo0Vd=*y4v#E$t5=&3E*(&?2MM^Y*0bT?PH|N(M@uloPT0n>+Pj z#MWcHwCey;AW|GfdO$*sxL7w@3h+-{Y#VJht?UgvUh~fe-_egbZAT_88>D^|r(O?^Qh#L9_F>eQNIXk3TPOwY5Z@A8Xb#)~t*h5x zbIPE^=hRrlOYCfMcgS)+8k4>eEr1;EkOC!U{B_)6R{lA-XoTd~((4yn`n*8NkH?Ue3YoU<&6+bmqjn%-pG` zblUt+)l(CTd~rXgzj(fgP;B!(Fdsbeua^3`kAIU{Q|_k)ca=qZn|or%FP_$=J#?W8%PQgEpom(I9ceQk^!K{3?#dQPMyX4JIhW zh31_U6qrrb;EI+QDnp7Xb)%s2Q0^m$Ok<;Xtp8*;#s#|CLUj3>k^a}Uqo0yJDWIH< z*wD$zs&($D3MXtwjZ_lraQrc_(!72gyHjG0DT{lj^e4W7UrP=rJ684~VBMdAl?T{6 zjt+{JGAvpwqD4M(bSM>ww0@NTA+rH0UN{*sBcD*Z>!azCco>iWDdLah4~f!+5k!@f zOVxKUzAM49K6;kUh=)63$ZIz8M3*l1|OjGg|r} zxfcVZCSza>KnR4Yv!$M+ft9DGtf(&t0Q#*8y1JPyJ~b&Z^0lGkg2xSQ~HqfBpT}Bqa^a7$X-ACS-fN56ST)y*B3-?9uhGrv?Mxg;~#=h=?lHYsfG7G z@Y{Fv)A-vUcCbuI3?u{=jp_r*5Nt}f>2PR?k-To{L;J9ibq7Na7z1;aYaJ7)%PZF) zF9#pK$_Ra~flt63nkVsrAcjB^%{OjbzkueI87c_4FyvffhA)p!>|_^nw95DT#pJ{% zFg-O5HqU{4%yMRoB9S08Ym3I`I^2mUvdK5$r7%Ofu4Uku?HZmNE|x0E+6LP|A*7!` z?;7i0V%7q41Dho+mWDPfviZ%p!zt$Q5cdwm|eM|qtgOS%#0D;MR#UGKQ>gsczI!C zZfJqcU)-zt>rderAASh352)4I*9`;~*7tpepXVu-T74=!$TOC*4Hb98(%lLRbLcKh zY%lsSY!-+X$Tx@Xu;Ai+AYbyYd9uI|c!>g*D+Z?1(fV{c$yYP_ zis>{|&`=<_{6+-xEh1bwmDX~~AxWaMo{cM4eW8L|FoXh&j5G|fHZL*;=Jf>%Zt3k> z0474(((6Rl&>Z6EO3RJN8DsR$zR-#+3{o2`r6lO!0a-^%P9@f#Xo@}TE;0#{Lg#!4k_W+8uzjV4IKNQ}e1~&> zqdD*$GsrP1eF4Qbtkgki_Yg6bn(9t4+>F1DJ2{7SX~z|oIB7jNObW{o5oeCi8RYQm z#9>4LAEHu@RGJ5*kj~*HLpWS$3zz~0sbppp5^6h^M_8L#X=y~OvQbT5jGWzQbXN|3LIXw$q5L&;Vc3pCd5SEq&{$qgg=kUGn6V5NC)Y?*ShtW zNQXkL+n%8hHNEReYS5MDEf?whRL!(O(?U$C`mK+V>EOQGa+tLtf+QA>e3PY+xdAqq zUKqdH&K2BY^pPbt0k&6j{mOV@iH$eZuQY=Vp~YYn%%mo=#F||mJST(&8OTynv*4-HAo#w=5Y;Xya6SrrO?H_Ui){JI$*wo_a-(Yt1S|8a2 z>U-#|5QCD8^YQ-oP5$%dbvK@QTC@MKcs3|)-AjS~E@_>`-)S;Z<2|yEI%Hd#K{Rr%T)Gsgwi(-&%{el>Oi^<>0Ge0ztd1#?wATEz(#O+gm zYYdU_%s{LL5vK?-7Es96fe@s>9YjnA*a2yPWPk-A0s24-D|qa~K*6>TfmL7?_!RId z;BMe<;IqJIfqQ{_fic*(^@XGms%?N>tT)ODjVinva6iBYK;IyU zV7)jUDpcuG-f{>fobjMz@skkO>-0}06DDnR{b4mW4RaLr%yT~v@Z7DBM$r9yHJ=)+ zwJ+f-wD_~&s9M~xAwgu_ov&GUA93urewTJ)ef8Xg?u>j&>b%z(%`Y?yFW=*5rGFlJ z@^KJF*7sNC>A@0X?GbsZb+^&F`+}o&BWwzN!SDMJ!Q4RkI32AU{*s^X%P}Z#VkzJc zn=x}s>zcvG)>ztS1nCCXPGW)jI#ITJE7JbK1^3fWSL~!3Jsnw!3?9&Mt7QQ=$65r1 zW@ny;1nW+hsy_r4aRaj{&j|EazR?O+P)^T1_gn6H_V@NHu(8lL5vomff$RR>OT#^vanC-*+Sm?hIvAbjG~+3V zJbAKTmE^I0HA%J<%O*@ndn5^`s`gyN|4KNZ5#BS3zRL$Wj^@)V!1=S2s>C^h`mCav zWy`5#9JB}(p2CAX+;S~?1vk@*pAp|j^GSVe>?u^#iGB04!NSj5>d2K2tNLxF<)N}O z*4+u%Qg$?NoPag+OFU}+o^(DAkQe_qe59{W;WM9tXdMeR&*xYNEzhA3;3)7#fWDAu4h$ z8+C5KQ63}ufGxN^mI|qFSWV5Ic5Z)+Y!gB06okAZANY1qpuw4+4+i`pvM{TObH(4A zziynr_wJ3!(Y)Gx&FS^^Jg146rq_+e6uog|G`lumS9+u~ni;a%hwT$=_R^SBuJK+{ zQ&Cz)Yb<$CU(u(_L$JWnFEdHFy1zi|t(3F#{tME&89m3rSQ*c3)sI-PP`SX`xNV$} z&D4xXQ{Fd$|8m@!=a3YW!h$;x2Zr5MyjxNGdo@oLy)T)&#AI93h%ybXHG!#w{ijIS z1nyHCpFr28$K#Z_p~4T*IF)YC{YV21rx?8!Grq)HA`>VKZwgWXM9U%`Vy&eC>5W;w zlk)KQ#wd1Hn1-BU8%b%((O!huC`2(z&?o-*>fbwoR_5$&s1kTe~ zB8jBYvHS2=D4yL|+^6A@of|c!6Z>g&Tmk#S(Oi)w5s4nBVDFb|ODCp7_Z@<%ZA~Bv z6pEcRERS#sJ_j4Z>&TFQx4uE7#Nq*u$Rfyw?k@b6^zH>(XropU-6=_ee-0^TbiU$- zB{|rg*=QNuNl`vQ_&5q@tvDf%TY|=n=3=oX)$^xwVu2bn_NF=E4ZFNF2tJqIMzN!j~f1EgGkIVmY_^=GKT5K;nh5wq8(X5kWJ1#-@& zyvR5aCCOU*J#y^zl??uont!d?&{7ne&`9z8E%sOnkGvNu+=E)$!3gZB zehiJ|FcP!EQ)FUpq0j8la%g4_Y}oHHU}ALiR>!d3oIEP0#=WlqnF*SH_9pGVVc*d& zXb8lG>NyF`>(hLzL4sNHuLcRu*aU{3`nGRr<^*(NCrIR0{o6v37A4kuZaIz;gp0W(Z2AkhF`c?auV2IV zKRStCpoMRt2Ii9Jjq@#$oDnN+UnbzwjKRG`^3C^OG*$mtn@z0IQZkVVS76X;`>1Tb zM|KWZcfaCO1zuE^w>+=qw$~gI;X5$twlK3As(ARhTYiPgD-B)Ho5U8?h?_6DYgDb*m~{W4G$FuvmeY45z-RSJU?GKwSPS zel+8ygBgvq?;Myd!JqYGV;r3>RM^W;EtTRZ#$w(}d(qkX|7S`z7eK=QG9GHCywO>`aQw4&Wi3yx7PQ`JWQnw%HNfi9PagC*w z6gH%wb1CM)ZMZp$T{U0!WThbJGCF-1Cd)Spef!8c{iusYGh%x=E@-PCQ{?2|$M|>T zb?%UG>ZXV?C~`*TbDvlq9JD#DyWctI=QD~dGKmeQ)?ZhIQqtvkl)`^_^HA*(#Z(-j zBk+=Mt%j2~sRkUMvDS8i&Y+Fr#?lXT;xxf&?%xLgp~SPYWG$w(&`kBpI^oM+p-4_x zV2PyZuq!H4v$UL=R5{7F$v8RWGQzO2KZ319GnkQeB&RGD7Xt!isfQ!%=$)AIM$RWf z=p2$}yi++7w1Lh${57ct3=5EQJ4lh|_-o7tc_t!`8&btM!5_gJoU9vQpb1>ljLxp* z5Zt_$V3=m?8cR-1Hu-Nrb0lL3Xoi*Hl9I-!p!?7dKwHpdUpPg# zgh#nc{jULsXF3l(1P^WZ3#gNb<5Ks+$74%3>WMrOk5>!Y{0FA5id+wCUWg~4E6ca4 z4iHm;5ARtquV8wS&?@|}SM)s6SFqoi7ougaV!ul-=Jujg1e5*l2{;=v@n;3V2Nbea8*VqM*Sr>ECY-YLL`fOi3J0uBKV0A2#X?(-q+KL11e9p{8b z6;20C2RH$`W$5o{zuR#KN)h%u7e2qhe)lYBK|4_7hCTT102tti+TE_O-%-rJ&3?!8 zjOH_7<S8-hEVeO|<#j-sDMjVw*di$9D{XFUphd+rEKVTi%z+6MCo;JluhH@q zH^R&qprrp!h7fCwrEn60IW@_f^>w!TBtj~1Wg@weLP=gv(3CV<><(Fni;TM7Ls~w! z9Oap$4=lse%gaS{R%jox3{Mx!aE7x6A3FYMt$hN?=wyR5UM$4}P~d1OejrfzE-kqu zqoZqZEl|UK*vb!cYTlLCVwL}{D1jE@dcLUiVpNs~(WM8$3f3J^I`G{7E$0f8B-xo$ zlV+{`6$*AJX%Al~s&;u2aHwt@qR=Y7?Xp#TD>lXu6q0TgG#`V0Ml`=0SlP*GzGi@C zoRvo<7)t-6`~tK;<-^NJ1Hn&#p7L@kmTG z*>W>p6Q`@0GjXEaE>8>1+Q2No#@kQkK(WPN{c8zUD}FbW75v()I+0pi_G@z_yk;9; z=3_c1wLhzA4dbSgEe}XkkYZ!lLtbjh!6_+m)jV8U^1DS?P(~8;5A4^`PT+hg@J&kv zJyvz-kbC|unak&AW}@DB*?_7}cegMydz`$I*1AVfKEGH6V^AN|=)n9ww%)=XGE)ui z4Ouq$tG7u8xzJq}`ld}=woO`Di5wD}JlfFL$&TcmLh$~8pNIF}5;v19~K0L$NnTe-X=4j?)(p;?VDL+%-w=!82b_>0x71MnG07{}P#mH{i(TC*x@; zykx+`l?XStDkc68OmdQlfY6(v^(0I-??HE-UVBcyu4g|Q-+&ikfYHHQ0%IeoTdUXC|QL; z$q_Xu{dHT?6xfok6}F_2gSMmxv`A9uf&Pd&^uVQvDf9ptk1TrrccV;AT} zd>V=6Gz%seqf8hzV7EGn__M%-8+0aIBbWfQRcnBLqz8;#D?VBl#NZx>?pPJB*F*Wz z@?FSeER5%Qc43Ope@zKmzx;JJy9u(w^Ax=Ch$s$oQcT(9*)BXhKEgXY;fcp)J_Kr{ zZwR0Ft!1e~j%lOLmugXgF@_nH)(QIl{=KjA~=2*Z1K;fC=|hdZ5N=o&vma8>AV0g7#rXGA-bdj33gvwec{k%duE;v-W)AMt$ zz4oB*WO_`ql>cbwFlTnBeB|1uG!1XAMK*P7v2;wppGU_73=iYrb0no(OCmq-Xtf!$ zWvgT-&h4R*lXap2<=jB!Ok9Bb44>mrcs4@$6PD^sd_ityhvj!*7Vp4Y+RJg*IbP2W z*Vjg?hsh#?-%SehdjWcV7TXdJT5G$IKV9Ofu?(r&lHcb4`tIH7q|;rW@L_O-JPGAb zC|Z!+w=ORG-HkCZA7%IAs{>yx*$0%Qh05Dm2eS`|cjocd6|CKlG$7-i<6QxutJHR! zP98f>&srno%s_CCZWWp;6!;!;t6?T(Sj0GcmWYg@5`!r_yVrLnmK-&|JpUuepQ`_=elY?JD2X1az?c(7yyVi}v|& zsNxS~Qt=ucf2^#TnlpR)F&t}8#2hi^AeKoLkp%t5#_}n6$c~??xbJGGDy(#>!W$#b zRV=3qZv0pUYr*Y$I#{6}s=(Do&-Ds*Z^1!SOmxg zOb0j-Cl2^p0R8)Uz+`v{a0u`o;4DDG4=5%B(gB%(d4NTLHGoZkAmIN1o&oFuv;f`( zoC5R#M&cJZt^-U5|;m+Xb0>AJWqhIeSjl?4*_QZ zQpjW&1F!>b1w4s(TLC_R7qA>q1egW59xw)A0DO$N?*Q5W`vAKDPXV?A9tCU$tONWL zU>Tqoa1H84|F(j!PXL|=>;<#~J_LLY*o5)97O)IZ0GI{177zoVf3m^g!)Int+>(JPyUvx)DDLR}@4^zu+G(fEX@^B%i^Mv5Bll0Cg3PRDD6({4Wu=@NbA) zfbzOg9$9F4}{$qBoj<6ubV0 zxKSFOctNz8?dLHz>P)M3yi3Q1=Y+pY$L&$~^TNMf$FBbn?oJ(7{X)16zZAGZ$A(?P zU8Unr9lLhu>2+MysHgv_o?geUox*KCXtfOUKUttH;yv>Su+!TgSei z>EZt>u>ial4Lf|E7oQxIxG5I<`HjhwHdO$L%`K{C5%FpyTeS`}@K_^9KUA z>$qyWaNB+;@D3ek{z$l+bnN=EaChst;c?;4{E5KrI(GdZ-K}GnUhjs0@W*31ydPBQ zxKqb2rl-@fYpd?ou`8sfe@x(AI$pg^xNQx(zm8qs6Yg#uH`EBXbF=QR;~ftRx67x8 zZxJ~25rNbF0^4c@Zqjj8ogV(E!0kHreOI_M>jm!AvF95mz6t$RvFZ`&zbbA}1U-fg z0$1s{Q^&52!oNw!nVW=rhmLIz2)9qi-8x?Vpzv?kvF{<_&a4)=Q^)OIJ^eTJ@cZ>} z9XEVSxSih?xLe0N{zbT5RRSBnBk(RAuU;qIw)MKdj$N{Fck5X7>iqkP*rTWWs<^#E z(9?OhPS-sG8&(Qzs}wkWmB5*+1$N#mubO+L%XD0(W4DgWb-Y|)&;5G; z|B6`srrv&E5!-SE9o;%^pCjD690E7w3S5;ZuxqZsnYRmUa|+z8v-Zf9)hWP?l z6$tDq6gaa;56{rUr|aP}^zfMi+in)PTgUC0!oBNj0yo?u@aimqGiM2Gm@RO-j(6ND z+*P*;?93K;^?wT7pySTT!ks=v57+T79UJVzze>l^^j{Sl(nNl{bi8_kaNDjExJk!8 zoxaO))kG05Jzd~-9s4E;ccxyS%hN^OJI0E5wp4+AI_}o->T$aN7nI+whdZwo@pkDr zeY|it=r~&5<=8n|Pp9MbWIdgZ4JpEXdAg{(N)PYUv1^Qo-=yPAy?)X7mt*x`Og1`+ z;?c4CZQ;H=-rvh@7^T-&$LZGy_bwe*>3sitVMC(MFCF_V!tG2F_`j>SVWgg3$3Cl` z-uAbpcbY}K1|4_mI5S>Puj5V~I}?Qe4jp^GgL~6xKeb9=PZXmaY310dk5kuFk*-O{ znb+&?exuO4{?2^2ac*9Xf8;v2BF#cj~|NsB}|DPWZPR?D<-OfGt+;i`{_f3h+M`CrR@E6Y#c&o%aI^=vR zaq&D6-y`u>iJPlLc;7!{d;TeK^M?ZWO1wdaGwE0QMSPFMeG;o5iE!m(fm0Iq$ndQa z_sa0%PXt}x`!d}J(*Jkq-zjjj4BsGevkc!Lai0uVWV${XuE=&Z%kT{nH_Px168HU8 zl%sAJxJTlCiJSi>!Z%CI-WC3o#C;O0@5%HM_e`7(dqem&`oXwa#`j9B zyea5=B<_=Va5~N3`>LQ6ci2MfkTqBe3$Uz$uA)B`$tWga;*FCo%h-q?dTJ z#O!%VFY#uHRoTuRT|!@OmgTp1j3V@x|;j3KIZ;5>6ds%tMDtw7Zmr;EGSORDkxS?C@9_vP-hnu7taBdA`Gw< z&`<6Y3yOn)X29mH^kJ9$Grs}9-Dco^b%DBI!~tU_6yZ6n5TBqbIF_-3U_-S*odAM@ z5iA(w_s^(a*zaZApAa%esmB1e!B2Av#ba-nJr6(4@tVIEezMufk4r1;KKSVnGgXNE z8{x+>=Un`H_$i#|Dg0{qsT|F}7JjOS=3fmzZQ;^G^ef<})5(-S`Lpnk2iEB0@E@h~ zN8s0vTT#81z&{a~(v!ale*Ah%&R+vR_Q82uDLw%IAv(VsethGdmq+nt`0>l%Isa_< z=>{M@6h9sQN!%y=li|m=X>;_4!hfXBKNkMU@KgPWuSM|VQ--`g6i@!!;GYGo#jl5drY`L@z>i?_TM~^$biVLgH<)!$BmhzbS6SA@u-qbDzQW?8wOf$fvUon=X@$>?NIr(xp1nQDs>yo$U<8 zmDbKgnDSP_p?I7ZK=m>YoBx@~M6^4WJu#Feq-3dyxq2BKlrG=yWGae`lZi|ce27Gs z#lkvT$)jj@DjLp4Bb+mNE;8bef%B&mB}$r(&UiMKZBIu-5pXEHbTIw!e36MFp==1% z9XBS_l1QdIz<^Xb*_IAgW)ku75jVDoDqD@I9V~H#m1B67P5y8*eSU8=`BwMq}!dQm7s{Di#lm;oBHL;d- zD7~EIcMOD53$7rUoib)jP&CR3@nxl@rOd6hG7*AgcP5r5l3fX}ko%D}BZ?0M&=`0S z_));TXtpMl$@(E0%c8+#sxyV(4~|OzqF5r5>|(XiOeWM8ElYO$S!X7iHW^DJ@i^WW zIXgO>nGB2InXS~~QOL0z534;fav~55)-vV?1ft<+M@uwK?WjvG%em{r*(3!wMpIcW z(BIkCnaMJCQfHjE`y|K(rSqrKF%-*cL+NlkaAmY5-6?r@7zi>F;eveFmv~3r)G~q<>*$`qyW|qk?Ud&QDD|fZ!>_fm$-1;XczIy@{30k$nSu{`JK`9@?bO#`>G?92uI74m`yRu6mqI?YB{LBq9A4&hv zc4~2DEFSe|v*}n%XEvHa%|>dqL}SJkpq6`3oKERv-2<^Sn3GIXn|5nljrrO4c*@Rr zJQ&Kh*TEV<{86ktp3Fq6LWxK`%FL`B_Ek2@vu8IIHc7)MD%inh7dAvQuxF%~t)fze z$KTpYrtb3EP-ZFfQb{mG!v07k4O@Y+<0zyy8R?A6vQYL(vNSC>gY@$bNBpQgdJTPW zc4ssZUe2}`)RH||wmchcN-l~;qUG(F!#~sYpq>kpQ14KLTE*DG8vhz$ld}`3ML8M! zec_@|EL)jOH^MfHN9$Y80wdYK1P?=5)ak9lMG!#FAY50HeHA1ljx3p13u;5Dg|TQ? zeJd|)bK!zS$AA!vj>Di$p&aBIqMRxc5t)p2P#v3M;iX(m8C%CHVR-SLVn5;Tx@fl$ z0(Ld`SH{vA8NmKZya~jXVf{_{G%nA;kP0TdqUpvgj2raEMfrXUrejI8XgQk%Nr;Bh z<;jkYG6(@=+eTD6e_>&;Gu?)v)6v0PT3i#>OUce`hB>qlE&)a=xqewR9Y-Uh5fYnt zmK{l$t2NR5f*^laDfkCZ6L?M3JP722!+ECTncArP>4V8?;<}} zD2*7S)Pb7{yD~6E6WLZjI|rkC85Vq4ZbTbMd{{r1%6JTFg$JBQZ4#DrFp1tMVE)Ki zux~|>NVAYyA_8iXTt+T0sLoJaMMny~HJRdTqlr%T^TMuWxx(2Q`MjGTBH)QiArR?k zTN*kqA}#na3<@R`ZWm*(I+5zkvX*?ABA7-nm_S-^G{x#&Rq~Yd4r31^k4P|tPN8FoWzn`+Li#QREvAO#aw!NSpaUTKnP{M#eM5Z( zd_9*eLEvXg@?33b!<=&mkEPoA*=1U8yf-XF$z6-{X|x{HC}kfUK|I}Kt#t|dIS_9v z>&#}8iSqVncqtYT>;cIUnUob$T966um>4I_CByEGE?x-2Y^sk;Awnh~BoUE8Ip#k| zd=uw2- zAiEu0gQqA}egX#dHM}=zfXAch5GGDcxu-~7A*x(~buP4hd$LR8|Hrx#LK&K)Z{)dD zW6Q(OE`{F5fRi;4@fV@@$r=!xJ2fvI!8kU4Iym=EqZW%IbfFtW&K;pPny~|vk}HY7 z6hM9C8N`mG7%9_-QBEgEm-As+6Iu=xEob~J^b?lsTuA+_MDRG#si`tHO$#B>st&NJ zdcT~H-sU9>C6VhO_GoU5lI`}f)OtcQ2u*MyWP5OrEDOcrG}akg&{)x+>FQSsNLs7Q z%9HVAx=F-u0?+wQS}+7g(roYysN&FxTENrNFDGtxqU=Rvl(QFSX|q7GBZWN}l#Jod zg0gqW-6-8!F0Zk9kyvHCGecVpgEXNSfwo~}rBi&aQz*yw%SzS;QOTgG7 zi?|m1HBCus?}wBw&k|U8Q8q77ExYkRk^xfnWDQCAJBY#>Vae;l!pV+EyiMzS?ESPy z>nT$uGX@s6EsB5tc3ah=bs-i|S8Lnrv9gG&rHOP;-|Ku1d#}_5n zaX(7p=El!h7n)VynMFV#x~x2uBE4|0F0`(*0}&avMGGU|u*WqYH!T@^Nb?8N(NriM zt%B`J)@832z95kr7_&)>5hfz$K3NlP+~U0tucw#;qcHd)>>91+vZ9Rrh=-igjglb_m& zNYbO%d3E!Xki(RV7D(VXNArB@ajY^ z{4rjWV0EH3$sQ!PzdXp8f$NEiT5>lET|h=^)AAIJ3_iAnuBVVijNM+?6whe9XSa|~ z*5_7o^O~MbGmFk{zl~z3(bUDPgJQ*;E$4>@QEo&| ziPfP_E8NR%{fhiPHP(61UqnND|_7t#t`2764rIE z;+z(64_>zD06;JDRPmB8 z1qi}D7hyrr6a$)#jBP;JX2kX4Wm+FFz3>a7K5c*%fOUYo0Z#+o27CpWcs=gu0piG7U8>}Ylj zJC-SI3Y&@*N2l4&wbz+&>TEl1OUyMh3N8=D!<})m_((42s#;*Y3`Q?kXn8^&7KpZV zw$&xGvDW2-W0K)cvf+k|#M(8ybYKiEwK2^2N}Im}%4o$?Og3M*w2A)!GUqEf#+q0N>UZ93Yr~r7Ev5`+l4!R_lV-ffFPg- z5CFIVX25K~biic5p@6Y~BEZ*ojVS&UuoJKy&jg7;2A(KU<+U~U?X4y z;5xuMz#2dgpc{|^v;&#}ivdAE6<{vF4p0Fl00l4!Pz)Fi;5-H1btmco(0IH1sez1<-H+?zsRrzz#42R2`lTcL`uRKmkkw6az*B7+}}!XfI#~ppO83yA7}v z@C>;TwiWOUpck+Ouo#r$pa;+mNCDab&49&#AfO5`7cf|U?Fdr=B>)95 zxctHNV?nd)HuMvqAFva!1F#*?2k1we-T>ZPJoWK5(7X)T3V0sy4B$yXFW?ct-r~0) z{yxBFz$U;(z-@pHfc1du039jDGT4R4v_RfFaONh6^<@K~48M(Di?c={Ko2v4z6q$ec>QtYrH4FMdBkPrSd6;D~YzuaF|9w;j>4Wcm>VB{^a9+V!SOD>-lT6qM!VZeLyDrH zKB=(IkNR+b2ln!aASD^9_lH1#R!0h{kzVJf@bX}J1@)m{;&M-rstG;_90Y^N4@}L# z+cxk7&;p?J)WJkRZ6X4^s7bcA=F2My&txr~nJ}f(>QE9AVU!2a<5di+u4}5V#A!~H zQ&Nt@u4M}vx$uzRFa1;o(bWNG@DAArOnFm%u#$*^jVu(2a6Y9@FmTDrw0CABC?M>K zQ56_A_FH3Z_~p$+IME8s`D9jgrNlb{ z1_?qDkgaI8Jqn$d&L)IxWfK`{9Q*_s(whxU)vTm$K}`+n74!t>P+tS{J}+-<;$x~& zbS2u{NFu??YZ|zt+yi_v^1xr}14vAuLf|S&*w9obWT~mH5y9jqXe9lt8jL2h#cH!V zLM`D)6eCR^Mq0K4qX=iMQQ;Y341d|lxJF>)j~35?2ghci!`fIJlS@1kXPM3x>LbFKZE*Iq{*;PFg|`I`oB@YB z4gSxoZ(M+GW-S@?38!nS2V!;gLH@0FU^Dq~SeC~pk|`bz%){r^3%v^da0d-0q@k=> zhSGrn>1-JFOYyLpa?WB_Q(iJ7g1&=9(3B=*W(L{~X%0f+@^KGgn>GU@00eZ>09(au zfjD`qL}D4d5X8w=ylhlD=zR&kOAk;^gG_^YB6rF^!ux>dhmpZ?C?hdwRZoCAC1CIb zNQNTtMBw1%!Vmt@lq~cba49NS3LKab0rT;Wi(~2&xG)iOjLx1x0~55wBwi*kjT0cm zHOz>BhWwc7;rAc_eIxTqQ=3t1$^&kZ9)#$tvW4jRdG!lx>Y%&MLSI9ti$3JxHT4uu zeM#j~pAnv|pm%t$V;&50c8KDQ473+bNJK+p6{oiaPcw}*q`_+sIH67CH>!u<%`Ju8L#KDgCY!o3OZt@mM9_q84 zR$dejcSD7rCe%PZtXqyN7B@k02I_$^YjJEOj8}tA4Z;s)!NZ~Z0`+Bnm=nM?)ui77 z_469);Rw_>`Js-1kq^fW4OD1jMQt?@!W-(T7D(r><^Jk`sB?LJpn}57>qWg9PpRek z)l`#i4b)fBl8KX)1V&;pYuUof;~TIqJY0k2dhe zPg9`Z02QQn;V9=oA&gB`rn2&?2JT)0ZMP%=$l|^r!e=a27;44i&IK*_q|88XC$f&+wwq)<&@2b1)`p-B{l zX_7{_jG7<7UIritAUV|Z*^ZcV}2iX&SJ-BaqqF$I@`Q%1N;mQd1B z7&-FzvVxmpFn>pNWbtSLo$VE@A1oG2_MzZgswK5v=}r#oKW{0uJPd#&zL* zh|+?)R+(sPXMFa!F*wGpEUIp*!qQCf*PWs)f`t3)noe z7c>Ox8!J%pM(~E1v=^qf@?OD}z(_QUV^|s9+*8nt8PqC{dwFW+2Xcmrc*k!9B{TLli`fvr*{-_5|roF zh+}U!%aKvE133ymk+Vm&H99Ikm`tOIIL8c@;VNdytWxO9nT#WbSI|5-L*cV16ekIw zhp?rvWJ&3g85!8eIM++VdkIboVJzZM#1fpq#PM5x4jgL^tY@&6;k=m9i62oDN&wv~ z*}$7}a&3*038!Nz43BomI`0i)2hpWF6A3h{bj$(_bS@F7>Fl~_mx5R7ofuM4+|f)b zIQW9G2{B9{24}qGyL&LRDyWp<0%v-;B3}4XYpQ~-S*1{<)F{n8TzhGDT@*@FC7eoA zdO0u^NLMnU6O<&s2Y`wb1F3$4`xBxLMuu@j3g?aE%Q0l=xH~C_5Sq||s~E^DlPy)s zq8M^fo-vh?%Xr!0HCfC>=9c{P>^;8M=&`173AQ zF6mM;6_G_v_Gp-Ipp16lC_1Sx*(-a}m+q6E4}x6dN^x3Sx8~i;aH}h?Fp>O~R~P{X z2EUQ~z_i4{J{u!z@zF1L!Erb;WF%>}K z6p*JhD2xsj5QE5FUU_C!u)gdhaxaah6VbSdmy2;E56DMw@>HGx!-BqCDwB%Z1vq6A zs3BWNnf7SNSP0tw=UNKG##-_hJ=T*jzcX)Xn<4W z`IrYg$oPoiObp#MqZu<-)ZqCd9pzdkOVgxQ8rStWN{1PkI4dSg+V2)UHbqxotxv+@ zkRo&stPV1e(B$E3!E2LO{85t~x-x2V&|fomn;oP#hm3%>odfBm*@RCUAd<8^#-Wdq zxi}~W5}Z$C7HQ0O9-~hqOEx>0=-6DEE|CTZJ%)V`P@u{HJKQ{<|0}hkvYQ5K1anXsZ>HQ`n9hVAftKJmDnN{*ap0)u{QT@4$@=%=#^4`GR+GuIN1feHAyyN zG9BS_V{HiEE>$I*|ygTcP=YIgfzL_RxH{fV&H%0}9ZOhx?QoZ!YGov9R8&|v!}5|~0_bn=qVhikAWMZkW8y_y5ZF}Jo^ zE-Fs1GhtVzml98AmBN+;E^klb;woglm7n9s${b-r#zSr=`N7ujgpLduzxYX;w=!8S%t$!c~| zPM3+n>ZH6;Po1b|6x>lHNuzLW$m9b#kK}4k7s~qr8~?(z!%ov6yN=q=ZIiv!l~xfg zx$#Gv_qZxVdmz$@g}r8M=*>9E8;mMkjU)bGy__cH`fbXinj#6z5nd2gfr5rCDK}QC z+wf@~ZbCv=YGXl>p=4WWl$e+J9H3*bQjLMbd0tO*9H%VF%+#l%_`T;#6r^8aNKuVj z=~}g7v{=j`@gLG6W)9V|p zh19PUKHNAEVkXiGcYcWHN1%RGK_81T?9`N+Hi-D{nl_G6aEs6nQ)Rw0VpB0@Z~&aH ztD{<4JgG`K$I!6Png5y|=9aCPgSbj#L4M5^8+lnJNi4<(rLb@(VT4?W?k0Nzj2APN zP^zW6GGaLa;d3Sx3!N@x0peUM>~i8=E*G`7fW`+ zfX3?WDiK$zFDKVdirZ@=QJ%~@R~okyP#V<*b2{V_eFz&xUjbP@=e3OEbuZ6tkSN>? zQJ|5qJ%hf{Hck|7mQZ*Y;o5wz;O1$T%qWCY!D0#)9&VRt;rTgS>%(DXKtD?VGkJiO zrU?V;Q~+RXWpUw@9~g?tE@(I)d{Jif>Wi-)bNi+DkNxdsua1B3iZ6`8`Fzfw0eh*o zVF7o`>q$H{{V9~L3BV(y``aKYUjs@fDR-?na#(x-s6EigNoCkk9VPB^|*tc!oAUC7ul#(KGqw2uY=qauG!R$ z%R5?=1jmkqCBXtjKI~IMtrJ-H<|B2i5*M1`-ph#SJTBfGMDMoYxo}7vMB6^5H=KH zo?t@40s~_*N#XSgy1|(DgPe3o?$ama=Zh*}zUJ4(Xs=C{R7Jb!I`tgdJi=Zt_IYv1 z$=tn!Cs@MU9?r6o)@ux7tf*hIj= z5-5BMfWqk=8~OdxUoQPYU`o>0Qv?u8Cq0VY6sEx z0I1F@C0+$g@jn1i{AvK@^FzQ)z>U&>GceWfHUO1(CxGZ408ssY51{zh02Dt73?u$% zPeEZ3v4`CTMmMiozG{k$xZ^G1xcPR0SKie3HM!=V*TeBf&_90b>$fT*dXK*=|1E;% zN__vfr1wkuUxEG)w`{-VNcOi|cHDx)!h@b%{^#AyQ_P28%zyoi*A;f=>u0@Amgm4{ zRbdP(l-IT~)#BlKLOb6*BG9|Q=$T<5+*=U%6CV+`i# zuhhA((zzkNT>nr%>cwi;>ok``hF0Q^8sKHXR>1RsX8=zE9s%43*aX-BxEin)&;wWj z=mul~DL@?14u}An0ZRaj0Zo7)pbFpym;ti^L_Zxc8E`0IG=KpPzzuJsbawyqk*l3FpgaGw4N1@wX=>=CA&b@NSI`N&Xj}VBo)&{%h3D{f4NY zrU$g@=>6nA1`#g6sQ~KJYXSEIUIu&um{@>y9iR@-0npOWi<(maT>!`&z7ELPOMs67 zbP(}GKrJ8+*#GS3!2fIxjN!IQGt42DSCVT0+0{&a#Yzy#s__qR+ zlGy=F^D8px`3PtdFnRM&A!~<6ML5}IRYSznFlv>$l8I=21et1(!lt1QcnhWGjJC8 z8DQG%>jPc}44b)!^a_47r-yV>2{73UbAicTSPcAq;1uu*;5EQ>=6eJ1dB9tM&j;QL z+ylG=cqK55Z1U=!LiSr2I+GCoG_blyd;#Z6)ezwkrt!_ce4gwGu&JUC2v^DyD5VZwWc z312r%_=aJ^HxCouJ52c2VZ!@{3GW{!oEuU@@R?tV86sT48fV}m`b!-qeC{ye!C}Ii zhY3#&6W%jS__|@jHw+WLd6@9tVZyf#6W%vWc>gfrd;vXxp;G=~G#CH2i1bPBQJyMd zJ99pa!550y4pOG_*#c!#qO)~IzgWc1B4sb1?pKOfLg(MHt%z;crQiDJB79*w|Mb35 z#Im}0`&&hfY%cA2=Efp+lCHc-sH{;}-{5UU>@T`_^^PKTy)M748;kI*TP-)}(z}cB zQ@(lsx=ls+T65kX{CN>`>kR&NP_m!rquH7Vi|~EEe87gE6ybY-dH=eHitwFPo&S*{ z)~fR>*TJtVf6etptX&u1e?t+sL$w?fjL zridM^D{u5WMcBp5KkMMXKJR6_-Yy#OPO$HfMfg5l{@MB*n6K;KZuHlAy8JgIo@{OH z>1EIKkek-oWIZ=@kZo?oFF|DB&hAm>VZ6+! zuFQeu9Xp^rJ1@_%kMhb{l69hN;&@t?NM@GS&SQC*t+_HqiFw}6)Rk%CyfqEW+b9d8 zv;??HJf?pA_WYj7>(Q30hu}HY2D{a~PyEb-ejSgx@7~=5**RHOwE%u{_5dJra%y}E z-&Cfjl5;)+7vCo+*q2Q4MEFw}90kdpD&>l#K+8#C$6-y_jy7fo=qpND#-;>I*(iK7 zW+rRKaM`{40xd(1N1!d2AzuS_7Q#HfXF$GwaI74^s#iTA6?qDR2jJ_G)c%l6cO1S( zL(;npEu=oCF{6KoZzst#Ex9yxNYRa&4}J=84OQe%Lz*~Tjus}+qfx#SO8qd9&&U$b zz4($PJye$@Bs&IblC%X57OE}dsdI$znzY1iPq$h-L+NaQSq@S`}hDL+0Bu_(?sEx%&HXpiv&#|cKjgeT0 zG=LugKAy{YZd4kTp`gV>m8@~Kaoo*(ypO~#cpSW*hdh43>rQ`!E*L4xuRvT6#-q^X zrP%AzcDn@KY)Mxs=>n(&$tP(;?HS0Ykp&xggdepeE>L|d(CeMhdUnL@eO4MV8r_O# z6gvQC1`frDAxYl7Tku}Q9gVnakxvol4KECTgg!nRZ!+#joJdFgkb;a;PqabfP+jf< z&>UxAG}DwLlwxUg5N$ic=D{CjZ}FB=uP#N{arj5t_?7=ko_Q@d|o9yuMcG1;uw`gMV1O#HVSLv zeL|`7Y0Ny$-(?!1&6XiuUaM6iRUH44$dB@>g^RSiCb9Xv=JLFD^1K?sj|8Mdv_;dH zng$&lAF>X_((iX%X;0p2%%~4K=5I3UMZf}$FiRKzG{R-5w8_k6t!F@ z)41z^1W}vyJ=4HBK$51_70WI;7DnOQ_1%2j_Fx3k*viX#zW+Buo+}`K{e#*>GfS3p zcwoIZLSBjfqe1kwyaaxH47x_t;byoR(Nm;5df>`J7OBtZIgpLu_1uWx2&#Z>JBI7S zDkLQNqPljV&BQx=&q!2(>~@(Z&eI&k)0A_bki|S)%6xtB>jtpGM16!MPP&IAxkHXR zp>afkn%>}c8q@R!wUp{c_T;{_MxM{(p?k~0w@*0Vf;>HGPXmCorGlo#F{;||Pty{b z+^s-b;`yh;rp>QmH0?nx(9(}b?tY~IY*2b*u56Mxl2xtbeA*SDp|U?8Hto=5YxBo= z@OwsX{>ZnR%GSoPBJGzRwvzX+8S98&K-YhPGFOVOz+a&+|BARVh}*^Mlb>I;J|>&( zAIMMivA(Z_X2#dHz-{qp{Y&rfS+0MB-~!EHGO)!=-|u2)0@HjH#vDoWVw#ySw=zgA&4&?QAA`(ElsAse z(v?Ru16ki>BZ~)LlIJ{~jkV|Fun3bFGZ)CXfjqP3#wlrcS~H19Yu9{TKjL>S(0>Eh ztD3bW=(}L&6zBM$^}C?a`guG%4fPz${-y6{MaV!G;wB^ROI=*PzH`}C;EU*Enps*o z*M$7iNTUAJR+zFGvVS&WCY+e7*CNnSDp4YurH`un)#@&thoq+sWckoIKXG;o%oQ=YGe-`r& z)5)3E-=o0!^H9b&x<1wNzW{M#5chAy^>C|spxu0hjNi@U7fKchS)(zZ$@NLzHYQ6+ z^e>Gsp|LexqxI(~NOeB#;B|pE|LS>~&p}&HQDvyFL_f_bxRcjz=(OK%Cja(31Jr+y zuq$QXiFI;*Cql9bG@nYE;nva`CCwS5Kzk|r;$!TsiJ4ooM+WjC44w{UmC%UFK!=c3 zqF@|~^}Pb0SgmSh5vH+0{da7^bUvP`JpF@Tv_SlL#E)i$MO2?vuwpgaL_rN&QHHR= z$;#Ht{+{`KkLN>rgYs#~S#9hzgpJ^7 zR_3C$@hkQlceC4h%BC!@wIA@2B!VRD$Lfj*Q04;ZS2``+G{%W z={Tgz*RX)k4PpFB=853(c*N1#mDcmLBQsdTi-w6b*T^&zWEyQ{NMnvH)KHEKg8o@a zFZRmz)E`>=#$ue$LHkDW_SGUEe76t%O)Ckp@}OBz)43vVH|jnOrzu7wji#?PojVHa z{*SPabRe%Mtz05pGNW4k4!oK3fb_seh&upu+S-0Ddu|<(&E>R*7mO>|y}J!=nq^y% zi?G#59)|C^;K-Fc|AU}EZ)fRkY zexCkFncnc7(^v8IN6GZY@0`A#r=Kj-o4#}Ug*^SyGQIgbrw`#A>S%ThPahb>zk#y0 z6Qho3kCn6oc{Px>7g~NCXcbNyaoUT!qn<@(yW1|mrWE0Ndbmg$AC_n8HG@pWo z-oG5jX@nk$g04yVn0VZZiv>?*3D)pQ_K4UZekHlqF5<B}1aSu;&Nv_rCM_Pbj57@pH&@1)hls0@ah4(C7Rxy65OEP1XB#3eCFATv#I2BV z4qcqq_Dc~r4efL4;xzt_Wb2{31MCpQ^`Hmzdjr(|f{|i==>>0Vz>V@D@^~0|EJ7ZK z@;qptM63WQy(TjU;bdTb9Zh>{=b$W_5org5P6*K>Wc47dWl8RZl{0XaMpR@|5w@|v zW3{T$Rl^3Tr{G+Ca6o(=Rvs0wGsUCj5gR~56k>g<#jn~UUgV&~-!LFvlwlfFh7E0} zde(tIt6&{y|ACn#y=?}a8NY3lbvvr5tg_d;`nq-od-jSYQ3b*|nEO-$09yce2P zlBQ-aG(kyo(q3q8kTkVJ(Bx(LZOHQRtO_(F%eBzJ;t}%lIQq(?lNW7;O>eLRYgX`gJ|~^P)5$EQ%(H?|c--uPalAZM@D-1n!{ca{5|758huPa0r^mBK#1nsL z-%h-Zq+MBB=ZJlAtwhcK$Fcy=FXY%E>zej<7a|Sq4Uwg{uT{F>KmDHH{2c$ad}yy; z%X)3N3{8S8;kv}Gl)AB`oU&kuw4*xOz}n~WdMmLJ&e z^|IacZbQ8D-*a8@?c0BPuKoJ_sJ;1<6W@goG4NqF_;BJ7d>FqEJ}mi`d=Tru_2_YW z^z|OaZP-lTVfezc257VXUsPB#O;(=vvgF=V<1 zq#;=toW_Xr_G8$YL#D~^UsEb=42(w|_BIBV$oS#L0Oh5PgOTLHZxi3eaSdunZ%2na zML;bcem$x6J?)wN40H?7rd7k7M<9J%0&b9=8u*@r-ldUdAU#Z01g)=WHz$pM;>~|< z2O+mUKA3HS&9M;WIJ~cOH-*yfrCXz;S&Z|U_TlNxoc0Ks zI#7%U%~_nLlJi=7ABQ%`e2#?meHdH%AMW>S{{(Dlh`xTblef(!u_Cffk!KO`SeH3e}6z6 z$+MgDk94$n^F4S^W)!p>cAcc1E$sH8PV((r^HSL>dEZ5`&ocvMdj`}?%>SdX^S3xx z9?c_UJq@()zgt1W6r9<87AZ_D@h^Wc8|-@|)t ze2Ke?TcG#o8N6%x-L;~ogXou}{onDOeGAf5BF%SwXHPonZb-S%QN!<@Qwz2C-4meG zj)VU5@$pOJME_QtD8+bchXj8wH=eXT9XjD9o)HC8_?Y|wR>sF+r)MtmyFkWidSn7P zaRtVKe~2-36XHk{mGOEE^{#q4+Gde$Ys8F6rx56kF}=YRkEVCW;=SYE?2&V1{NBc6 z39>v4Kyp#Q#HwVqC}xPiJ>mdsPY;6&fPZlG_Vxl(2#&bYDOVi9v-pLZid3!ku?P0-xCclYbuyY+63K3D7-svm>xgZotgdcUu= z*ItCX`CtG+F~SMN(?g8}pq+&19~|Ghy%%+L@$z-J3%}in*_Og7%TZnXcz9DU%61LJ zlqdxzj-v2>?&x9&LUyT9aNuFwM=pdinLaR2pCLnn~#R~`JL3zpaIqH+z&HC}6UD5$A%tPY@U*>V%q()^0o53p17phM` zE0}cA#EZBe^}!n}nGf#oQHDqqpwz@?xI}(|d0kn_XKKCR%dUxQCW`*!{U!53<77U8 zz&x1`Ts)s_AkdYiK-piSK5XK|L#bYD!bMyxcyjW~e9$hL4{sq=B-<4T1Vldh`s`jg zakZ2uEgvC=$Y&HaWT<>{^}(>_?P3$wOr(6cU(2V9{Jc8E7~U8z&-38TB4_Y9OC@OX z4Eo)>C+FR=$au!bkw9f=+GYm30#NyRP5J2TJ#~lTTy^Fodu+3a@YqS zJw^COG5Y5W90VvpestbQtco-{xf=6jD`p}5W)G)P>5Tw$0K`AWQqZggeC1DX|7mTp z9JL8y_7WEIw?6|cY><7O0B*rPOF{0m7}+tj@1~t`p}Pij0~U91vCm+_ndlSo*MYxO zZ~99iW*%Zeh<18foTSv==UdSa`7#!w47&4^&)WcdSHWCOe{KA)%FCS14nR8Mnb_MR zTO+RHM*cJk-Tasc+8X5D#;LS-=F}2#nwn1c?EQo_6-xUb1?YQ`j(U&E)cTKnq9^iY zm!iyW0DkL^*H_$)pf}-kGDhEb`84Q%&Xa+(gE=!CUjitrfbVgpb2ZCL7JfepGKsI2 zpbaEH8Pq?2t`!md&MnQ~3Scfko4;LOF#aO`O>JcKp>xr6+$WCp|!rq}%4yLWTC?ymC%Ub9A@j?Bb<*dE6+ z)(2z!KLJWh+$m&=Qp~wTH-RyO;wwqSGr9+?R}IBjv1uBSQu^16b4^{kvxQ{{tH%r$ zg$B}AXPDOzs_jKl34!&RPwY(NH`)0=imL@Joj(_+F{vE!%tM;vkgtBvQA;H#3fOJy zY4479xoPgupN6KpnY2T!Jw2>qeFgHIY7UyI2@2Z;+7laY;AS(5me?oOTs&!Rg&1@w!ge0`k}AauR1dX?9!5f(RuGfp(O|ohss%c8iUM&V00w zPP@~IGOFcqxmy8yP8o-Q>>6q-c5mn3@1$HwE&fMy|W zO0hI&(j7dJ-p=Ejb@BC}ptI7H+JV>}b|!Mqzv-rM13x81ZODhGP$I2mv^x+j$WzP_ zLsL;c;w(`Z`D^pxaJPu_qcQ?&nzOYxj()i52FCC;;Z0;wq^m>QX^lzqmU!>Iw{)$T zY3k8S6_RWEyMcQzt%tRtH0?(AaJ0o(cOJ(%M!k_gg+n}Fjr93G(|Szn+rjiSJLp$u z7a;Y%-&5y#dLifs-?!Idd)P&Y&A(+AcPxkd%7&Io@LcTQ;%ipOVIDZH$??GR9wNInm#a@6g`FFzrna2q&9GrL0+Mk8p8f@9Y8LLVC1w zi1hA8y8}$$nxH3*IwlaBKs)kJ2BCxBNYYpl`y=$1o-DV0_1{+^y`uG0=Mb@4{d?H5 zVPds=ag=`-YN7RqCLNU&!5`8)WO?Op7Eo|E(uhz&MRwP6go!hWlzRa?XMG*gYUdye z*!MBQ$ubwQE2NLK(n@wNXhp0^%Mkc{){E8ddDutTWbKF5BPue&3z{W_#) zs-aY!szm8m&G4Hyo~a9(D(Bdz;&*fC#}DxH#!=7I<eE)nhLwb)TpY;uQEjB~&Q99Q0Hlq!A%mzihgU;E@_T z2DX8s=owf85hnhM+SY0eE5%QLMDQ~orSyYM$;2G`ZLV}Oo{=rlQs#JLCC=n{qebtN zM>#_NbL03ilP3BVIL}n8#bIf&nhj=iINWN8v<@mZjvsjL#LugGrq0sE5JM?LV&R?~ z%7=1Jx=++Ng;exDvz#?zzx-0H^O|Vie8^{nw2sC}tZDUu7EylAr1?--LHRIk9-W}G z7HB`2_EzbO4|KvPKQD|PFauNU_}qGpPCDgp5z)-ih7)mACe1Q*isVGpQ=BFjUpyGf z3eeXhZ$Hr&2?p*U49SrFf%`eIp9A|ju%83_Ik2At`#G?m1N%9!p9A|j@c%Cdit!E# zFM$iyG3xi!8LCljSJUc6>XqsSb(8ulwO4&k-Kzds?NfKEU#X)FUPF~(so@;Mora$q z?lU}Wc*^jy;cde~#$$~$jV7bVIL}yXY%`{eoyPNx*BXCfyv4ZD_>l1x<44A^rlU+# zOit5WQ=KVpI@@%qX`Sf?(>iXmLo04T4q?xSUh_z0n5pjMV2gB;&;oZzT*gd9o7IgTqFcRT**_>1Fx$G;s%IOjTRor|3v&Na?oI3IC7?fi@L zYv<9fX)cq?<7#rHU01n&?Aqk|mFst|cU=W;tGnD?=RU=qa9`}c%l)GJP4`Gov1f*- z%9Hdg_gw8!yeE6-dpo^7-b=mLdDnY4cyIG=^ltKQ_TJ~+;(f&1>wVJujQ4r(R`1K+ zZQeJ$ectWf9p0VZe(!9b>NET7KDTeKFW{^4)%b$GCf{P;5?`|~;%oQCeJNko*G-4t z6ny2m04LwoDz!!ps!i%*b&1-nMj#h)HKk_NZgqv)qjo_8eq|^%+Ks0gi%g?UV@<`T zLrs%RlTC_gx~ar8+oYPzCcDXv{_Zhdh<^T+>0#4zrazhtW|z6re1Z8=^Bv|*=+oEC zZ<;?ae`s#CoNHNSS!el?<(HOcEw5VsW;w_@$vVrr(t4rwO6#@OpIEn9`>kJEud>~5 zd)W3g@1>o#Li=d+kPm&b&VGY^qy1<0U)o=^|IJ?HnBX|talFIrsBqls_?hDY$D`<% z*BtLSb~>gwXE{};#Th{FG&*C>wDVl&h0Y&2?{Plwe98H)bEoq_*C8&0Yo4ptwb<2y zep=~T>$=i)gX?D3y{?B`z38u3T<^F(bbanR*nN!K;GXY3)7|0DxL3F@bN|G>(fxDx z{q85+&$+j{|LorG{=og2`zv>WXQJmQ&os|WkHs_BGtX1wS>$Q zd|&x!llpn|*(BAX)~bupOXsK;syC~@Re!I(q5fU{ms)5z$Z)9PXv1-a6AgBQ-*A$l z(XhmjGGqiPO(b%M3cdam^v>rbsu zS>Ld}XDzi^Y)!VP?fbTSY`?Yr(Kg;b9sFvrx7)9=KWKm6{wMp#_J7$&W8_&KXE-_? zmto}n%JDnL+m25iMb7cglbsFDvz%rGis#$eGmn~PXQtwnB zP#;&{SNqj*29IIB;XKIx3x?MXpBTP09Be$os2YRDMaDCYKQsQ*_?hub<0#Y7&}tQ? zlT8avVbgNcTFhTJn_e*e#q@>g-zEpR+hh)#&oN(SzQO#Kc{Jvy6D;#Ai!EnaF0))^ zxgHXHpmiFg_GD|=+GRb@dWrQ`>(4P4ePx|u^V_OySK98j{o3|B%sih$8plJgooM%S z{;suOWq;KESNjOZF^+|fHplsn3msR2w~snrb{y_>I{nUt&W!UC=Vs?`p}}@KKXFcU znO!c|CD2*FgvNT-wbk{h>nq5m54!3+_j>m;?pNIZaDVC^;ThwZ<8ga}o^w6ddT#Z+ z;d!6yoVDEAf4s z8Rur-!@j3|JAAAeZ?|BB90&_!s#>WwsAsFo)C<)0>MiO+>eK2A>TBxTus^yYerlZYfvm3M2NqnT7YCgl<%E!n#=JU*} z&1=k;n{P31G;cBg*8IHrMa*D*=J(A1G=F0Lmzh}(u#82|A7xQ2$6HD*OD)SRD=ZgU zF2T%pHDusM%TF!$SRS@K2J7Tm%O5N+Sw67zTSi#NS`W4!3B6VVoo2IopwCW%HVavo zTGP;7YpqvVe{8+e`U~s*)`zT*S)aB3!TPH8BS_8&+ZbE1?Qq-Cw&QIEo6A;)5xT?{ zw#95+w)1VPZ9lZ#V7nD^wb}N7?NQ8{FWR=*-n9J{w$0~|v2pg}?Pd0p?F;Qo>=FAp z_SN>wAZfSQ@3jBI{*e6{`#1$+ zcai6Np4lFU$L9&aF1o_=Q_r70lfBcubG;SbHQrx%@Ap0oTj-D8w=i4o_Kxz6^BoMy zG{fpS1y;^EzE!?0K05wY1${7CRaLv{#f*8o`cri?EZ*1DzpDRGKZCW)3iM$M}Hp5#tla7mP0%w;BIp+;05P zSYR4wI>a;!8p8^Gak^ASiKX?hnr8pyB{lLE@Doa zJGqoyXTH(=kh#~q)%-3j-mlC@Tc%k|mTF7T(gHc!V7cA$8_S25-@%f7)w;v_i2Xpv zp$?bB4@-2h<5I^D9oINEI^J>|<(%R?&S`fhVck6E`~!OB1N6!?m*2Gk{V)Q2U+TWm zeTVxO?mxO`drTger_6JbXTB%yxzzKeXO7q8wR@|fT`%!Y@Hu=9uoTn2F5i0JExtQ3 zdf)NkiO#3;Nbn>-r)unHb&5}0Aun>!?obwd$1DbB+s|OBKX03WIcS!B5iIi-Sbz`NU$Xzh{)v5;eX?UJtiJ`&l-D`#b!>sA{Lrx* zv(Pb+(PhpR&d0!um!1D~8eEl-$}2E;-{$%?Z1C^7C&QLYy0h-f!I5_{^O#|))p{Dh zkzaV8^gQSJ0<%sb?6Ml~kG)TUE5}0Ld3`H=*MKW;`9Ac0>Z1#E&EUy+bw0QfSAU^C zrar0uMV(@>LTfFDrn=bhnqjiB!}zr^44dd|bD`x-%j=dtv~+~^MA$1Etsh!-s*QdDpqFb=`>h z_hHwQuwLH8$ovOpixKW|?nB(O-A1<)BeMcyv&ns$JLGP2$1y_Baj(P}y~2GB?A_bk zKXt$4ejU6z&~vb7IxJk0qxqgwF*-MRZpZlimFHp40Zp@zvE+eGHjxCSasfLyw!L&#^dA0XN)fz--euhZ2Xt;3{%u}7FM12 znw~X%Xu8z=bMp(3v!|ee-^4oceaqLDnXn}Tn4RathHM*PH;#plJ=8V{(zn{S#S4X)^+;iLxw->f)*d249?_P@@yvO~d`vv!_?l;^YyLY*FqZg0D3Z)L#)>_X^ zo{gS+JP&wY@Vw-C-Lu{Ex#tA0-+MZ@x32d71UeH_-n9kQhuCJ>+_nZ-!cW-# zWP8gt!hVqbVEZ)KY)*T*eZKt^d$av)dl#QiH`q7Zzp#(Pdh`UxNwD8e<2waC7^^op zehCZiP4xFCm`%qzk8&RGbUVv1lQub9(aTpje~b}Kz56WJ-Thc?_*`dTMcU;$&vhNN z)}5}+t_NMeMc=;V`kU+TE{8kn{yxU$br_fTy0^F=bH9u}JuxA^_ z-@#Z@F2ydwjp)5&u_v$u_VPKtwdku}-}AoL#W?Hbzv;+q>Rk0C>;;^rwm`>Ure32y zg_Y$y>WAts_225Dh9eEf8ytqkSV>-v736xu9fn_HU+5*npRi7RA8Qoa6Iy`P;YG%) zu_JUR?CCAW$FNfAGro&`pdr$^D`xMNSOU)UqS}rvI9=k$2%wJ&6m~NS6F<4xdO6&zKw49Eaa*gF* zmWdeGUX1Dt`tm93@2p=~Ra+fqkyCA*(5)BSuCVnjD4Z+a^H`9H(<_w(D#JzIX)8K^8L;CPv7UhZ)iMjW$Y2y-xJhB zvF4njo}hZvd3@!0s(PjxgEiiT{e(-^A7W2%qxy68KJ^hu!1I{VwyPgN3Oj@0@vDVeku8 z*_E5PT7gx%!XA!v#ko$p&hftP(BWUhIb`IO6@W)HxNRUgK`<@dU%4aQQFMi|`tE*& zSKQ>@$L4p+9q+#EzUhAG&f)pY6Y44LDaQn;;`zeU+S4(WwTc1l%moLo(w?#3bBuX@ z3B-NZ^S9@fC%~KDo7-E+Tg+Pn)~d0$Ej&g)?;!7R?*#7*?_6H$YVQW#>Ru-NDQ3id zro?-1Mqf6%Od($>Us+J3(^tb+&)3@5(bvm2(D$8hEc1Q_9Og0@%vj&AbfIJLmXCc| z*dxRA^+xFY@8a*p6d4BFB`Kth6gFhf4h5O222sVVUJ$`O58eE2I zh84WivxX~*3#3csFcvkIG?q7-=v01~lrF{|#=dO)u)sPnT+M?gE1yWgf-uIK>=izG1!xxAhzx9|mvTot`v| zc{9~A8nQ7Z>lEu;>moR> zUDkcpW7g}|MC()Q8*4gSHd{ek8JpGSg6FDjYiR3Y>ji%>%r*u-Yc_1wa`56N(6LM@ z*#~4!CE6bI&ePg6**~+Fg14z`|B`9dk#4t)UKbB8N#n@rD8R%j?{LDOR&&&GGFDm}?!)`LTK#h8;o0u-<=)!T*fY?fLf8OG+RM?S!tJ%}4eU+X?YqHR4zZ80kE2J;q(|+g zM;(KWyUJFd#8&?fPCSz%zp_Uj_@gfz^}r&X=~ctnkmj)63rqg1<2M+)v-GN~u;owq zvT4Dk6`elV&IZi8*3M2ac;CX|O?Up_T%-K?e)?2Aed@0B5qRZ|GXsbv1a#`)1vGQD zadif<3~^0%&0yyc%<`M-1YPSdHqJEeAa`DOQBbMX9pSF4J4grjH}1jiG46@(X{aE} z-0R%i+`HX};MUK;peC?`d~|2>NY5%n$FjhuR%QQa?->NkKEv~q=OmoKbvo2j7=glY zSY|M5b#E>DQx{nE;oec++1^E<*LBR%z1~CKv*4bqbf*VwaOr$`;0wz7>^={#v97O$ zZ@6!?Z;J93H$f+v=3fol{!r#6uI32dX&O3?)le1m+8NG$ z5UQE%d8e3*H(_kEfQ!uVidBqtj4ia=j5Th9MgP4vQ0}s;-Bbkj0P||if52D#zao%>m=e6Z`6$N#D$y6Nan(JEWS`Cl9%e5a~`b=nq)@7x1N7*m28xOaX7EUrVnAlS!Y}x2DCF~W@LLI1~ z5on>E?B6+du~P1KcNwr(-29y*eEVK1CH zTzS~4O1R4Kax84oHBtOhw&?z@?_3k5a9v@8egwWs>(1oP?k>lsRfk=x z2VH8SdnPaE2lp@TSXi@j`f7qbA)aEM2v0pv6Wygntyt;V<2i!rcLDA80rT$_@1?lD zmMSP0J;6-T-m&oPzcUU0gb8`Odp;Kgv|5q+e#21|{PU@3 z{kf`vxj;kZd1qhJnIesY!040Nw|@YoUoc)X{>=={&h)H^qA!eHO}=(x@K6`N`3Ts~ zU8ci)>6@neaGalk(Y@y8^rusM zSQ}e=TE|!?fpo50?^vH(KQI-u*^1aoq4pYKzkR59eb9Y{?M|>g<$Y$i=cVIR1D}6w z@5{>>VV?j8GY_?X4QlWK@cCWXv1GRJAcypwv5t9;C61MjHI6-wlVFyt%(buK$L68p z{R|iQxxR*!sWqKm@{>-fXRbhZ4!TDL_BWTin!6UAqc_^`&+hebWBcGxZov=+!HL#xF5)VGj3d3AP`H(MA{W@6&^F^jxmcfW@ zg>l_)i9^M>2u4kW9m#90qzJV#I3|j2vB0_oruk3MXck*(^j5d+3tKA?=m6EPegS!2 zW-6qyXSJ6>f2fbD+Rom^9t}E~Vc!fFb`I|ABU)i;od!NfO-C=s7{@fnFI4XiRMvZ{ zGGst$t>CQBZZy~#4UZ|BeXR2Yd(l;J<^$@uIGa(0)EfTUHNy2hUu_et<|RB8`P`+@ z5*_Y(?$+!Q0EVU9^%pF-+BVQ7WnQC z)aE#J_!Zs*ROV$W^Mfjj<$Ok;kBz&RZ-s9Y%;W_)t|XAbdtVq^b_B?vwf}qn9JtBV zY$jX%yZr}rFS+l3ExSp5J}@{T9p0K?)fRT4W*w&%1<^haMaP z0pUi*uzRfH%bwwzzNGFfY{oUMO+ckXa9PYzWql9Z@gr*>wO7$r87$hK&7vpU#P7Cq zeA5@UJaz-Su@|1Cy*<)C7(HnmHMfdx9puP^R_+2@b_G`s=X=g%TlmGXg?-^5I`B2e zOJ;ipr+8z8i4Sv{oDL>@1lr{YzV1?H`v&;VJ@B2UmG4Y)zGcE^apiR7a}{R$ZRP3@ zZhYg)?e5D)F-dvMbxiJ4%5WnE#bPQ}_SdbT#KYd>iW6VJ@MrdgfeickzW1H; zUG`n~z0f|K#h(+tzp=k1h_DOX%23oK*-V%DSLq8l?2m^%d*uHp^SynVfP*}N+=ha% zDq+Nhobc5Vbm-=WwuY{T-i85&VTO?~E3*uX4J&yezrw2=Gn_G8qX)b;d^Dster60s z?JQ@s^G@36&NIX~0{vhC9)LZd$+N~y%-wwWZJg{dbIhxF4X4e;(30d8Y@@Q@s3w_* z&RY%~U}rz64>u;fXK(8O#etJlo1BYhYAM^wNmU{e>C11dAFb(aS>QtRQTY{YHk=lf zss0AMlx}o@*|z<*OSaoEqPgsL-A|g?``f>z_Q%>M+h?cuqCH zLorN87tRWsmWLT!$kP@L>oV$KKHN3mv26+?vBi5G-t4W{i%!$f*BmXo9~ghEZ!L^j z90>oG?{D90)dmarUAUqegUkk?;;e=LJmNnI(!b@uFW<0Fnt<}ua0X=;Ot94r@I$RY z<@y!0f6QUO>>I18&%ps`DUHN+7;H#PnBf1Xe z-~<|C0u}$k7KD;qnz|1M-M3`k_Js`_XP;wV%#=N$99TNOXI@9B!wxEIqoS*&CfPT4kA%e)}xt4V0CpfREV6(aIh3J_V z>Gw}~9hrC+g>YrrJzt_(wSW=tj+bN*toS(a{2cU--DrDP*c?B2jHr8U=?9~|)6lAJ z(f6&sDxmk)z9IPRzV}V{{f?6Sl(&)r1SXnPXEdq4XrSNuXVCXoDFWLEA9V&TG-WSL zXUM{9scC3rXo3FM9dth!9%F`K5$x$UxYPZHIQa8Qyq5aLF}SUc^Gfa*ALFK~igNWU z=qdqhm4rhfGkjAi6l5zHtBScT`qgM~)&exF19*Dk&3Dm|pPOIP{j*x~ume=0|2MES z<+XI-we({b9En?D2HM9;5ZFbSioe+hK3X!tlsAAMUuIo}8{vrcD$3&vn5L|_B}>|z zHovVYHQt*EKh^dl+usQ`zhq{7kUcy4tAUwNRo_Q9-p3GSOP4bjeuG0liQe_Wo|E@c zK_|qQC?Opj-5vd4AErCz;w#tzCcDJ`7YK_~#90ze#EmM_5XRvvroX(EMb4jK95#W| z4mgi0H+s!^AN@8PINk-<&=U7mcUKgCmsx0=JJ|q_!n{9(8~xAM670_74#9me0)2P6 zdoB1a9-ZVKeI$^LFE9IEUr!XTVm!R(PS0UjPw66Q;W-Vs3tGb>M8PAB@y=pGtYJRv zhDG?(n*e_h=*yU@V3zQeQFgN$D50zGTXga{VE0(`us@j@iN61I#YEz>90CrUfGRfM zzeG{P4*wqiQ98~!P~mO(1-wdA(*z_jH-Ze=c}FF2EV-B)U*ZH41!kw=q9La-#8|{w z0)D}T#@-fR*d*f&oMB6izo4~mgA2QFe2p(JvniJ;#8lW+0uhW4axK~3$H6|WgAv`Y zu9fGeytuSWqqj6-tNWIhFaZ^An|T*5H(|MRGnL9)?3Oyrq!yNGcvRM~LBunIp29P@ z!I&*@Z!S`o(-Ypsduw()o8oLLjq}Z_ z8*E#7Kl^QQwv)Da+n+cOAK9Mc{0)E;Eocv=_q4M2p!1Z)xik#F(o)9-$3o|F@Z?^6 z*BM+n@MwmrQa%heat?dKA=g<~R=h{8*yo12E1-Ti^L$P9kH%rNgzarTY;^$s+`Q~? zZp{MB^ zJe}fXIAl6yx}dvWVRLcw=jMvcgKFlQ_&d9>0}M8g#7RHLyvV$o?{wIF-u##O88hJ{ z&XQb~0+!-n2(P6j?#_{_g8zW?Ar@}vF0(+Kx4EtP`D*p>&UZ$M7=n9#qjekpv=bnP zoA@H~+ltygM}4TG&WI7VakeRVu~*wR4^WL52$3KXBvLY zRh|vZpaXD6SMbq1_q<~>&4K1t7G667RajKFPN;6fm`5po@zwOG6YQ!9aF5UNYNcai z2}W%*z$Vr3HSu+VO^U(2Im@@2&GisC<`k&+32bC;e=%6?Dk%OFdCg}*x=)!p?5lgz z1pLKY{)~B31qHY+y!Ie`m=jQbWj|Ss*JeAtC(iH(%331o|2sT#=}={|qWmI^ULNZaHWO8Nfj+$Fxh%pMxh@s z15NLS|9E2gV98-Er21R~6dcKsOlMPG4nDdJQ{}QXv9+;vq-)K__3>8wIYyzXTyWflfqa5@GKJyJ?JS^vG&^~O%AlPFc=XyT(>;#eXPR?9p2}4q ziUX;KN;A%Ozhng|l}(;)p1q#q;OR@At0Wzs;5PZ-$qYwc zkQr-Y^A1NdZs2X9D7&vBstL^51!#iXNjn@wF}|R#FnPlPz6|&c{Y=<;OxTXTNMC<2 zRWy6scHeKLTV&4O098Hrz0qylfy<#9EKDKj=S&-{=PJ;^+Q1 zvd5iH6YwxC|1@O4@99S&uE%ukh!ea&-p^=y_V!fu<^s-^MD)ftyzLCUVLvap9-3oE z-fe%jyJ*-_(HjpMPr;VnAPMmthf;tk1B#9x&ZZvPaYs`m-1xV=&avusIj9}{hA9!& zPEc0{k}-aIcs)2fL0$dT1v%Ed9R~Fvto{W!yF`%v8*_jqgT;Z5shXu83Xdp|!ly># zdfATe;UKt7_P<2D4=H=T!|G?lmu@Z!WPjc7$I{WaTleCKIL}MIYkiCk`P!PsmMPV9 zT-sKS$z09W2wrb835j{+q-6S@fCWkbzdeM5mDe7q_&>M3xIGN5z|D?W1J^`Ddvkjm zl;uct$#2*NV$?ga)c#{Cv%edMR2+N3ANCvU29I!21UNF#{d3X#3pccIhwQ?+s=U4F9qkwvlGNnbyls##u9J^C>oi$GP73OYlbrJd!KW%A!SG$eSG}M{#c$da0Yr z6hB8pe12`b9m!Pm@_wVN*!NWDQpLfWsL|ct{iydR@&DZb4L^cYkt)rKw<81xXK`4v ziflktRP$;J&k_kP{#VsbVt*Eo*-B>62H#e=7x4<7C7pH!ug5c(RMEyVJAls^U+(@eIerOd1~Y~9=0n+~d*={(69sr0A*r)l;ph(F96w2N z>Q8Xq9a2+I$xMAPreik?2Jxl%6ioCEFB7eia{Qg(eEYDc4aFxNL!N4;X})Qx=||HV z^+@eU0XPABbdzrK_@90vZmAHI!jh^6*vQ>g0mC;0!?!W_LJ^2UJsu5~pPK4HUxk+{ z7I)oV5aV(4S@T77#JkERq_t$S%;rFxT2pX8tafa|rzM@_EG+e1CUjaHTEaq9V=mWYDtCg9 z{00SD+?lcXvwl--DE=(*J-pK{A*y0AP+|pjYeu;0;nz&@Y7Ny6F~v0#UGXQJxuQ?U zsn`5Ed5A}FS%ENFIbbG=xjzR%dbBgtgVE~X?usXSsCI=Za9YdocCIB8wIAL>JX|UB zSvcVie=MrajPxjuC>dT%Zt6=bM(fGJ?iW!|4iS?$v5KZPnHwV$ls_iVn;e8teWDzXiW(%l?Ca7R_U zNBGA1Ci`aM=~~Og-c7ZifIYvCpW-nyJBTDkh`%s(UI9J4vi}R+sieN6aCnVGNtvap z<~lrHasCr*$XBTANB$Qwzad2QdbJ@VTXG)Q^a{*zFBM(K&;;*rS3@r*xm5C8c(&z+ zwJ@~%P+LwK;+f{pG|iFTm>r(BFtuBi%~;Y2ZSg4fB>Ol6K7Fa`pPSjqE*ftdACPW* zL7mE87KRS$Hiet2YlXH!^B#qpXexdpahk8C9{<3#n1CktnB3iaQ;2#u1cmy{Rl%Vh zQRVuWhmrshO>Vh)z0UcwOnJ$GJYiQ$$EH@4nyZAj^$RjbtpN< z&T^SaA7IU8Ew27$w>5%l>xZ5bqfGBAX8c*}1#$!rtxuTnL2TZ|R8y^@PNUAGiK1Zi zmaAJ#oUj+k5CyWmh2Rk@hxT8eIo=yr>~MVUlhJw>Q(?c6j+DgEJ#`jkhs!TVbv1Q- zO-gbE{^t4YU#lGJV1JLn>)k-lOCo>q!I2$bM}B89R6Q5lmrUfQs_u<+j)x7N%kCw3 zcZc&P(^slWxZolrD;w+P-q$slNjn{F_Ghxwu~g9!cCSn7fqaNAlrD9?iUZQ)u8B_H z6LdQrCU~WLHJ<2$%+MtAMaA)SSV%C0Qz1Q>lw;K4xEsWJ7M1=6d|ygUWCXE>cngy& z63ki|yeboMDBIQ?orK$Q4_zm@@D5!tKQ51w%KG_~32Ni(fx0k+1mYAtxhr`4+j#j$ zc>Cfcdd!qdLq0Aa$vEK>oJ_Yb;DtnQ_#O^A1gJ~`?eE#>GQm)M#xw~fhbcDzswhTntrMlE>Yn42 z(_RGkAX8;GK9rN}emC%+Ji>Jl=*)<_DFl}L^HgM78=kuvnU6@k_Uo1X)Yv^tu2b5LhbHowt$Sblb&WY@ca8#o!IBt4TP1Z-JB6CrJ2BqnJ6?DB(u4t$EhAdJycL%OB)i z;5fxz)zAyWi`G>Jya%W)8eU=wy?!a3eh;p@E97{C(9`pv!+j3F=Fm#0XKV=)TY{p# z9#(umNKA0pHQ4bm^)dNT-b) z*nA9D;U>)J3!Hd@oTP`_aAMU`+|*e!3WL#KmY~}Gf@XKXaumntWzf?-62dw3-Ir7R zRGrL1BiPd@{OeKy3#=>f=4~M>dI0p4h%@h{^(`KZ+-NkV*x1Z)sm*bZcA={ev5m5g zx6QIGAW{4?o13IVFWVmAb$<;zmxZ)Sesy-$K&5S^>Cge_Hp0@a;^lAU?H^-5yM*`Z z0T}AFJ;YH|{TgnvEH!cNwZa+PjcsfSN$&;d{F_m64$<%bpyMaQ-HXy+&{@J+#%Wcb zdre+=Z_*M&NFvU_b@Ky>w9WMTizvL}=6LH&>&gU6o8rupm)#V_zdQTYU=kH68sK)g z{=+E0mwDCqTrb$G#FrK3u0+Ro6C8+gTs(R42Q14088w^Y#Fd5zTF zqYnc(Bq$!RU8FN+hCvghzalU9d%S-ONYTU^f93YVY2$f(&51@Y+(Io=Q+=y_ zlv$W;nyV?wB%DB*@L>rzYykP!dV!^wa0dljQcry@)KBu0DF2I>B8byLPdgJ9RjpfE1f9=lbM z{4sQd3t*7DFu?CY@;UJ|mnGNirO!4&k&Z-P7^oP2B5qT8m21`297or^0=t%s6G^d4YNrh`%L-Olt+doy!yvAoSMwT)LCN7^OXWng3_<7yDGNl&$*-s71XlhQNRx z;FfG;`U|hAoC%H5r*;j+m?~a*rE#f8Mf)gIU5 zH|Q&qV3il5y#H+7s_B5=Q_}%=P~hKMGl1EPupgJhXIBG8t_8K!k9@#bvWPR;keAuk z;KkmmIkxkloX7O|w|KJi;@>TUN3se!Yg72RPX9P1$KtVF02>#J$Myhy{<8g!_V_d~ zaQW%-6?9v!jNZ}!RNon`ejxga@NUxSw>l1>&Yn?R{}M$doij7KeF%J8DY9`cuItp& zv_NNe=HZ$jtfTbp7ry*+VqBJO!8EVtDNBaA${9-IomH zOFTm9sj?z?!i-dz__~zg@Ycdw3*M30kdkKJMXmjTI{W~q=WA~koZkhhvogL)c)w*Q5aiQYS+FtOYMM>X z=?7|U4;iO3)Y=17n733~CQ#64%nl=$nZi*R8{;bLOsx&XRW^prV6iHVJN(D+mRzRR z?vXBkA($vUFrbj`2qA`0ZgyGFYeX$>iZiJbYVj}>o2g(UN#p;@7A$U)cxKHL6q^8J zdN5J}a(d-7jb2S}Xnc(x6J?x$Z)v`98QX%~_S$Vc!zP@7`&9Vt^wgWMRVB&odC`vR zgPMe;`W8oU3P-hwD+t?7dr>RnO@C5z4@@taOX=XH3M(h&AlX@8D=w1lp+7EzXBsD#mVH5x=9CsnwjS>#QvJ7!cKL>TV@D-;}h&MZLW71|B@fmYu3AjQ7|yI%aMZ5huGJat%G_WsCE<$}-Z&KI$OER5N@)wC z65ePU_Y{7?FTI=m|8Y3tCpwLU8!qKHX@xY_djNf5i-vO#U>W}Rjd&@fI|^5G=JmheK1h1w9leXy{%dHFJH(&PLUb-yIOPEq$|+Vo1}}+LT7~J-2-Ut9o5TosBhg947rxWE4`+A+jO;^I zNHc3Ts5Cwy@r`zMed`*{b%dobu$$E%Ci=`JwumHf+dKB-JfvsK=qBNz68e&+p8(^! z5Z-7T8^kfyV6L)3yk@wd^UGY~rJQo;pf#)wNrQ_X(UYxuJTB)sOn`ON!LNFI={%{- zKyJ$AC5>qYZ`FfU>S+5KR!P#eG3cO6xw*84dyxm}{g>EaL<`Nu?ot{*TUFk_Bpv#p zMT~$+`ksp*KkJ>PU8tS$T$Hf8yHYH7<*uQ)X9u&JjKQfgmAyHUO!!Mr8Z?B@(D=)EE3uP^mN*tRXbD{DMpXSnY$BJq zU2vP8Z$cxe=WFWgz?GK)u%zQ*NoT>6-hc`Eh^say+eRsWIn8`m$6-4?)k(h(7U&$f zCk6GWhTkVp^TAc<=k3t%`to|m;GUmnSdx0Z>7{Z&d5y)mb7&>sR1@XC3HwBQwrSDq z5A$lT(Z?U)j{K;YCYX&nQrXWDxFRJXEcsyB9QNY43elcji5#Y=X|gZ01G#*sJpR)E zqSk*j=b>jy7B5_rc%8WBG)O(Tf?1Z(vwwsCiN{Hqj0-m%{7*jR@+~C7{p6zBksHLznnzCtEC+E?H4Pc<(aEop$nua2u9cd>>#ge7WY0`IRL@BF$lZec-lA~&f=#OZ*BAN#RAT$DZ*&0{ zR`2}RS6T}n`0W4sPTxx3jSdW$MBfcy1D2QCNs}I<)fKoLm3c?%O}qObkF3UgblM8^ z*$CchV`DpGXLRJD_`*d){u$PCH@v-MhToAH&V`q^%s)PpCU8ML*m*@Io~L(JwvlR= z>yNLvpCO1N%v^~ptbT45O1izXxgR?4c=ZbY1m->g-oC4NI}>QTsHHR;t{+CI7K(2> zT)*A9dAF4WiFkjn;}#T@k%>2(a^0>=DpNU)8(lx(_uQd3?T*3Q=Y^@S1XEv`j@krI zNjIG21Hcv0yv~c-MW1kiLwHHS5~4gAxN;?FP|1v}*ZZzV(R9zTt0ve>gP;BSBHQV9 zI@s}@zR0PL^Lmp&l14e4pTR$taaL0PF zBIW~h&kT6^^1Qxs`4`y-OOtF72BwCoHuFBlG#yTI34Y>O%`wF5%zw;{ zpLFn(CUrg4)jryVJ{rwk;K}TOE5W|vK)9w?G~RIOClA+MO5@UV;6P}lIfn1JxhOsK zM|$X9X8lRh47YfXxvU{zUfK6t%=^addtG2Dhogrs$9u5ex(DyU@A#f>ab@u((>^=g zxrsf`PyduXuL}<3XuUAJn6&AB<<76dtK7$VkdCWgd2u^cv{zS`Q#-J3f2RFdG^3?3 zD(gtX9psHZrF%-kF%QYp(y%Gvywqmo($PY7buS5cHoZWFl9Ba(C*Dg{xfZc!0;~4VM<=24fMu z4P(}OZ?g5Z^>ktO%dNNX;7sP}oxoo-4gVW{zYE-lx#dX$3%u0}F~XhXqt{B_&Zdaq zUx~YRI9L0Sl^>!kitL4RKng20bGK7(GaO?>yZ~OfMK6A-4x{uwVO1ngUlK>F4Nt3R zN^<{NocEo$Ogc~#I>N6^BXh9?kC8Zxc2XaQ;8{{UMh|^YeXn$n6y%(Tdk%s%WSjJ= zzo;1-r8tawsdw-@SQn|DMd~lw=HG?OI}WBZo|Q@712sI?2YtG$K0 z>PNVibjA3J>{t*!p`xnR+HoM%!d>_k-tci`$mG8I5BS5koA%K6FX9PGWY^4Y&Iij` zLGyqO@E5kB?|-fSp9$33ViJNo$qtFb@R2$Xa*_=$Om?&^)#d|XH|N@EBsWebbKzt; zd*%)}mNR;#TQ<#PT(X&|xgxMEZfjlj8TQ2OGa6QNE~sU_Dpp6V=hSKV4F7*VRc;Mb zTy=KLX3DG#La+KB#Igy@vKO`L9BS2F-7qtvRTakRQw43HKKQybO6?%Dfr+4&72JGG zxnO!tIhHr}4Afj9YR<%V*#uoSQWJ)w!Pm1j{k_$(A8dV_yTr*LYjGqL0IyisENf`u zXaGJR(O?%-bF0Y@9MtQ3aw9ywx^7EyH^9t2rfOWBNZBm=GciUnF=kSED->ZLBz^P; z+vP3ts?WG|l9BB)KPmDuAQqRqD!$uh>iX-)h3GL<;7n>zriZu`1atX+^z&1WLPbC3&hf87kNH9&aHlqK3 z0EeX9W|UOIe`E{j#0yC(pLP{>mu6q;z=kJtX+H}p@_A1<6;y}fc5G%vhMpk6{K z2=7vX>Tv4a(9Wq${(T%ea(gA1bVOko#|lm}35hmjuX^A~9}3Shga7sw;HORC_k+x$ zKe@p27*E1`z4_Z%lM%i33gsv`$2l;Ldr-!1lZwdBC9K^UkfG;A^tVFEm{>ur31c$=j5`2Njr4lg+}u_#clcuzfD>$;pbL?mQe?Dx3UY99 zx)9x4E&$h7p0Ev`@NQ%^|w54bqQg!_M3|rntdZ;we}U z7xL^?wz zZbKB(`v4YY=W3HMZ_duxjhj+K(M@9vGhsO7*H|{fTOZccpWKg-jKXW!x~#m-5Z-1P zGB+Ns1Vpe!wt(^I!F{_Zy)`UpbWwG-;3p6d%qh6+tGv}G%7SD7UxaXxu~h11p8;Ta zxt=RGtc#PQsYQxrIQr;x9K%~+<*wm&Nn^=@yUU3(Q;%es+|oTlS53AQLGNsdPhbM* zI~ISyMclsP^z8(vwuSpq_i<$9B`MYf)@-7xk|*g}cW|A&u#4j=59~uY3dvm9g^!Mk z^d&D@nRsU*w8Ftm+Y_)@h2R4|=hjDaJb#_JVLXmoAB)s0yAS5}YU=gkH(Yg+>tXrT z`8OJ6eY*PNw{oH90BKP9J&sJuVHJg|wV|rlrSFVHP5++W6HB&gAJ+^|=$)SH-n*!L zf!quezk7;2;X_}mwA3wM)Vv^xc3TNQVoc-E)Tg?{ET#BP|`v+~`O z0`>PD?08qZqe+ZH7yp$+xSelTO}Wu7SEchqJpZan%RaNcL?b86w#y zgg?*B43OV?kXz(c*^WEo%bDd}h#%*^w=7PETHKBlK0G~oX>HK@Jo-DA1NmQCox5I= zJsoixq%pRK*BhW2obT~8Zsm6|F5#Ka%*CRaTpM2l!~DklrL6Dax*+ue{^+s)UP1lD)t2=vMLEV-Ns#sUycOT@UUKg<7L=dwUM|qc?L?XAgSyG1E0} zdnUp6=7R4n1>5VT>op=@+m7DX9jB{YsGpwdb3Lt0#clGnS((UTuoQKbEgPx73n3iE zQdo*Lc(%8z(^amnIJqz_6;zS@!UM2b0Z>_UO%I8`As^0$-l(sIaVxZfUk@gST%5Px z7nHt^?~xvrRB|=_e1rIPgPkC8*>11-?t#VS=C6DKufHl@v$O%p{F#>+_Uks7h5wqK zTv0v`qms>12raP^*F@Yfd~HaQ^#DK2#PhWr)bPsE$l8nFUz*2nFa4_bD&_j<-{iN8 z(7!F{gYtV6!k36X(vROR8AS?s4mbIK0*f9Zv2o6J1>QN?R*H;9efVbC+xqEk2)WcH zzd`X74@d@b*`=rq7nRXObvkkTO{F4Ma6$Pn&X0e)t18pUGEo7s=g} zsHO^km9KI3%HLx%`h5a?P5^99sOH4hlLa}d-o|I}jrm|2>)~SA=D7*~5=yrm=KYGR z(87o;1effCCyXcYdmj!&Jc^&=wT<9{+yPj@>v%}g>hCsWG33Ny{sl^4G+f0I>h38S z^>U~tU!i`_hmD9+?l}uucOCYZh3r!@bI#%MNHDq4MJDh!-UR*>Re}o3PEfxzrwP6v-9FDEN{X zoM7^sFycws09x8kf7ok{gFlZ)mrQ`MOym_lCo%QT8h}S7>;LW7um1hZSO5CmtAGFM z)xUo8>fgV3wGth3JF|K(7(Nak%SA5DCh&%(W&_A|29p5^MJ+Pm6AoAIrMX`H>cbR| z2E9*3-CT+@a|4{`UhIr7{IO>Oqw$kw~GO`J{+HXefZDz@G*Vx$w%WH zo(iUuoX7^f*civP#*1*FiJBD&;QI!vr!0&+pbkxo)Ccjm$3@(SOWDzIG?ExuN_JCx z@_Wf{p2i82fKxt6y=6h_ln+&>yo0w8p>wyrrlg~|DkNU{x$2DBKw@(*Q&-&b3F?+l zrow{U!K5`q(U}Y&%W$%q_0=^W$sCSyN28NY#VNCtoaP4gn#GZsz6fWN$Sf8geGvKn z5PbAuFg6YlX9QPBn#0&clJJirbrPeO0+(vae>6^OharvQ*7ikkRH9z93xLrHRzH3i&H@KsvtsaEG!{%dhH$leVm{-kV5v z8S(7Ls4q>f$Zuem*^4vnG(OM-fK3etS=Wb8Z4aN?hcs6-2w^H&fTe8g8$btp(bi6*V|j3I9Ln13l;j{pkfm=?0_e2b1Us zGnJuxNKz&%h`T&fpf>rK9{jq`BoOu*TyV!xk{{yu$%=!tJlMK69_=3ZvnS#8Swpt+ zIIg#cINq{yFRVOS%G!9bdyt`=#8$EfZs0h-iSp3XpBfB^P8$$Rd+(tyd8i>^Y1)8z zFh|z^#qVT}=FLyy)z8Ftwva7;C2xNXuRoUezl#buNDUmP3gW4Qzo>*;)Ith#_KS&bU1O%*k!j#^Vmov5WAR8xQIX($ynnwpwKRn4TX z7E)O&sjW3sS1k3liwZkPjUA`T;;FO0sI*(u+C!@CIT!NYnFB28sJX0EUCOi#1>=U1 zYcSxzaNyPsM?d_3`@O?x{WZ5qROL*|24BF2v;nL5#(D5c6(ThrMi;Z7n1<^&ZmgZG zll}^76wHi#S^2K=Rppz;YDYV$UsJxNd`V$|-)UdVs`pVs!4+~F#i852bhpNO6Gbkf z$Ty2l{S~{pFg7c-%f;&NZ^m&WE}l*o32N_S3D}$R7E`|gw=L2Jtl{4~6n|kjIJO7d z#w2U3-r_vY4*M70qK9D5cc_k8K~aV9)|FQkB;3CqS}59K81-UcA9YYQ;s5pS zUJqttf2QM5=HqB4%MavU2(%rH?}cXItINUEh3eRKpoC;@$xBwt%#O#k^J7zIiK9x;@tQ5-G8R9 zPd}f}xjg4N&v~BbJm)!=&wUTpNNP!vG`PZHNvg-4es=!<%l{ok^i`u8u97wn+;e@s zYSy0X3tf*dOIxz^sc$WP_}giZKK$g9PkGWFc`R+I_sO)!pG?cSzaZ_~Pc3@vHobn3 zRRR6U(9FB)RunCYT=%->FZwy&)1G)}(Vvy@S8#7~&-|+`0=_Xrc0Bgg|{tT^swh)Njh{l;sBF3Jl*4dc7)z0l1b9HRg&aGyblTJ9{00L zQsZq)mo0r1VZ5%Wv$T*B;2!t0i&El3zJC0g0$)?$YYKc#fv+j>H3hz=z}FP`ngU-_ z;A;weO@aS31(@0T#&pSlO1s5@yE|DOzgwbWAh&Ew(qWa=-T<0eu>kvP0X#%%9QI zDebwx4&U!Pe!&`4D({S9eoa6@N5T{0gNdy(Ql4{+{HeM_Q9Lf0`~~^eMF_ z6SN;smLz5#gC}>g|70@9KfvGRPZlO2im;B6;1_Q~jd=U;uVA&d5lTUTz@TU9uM*vv25pP=>(SG$y z@VbrAsNUy0Zm2Tan>sbKy`R=nc(vX`iHYB;^o95@Z;ykzMWT??K)mx=Foo@iEgWIK z8p_SUdrhBc2A?MeJehgX@ccF+J?DyT#-flytsUJTuGwnT7s8; zD1D~@#3hX5AOO};wEW2fiRcUiI_a0azh5xFY9tXbFp?-37)fn1FGgJ6a&d^%Oa~%e zw*9PK{`>(owcbcB%IclG*cj9DQbTCkh=lof4sa*4Lt7RSHjje`@l17tes~CPk(L#0 z@G9EC*0^9jVK$$)t$kh{H8{s-eF2c%PGY-J!_NKTqGy=A@;7Q}qtCFpyn;dyIdp zXD3&iKSXdXarK~m3+(gfRq+7M<{YzXeOmr>>5fLmcP3M`c4snWRmVZL0rDMyj4X9TSV0ad)3z&%ifo!cFQAXc z)LJQKzrTm_G$YC!jf&}2&f0OB^;A=*E}-u^JYDj=6~1GaJTE6H+B!U>HJKvmCr?3~ zeChYG=Cd_!p>~0O`93u+l+fU2wr?in<&>a}uhZH6-iTfPV_p6xM`qLVB-T_XqbBkj z@lc{lzYlT?ATueFMAbY6EI0uef4q|5M>xyh*p}T2+zhKf1OV!G%0`g}3})a~U7TF4 zk2UUF3;d00G%pW|HE*0Cte#4OAg{k4I*-&)gqL3g_sF;2OQDiB8u~Panh+`*@Gr*s z48+Vvpk!CET=HAB#AN>tP339N zRG}V<*&eyG2t8?IW%u$MnLY~{DtCDXvcpX$bvreKRLndcLDjl3Rk~p_?3p{49x0Mr zAy0t9^wi^V1*2|P?+ox)F518}ChUR@zkz0St8_^X5NA?)!>V$u!{p1QK=UB)H0As$ zDyh0n-VI^AVy$C*EhM8H2>hJ-3||Rb@2c+>+IyF&LpM_uFuJlR8I5|mQp2vF};kM_@Jg;om)wvOn4vgLxWT->W%!s3Y*teL=o1?4m5q7Bxn5!I_m`@3AIV8`YrZfL?wsZ z0+aQtF~FoNqj(*nz}^aWU^xXdMUMJKuq}ch&|?SKZwMWE9ijOKp~=du7WFw>xbpP! zVbyKEV}>f-U0Y}@BYy{JW@LV`wDYT>{TwoZjR-f}e(;e6>=ekcrZt@er*U3tAhS|_ z5EF^4hvir;H*&(A^!FGHtAB#1u(dKL%}&kJTCFE*i5&!^$(^r4eIGU0_J^LeHTvHQ zb3-bqt0W}-ZDD!WMm6~F-2Tz6qYsAWZUN_0YaEn+7tJ@L{1X_Z=*U@XD6{EwDti;a z?$|=Aou^!llw@y8QYaNk5zLbs@yrK!$flu$)$@~4L;neq50Vr%{wJhPddmn%YGre+ zX;E3R9k#WwEu7k~68Y7aZQXJ7zFW{+1uSwiKfeOKZyC!KyfXf%`Tf;)Y1lP(=}}x; zaJAve8)BFC;mS7Ir57<0dKmX#kFZOJaleS`HnUwS!nFifHLh219l6mQ{wl*z zhkKsIE`5aiT-=|=^%q>DuC+^kT%Y24c(`5Kiz^p+ZpZaVs$IHvq=Lr~@ly>+Ql7+3 zt){ysITA?k1Mqi+Uy63%AdadLh|-T|ze3{w|6qY#931sB)aM0Uzr(c?*M3|_aGk+5 z5cK}C>kFibjh1U_ikZi%h3%uSZnhe#R8yKxVmx?uezQhN1&#LmOMZJ%Aai*Lbx>9CCQ{ zpVE;x!PbpBT3Dwo{AUP03^b+w>9P9nWQXM!HYC*l4C=r8Uevz_^^YhhuAX)S2-MSu zH*oc|Q&CTcNj=>I8glg{Y;#=;#wcy!YBMRYpl%)4Qg4Oj(I|>*shy(_M^Xx1MTjK# z2EukOn13TFt$DWnXaijfwa2_BIaPTT%8RnT1;9diMZk)@z&M(h0|T^Zz+p;5jSIlx zYp7PZ=HXh2D}d`IT$^zn`WM%mh>vdpXLU0uFJ+}H*Jl})4TRkwrGQNcLrIc~nvN$G z6UVSmiFZoaHm($TpQJwDpHe(krzl0B`vAD9HV>m%*SP69l4}!GuR9HY$!?t^Y}QQ6 zky>ij)A-SUDlh9!&ycJs9z)i2&)_VFC#9Z7a-k$!BiMZwIHdgiBSuLoF;pB!cT|3U zQyRIIP9stI`5L<9jM3R zTB!rXZ(W@sg%8TdhHX>zfGEtV=U;fPvC|2QoYFN;#V#wui7|1WI zPtbGX!i`C_K0Hg-$YpzgGMhf^Mon&6EZImem`LS{e^l}2V=rT$59 z!~6-k{g+jS=YE3+d9RgPD3P@iYU~*X?9J572@UA&gojFf51@Bdb_YCGmv;zAn17>+ zTp3X&MVg;YQcIj|SjTz|=#k#8es5nWYmUd5<@D&X?r235Wck3gT6!9XCzvWr{JX-o z#!r89Zr@CHK2T;g1;>vH=4u>ZRFnMf&!TP53;i3akWlD50k4EEX$e^384Uht72@m_MR%o?X!zTrHNL0tbQx--RfWZ@V?w1ZIQ} zJX}CNZwHhXJL8sI54|i&#o@zjOZZ#zTq#_760yXqRW9%dA}teaglzM2oVKIjA$*)57#Fgp$s4x>lm}{O|#2 zzR28E zAQhAEx<>)AMgg(jLlBUxdoLgQG#%ABI0$D11hR1u(DGE0!{t;!R0t3wZMz6`wSFny zn~v$OTov9A+V*D^Pl*pK7!4%=#`A5Nd{XP32AZ1Ej-A zAgdzy?Wf3U^D@HkUs1@`m@l9LreR%U@+<;J&|VVIMpx@s5QeC6_rAzr>PzY@fKi2g zCkve2e;u*ke>|zY*#WS;-aY{~)z(O9)_;d^{IVtxPF|{zud~1*JiV98o9-h*5}Gv; zG|gT@6Y0A5e+A~?O+%H+D9G>b7}03`A~`=&^B!nzNZ)5U=p-|nLFCHDfd1{XIa2*1 zu&6h=elBsUD;?cSpAenv+G@JZpt|Yk!7KhDQ z5Fp$p;wx7)!z} z-~N5bbao+Np)*Q#lbWhPKkoVl$}R{Wjs;8>0oyjgE@T6u;SMD7@6?oE-iz?Ej{(~P zuaguSB!Ds$SUU^#E6QF8Rpr%zEwWrS2ylkTa?5g6;5k2RCLID9N5v0YN=@IssgVKddfc8!dBm63I(S~XO7C|o7LqC{^0F?EdEkeQi% zALmFSu9RuMdn3ieAWGhT8>(CyC|f)+*MHe)Sn~k-9$x6a9#A`HBHY{Y^%A7y#ln~| zp>s|}=V|db8ArdB2M3c0O<^%qHo!=NAwXSS{P3`b245~Cn!_13&jIReEOk1pgSQC- zN(H25$(3Q-RoS@e>V^-|{Y;wd(N4kqQf6D(XKVt6WVU&Svva{!7ljK3X2V&`&SdWN zrn7UQoBihpt-67kg7rvQ57)GGt{MM)p5%Hsb*1z+HaHsKtP zaQP{;n?zV+NYY6hLVdHG`~q5Y7jd0@VGWpYB-H|rG>oCBChoyS)I}@&i0AE89&%$$ zf&OP9m=}G96aCTF=lR59E^Bvx6D)O8`7R{zIr0MrV)cw{*n4w@<&hR)Er9d4YCw47 z)beoJPz(+5XsGy*AQRy-yS!R7jgh>4nO%Xq>Sb^#>i#Zn%uE^1an)z?H{YFK>_F>g zV0c74jQUtPh~WHW{|;mM393(Km**ZJ`on3UZ;SVvwR1W0AV1pLRS%fK!dcdQ`L93X zjK1p=vZ83Pcs3bkAL4r;6T)~l%z_7#S8d+Qf~Hl$15E8&Cv?PH+Sw$Y^H*+4n z6O+9PETaOS{mKPiD!)PvhxIOS4i)I@TcD2$eDNz6*mb1>ExikLQGqpm3#_05fA*CN z{P0QzUfa9Cl~myRz6DlMfxrFA1$JDiz~Q|MtfB%p^(}A>6}bH?7x?y-3LMe9z?Z1N z#=ZsCP=W7!EGw1jBB(k$`>$iMz*+m-KbHSsTV!el{m;Ra z4w&na+Iq>~m?tWi(W`PdDY<#;nYSXhn1pI;I;n2zRQr#sV7WEPYTG{lQB}aa70`GK zxzYeAzBO--2c(Yy+6(^&X1o9eurSFAFt)b@E+$?dePd#M#>4}P$7tWleVqcIeX@ei zjwm|XUg+Es4<&{U(10y^lyKoV*xqtoLbvS*=-U#pxK-pAy{r$-6zOHlPgUTJTXoZr zCSuj`9-Q?ETc|{_g%Latuj=>r_dKJkqH<1Seh^7$2WFJY=s*L(^H-Oic^uQfyVdFB- zEWIX}adqbB%Lc>oWn!*NmH+TwJ;UFq%e+|j9*TuWu31A~GVXKkHAPYDz;KCMj* z!GD(#UQefMJSVPs5t7*&6NmwLAfLAU)Jt$p`Fp-c&1_h$#u&*^aRA;Lf8%9;&n(00 zr(i_W8Y8*bPHT+XaAW4pe}rNQ=LfRMwbhzTtIMc~!{+f*bEHYxGTuG6y3*jw!*CEm zwG`rzCo}HJ3-AO=bQYqSo&bWs?05l-OoVwnF#`Zuh4nR{2fv(I3y(jn!a^9Ca{_uh z+9_bp!GC$^_tfzEkaUF2YwQGU3|`m-9Wpq>hu}TJD?D_yX*|uLKsHfJv{m^Is(rIj zVrzIoK!FI~JMuN_W+Y>u(;xstrra0(Jp&D^FQdxvUQH|kMb`4{eDH%YBOm;5F~OLw z3oTZKq{ZN9tT*@zjTYoH*YTm3#ZlsVNyNdjw76C9Etri!92j6C307|+e)6?xVu@Nb z!q1yPWvKWDz_8664bEazB*zC3X&lK+m3&;(9x#&^QhsL?hm=rC6xfHLeeH)J6Sz^Q z&_+HDPKY@(J3l2RiIn~aYAo)xlXH=bb@j>pTMFh99nfz=YgZ4*O7V=y(s~D1=c=-< zf}7gl(Z#@ra>X+|ds1k!QjX{T2rdr;8doSH6||F-2dz>^kQLPu(7#46oL9Fz1IObw z2`XfJ2e{zuD`+HQ)!t<0lLs**sP?s=9R}<6pPX&A)`Kxh!e$fNESrYDhKg5#OZGSD z@r9{aWsp6I9$&l*kHOr(bCF8NGl|qna1KOjA#MO+AqH=gKN0N`Yx-E!rSZKQpB=>D z_|9AV3*FRj=&#ayr|pMv|HgWnLdH`67h^mF@c#zyv{L`YtGwA_bk5!>{}?s&(Jaro z4|0V_Fw-A7TmPyn9In3#(QYYyrx=bgGcj~Z{>o|+qJTkGOgi&UNnDJZ(*laCnu#qoOI1~nS;UXr( zfoXmjAw>vLlpI_Z71l;lO0zIOwbtt6*c$`pqabS7JO)UBaH126RtH(Q9$U*Rp%Bj@ ze|}RRf@Mzxu7=f*nTer?;s0181yplWB1z3Hw=Xbz-y_8sBBz3-+ zh83M>=dH*WMQAi3B=qqc)FyrP@hC0>WMKu&QGGltrjK>d$68Sat$wGnNEg>qPu&ZX zv#&ThUyCQlD|k`ZOa2oT&-H#xRR^bpqsrRE?LZ7l05??26|g9k=4a;;AU$bdXXici zENIMm3$kJKzZ1@PtzTuAirvc{m{GI}7Rzky*BH7~8Rf1?aHx82iS&=054y3 zl9^8CW@5GkePQlE$yh4BADavml~hMTG*t8-)jEoyXJ`f%rEcv<-I$NYve(gbBp;OM zCMcm|Qc2OPqFrm&*d?d? zyC8A|=aIF1bfS+kgTuAHf=u*&)xDXl&tA<(K~VyJdGp1yW)P!9C<+uO6ooTEQS`&3 zq$faZ;!&nZRu(hlPQ80n6ee^Mtxu{|%@D zUisx^GznK6RqR5m7eK3HC}^c=nHVGW$NX`somz=(jEYg8g~N5Us(`OJVEPW2Ml73z z9XsH zWM?jTU16%;vV-9M_#krv%};uby^~{VOJVPJc@hjVFyzv!`O!VQln~OJjmuCNgKDYD)V)sitRRs>x8f5g_|9?RNO1oo}BCMXTec>h#pk74)9s z;QZjSFQ<;>85E-ED2n%v?x&E&u|hZyb{He78-=l+P>tG!NXhhz=)c*8|1`5%OGXZ6 z)>1QDFzuG+xdw>#HlYQ-y2u}<2snoL@P+XqzB1NfUH;2qZ$G(%uq5T~Z;-!5)gN?d zDift~xaI&Qr@Uqr)^uUyDg}#G@Fi#NTQ-^xdefVNE)^^&|3@h^Gv8tvuak2ukijjf z6@O!9vg#lPru2PmxBqxbK(me#$Qh?daTIgIMnM%djPErkahtL~)D*#wueg}rO{o6C zD_4EC%70$F%o@SpK^7ozn}Seg;`jxGDY*1~o`&si)$j_T`q+=ajj{;p2fsSnuW_}^ z(Jty`@W)#1z?IP^+rQWqz~~2lMYPRz@}1+rqnyO_nttdW)FLP-9BH?A%gE2A!+y0b zFq>i|C&y$wxfQzv0=aP76$WfHZpEN6%o`07K-OqKY`Iws>9Q%ByMKNLjIl~2GW(6k zE9OEsMB{B?@{t@Ubm}NA4^Pts=2}hOiOTvhGV_Eli$ngAC4J_dpM76v6Mp)ox?m)xTxZM1AQt=!gObE-izfmifC?kg6+*wO* z%81G~ljqU_mAzeuwTu;9(P90oI_fP5qdDr)ii%mi2SIi zp31Q2IyUk(JoARfW=&#Mm;4+8;2p=a?FgJB@E-{BxXu8K+Xcep!RbJwtbZavs9G@C zECe#S@-(f;F;u*ZD9DY20#TBoVk-h{jiqeHfS}HYCGbx9buTRw#Z1r+P3B2M#eX9~ z>7d4#*(Fg zS+&}D>)%x>Vrjvko*VRh53tth`c^E0+pc0A2H;ghBO+}am_W=5DdY67qY<_D_P)Jv z{c};~>_>LF`-)|6q;`KCOElTY4V(oWb>#jIAE&ZMm;$cp9WbPKfT?#tUhjYc5r9cgW=@5h8+#7&<-yBnwJy~b zJX$A%_S_%o(x zfm|BsKBsFAq1HDPOw)x`gkgm!EXOg@a6zy!mnJL4-Lk5+&)815HnlEP}zv#i2YT>j2AIfE@IFm zlH4d_hKm>~)H`$wN9Y$k#-oKkMK2IaZlI0;3UWU3@kNVRs(34wD&EAhX*>lzSjZb0 zthAn32`r>?DJv53f}A;gm`js=u=%*ht{3RaU0Q*w z8JB)0_F(pNX;Ft~uW*^}#Xd;Hxo|&%>(g0w>DBw}()R%SX_VWBD+A9o?JK;0#cTp! z)854Pl{CpZcmWMywrsaQ6tDa=}k z{R3oIiv0oNN!g!(FlBQBo|K&lcv7|{;7Qq&AT}gS5TpmAjNM;h~$>yHzdSz$8AVBq}0*L7XZ_;!A=bANzI~{WEY%&CM_-8g2B~Q zd>SEn#cY~Fc+id+qiy3?V>bOrC}*1m4_sM>CT_cgsSBsgS4 zZ{i@t3tX%4iY}noMZG4h96MT!bj$-SHD;ilhARWtL|i$z9JsJwl-txa^^fg8@SDh6 z9!1%_i^i+Tc3P~ezKRS0ZumQ4PQtn3wP0!WbY*SzQS!J@QM6qYbutAD-=yIug#|T^ zhekIk`$%DbqI$))#u9R6OXB34RYSMY5{pTzE_pSRuJVkx`*-Rxo6G)LTAt0lysD*7 z^)t}V0p+2l$wi084C?Gy_B#e(D!aXd0$KbK;r7htXKqGh`re?9hp{ukDWCb9boa2k z0~6UQO<<*lE!PH?XuThmhV@h)LDS?n9Zf0?b1!qCp1=m`Gw>hNgjIxVL_oL|QOvip zursuoWe#}crMY(W&3rRUmIVR@e<9zkB3}jdJ-;P>YYW>4sXMoq2lFG77$)cW;`ie` zu=iFM);_#kw;O@=zk|Ll2A>D zFlnRy-BudICb$g0+{x=NvueWq%m!)DJRN8?&i%B899=kREy4(5RYSYD&TvmC`zxZz zI>8|e?W{+>;hnf#imL@T^72vT=8I+M9RC9LUOfJAc{=}h_)jk`kuNNO_+k?W>k`i1 z(Vr@4VKqF^V(tF|tp|wOq%!zVtpDO%1uXqNNf?)DJo?BGzk*uFu)VqIq_L>ju>GwP zcajskF3b{~2{^(>EQ(+~Xe5){PUepW5y90Vny2is7*@YOfX~a$DTTn8X+$Kvzq72v zoqY73@AksVW$zG`f@- zobr=TsHKc?7zktyta_fpmuoXp#1qys&VIVRGY5F_rC5TkVC@gj=Lk96UUY~Ng!FWyIq{ z;Q}9eQt(LvKL6!PYOau zF=Y7Nx{bfeE!odwpT$2E!J5YhY*Degy=~@h)xA09U`}i z6)3}9d^S+b3wV$n?ubrW49gS!9En^s#}}G~cZ>W3yu$*sIOJzzCGi8(V>_2K~&D|Hy&|Xs0bl5uD!u*}-{yfYAA8JTZOB&trUStp{K-yDpZO+S))b{9hMwuE1_N+y0mg-(RR`tq`)g~<4kL*~jPuSpk#SN=D@B-O;Z&=k{dBbYdZHINv z(M_uhV#cKZl(C=)PT^EoFQ3ASDZ#WId(W`_f_IcZ9QFwhy&%LOw+MqUFcobHY^&d?VL2%JT(;e^q*T?h{jE7eNXv)qTRNwue-C zV$>-YM946@tyr9>z}}0ZdO%*;%!v?>se&NwuUrFyqET3`mInR8@`wCTa0@Fo6%;`+ zT1uP_J`o2lr_m7-N7kA*H_4;Ok6@_$Ej1Y5T@l?{akJQ3k=KJWLWVGH=37hkLANS% z&$0pC_Dd>nma?nj0~}dcY{aY&Mrk*tZ3oLpSieJO5Og=IJhvnBwdCf$(T5U}C7%y7 z6QNSBaYLX*zl-)SM0QPD@)VO8c8ZMW|N!z*?~+`nRX&af-_=gob-wPAkc|^ImuA*5-i5CSE*>x z@56Y+ir*UCfJ`diM3(&sAQ@h~0bzy;S{TYR9fK7$b^*myK0>L{Yt|ORse*yBYaxQ2 zAV`KXBJGgxbHX=)kkqjG6!A@0ZqRgRzC7;%%+~Z^fJW1e<$#DD480c(9vOEUmO!xP z0J8!nhYt~74yKT46cRp!Q8x8+c6Fme9s)>!1MLHqLMMXY-08EPQ3b*KR0YlwcevO^ z$Fcx+2I7k4m*?>0m}ng1xh*(7oY_(~GN_wTZA$TXCSfkP%BjXPj^fU%awcWAJo9ld zXDsnSM(FA46by|sDjGdcv2)nikmh;7pH2JrRjbV0{mQ3q9rDPzRDw1%gz0I+K98!_ zOyRtn+2XkkrwtFym;W>m1ej$V7wwG=qBk~7!P=Az?3T!_X!QPw&yr>c!PlpPQ#0F$ z-Mq#b2}vr znr<7t&#eN-X2_BQN5~DZ9l;p}V-TT?W=Sy@N^H5B?J8tUx1? zZo!Ru4wlVV2!%a&$#Z6lc`~=kUMJOI9_|wakkd{6pau^e1uhpD50J?pS|HaKbBqEL zh++%obBTf9(nwo?3ax3bahP^+wZXaQS{v_SOh^X`K?oND9uHP>n~Bj;ITIY+1YCX+ z6&7*Xj{*g60T+d+%}UAp<_GM27bQmtT_~Y7nP5Tb2_sU#YfUbMw}gH;6O-dE{5Ael zseH2@i5i;4>O@Gca^KYI}MOeI4ln-$$;Nk}0ByI)rSdo0vVyv_p z8_W%7zWHV1_9nzlb0_dOacNs@HF0VCd$szC()L>}&sUJPH@UP8$(Lv1Oj0zPrC(_? zRZmk*Q=|<=f`7*`emn`5B`mgDCXMk9Lf-M}PI@EJfjFg6!$4!NfXpo;rb4(ibMK08 zMdU4&5^#A#24qjoY~%7~jmg_Exn`CkZ?mjJ03>yCTTI?kA#a7&@q{&Cr>Wl}p|gNC zX{<98D3K2oC}O8b-CU&2v5ujmNz+4)(f?G0PWT9+8oAIN zTFcT4v zh1vM3#Vp(~4!%wbU5nd9DRd2P8>G-++@6$hG%c3J1T{y38h=n@59%8058U^Nao@4@ z-RF)qolGI+Y&(rqbZ^Y;S#jM`P3EU7Ea)#~bkHTm@=Iu&=~({ug_>PhiUSQ_v*g3w zorIWGh_UTbw+z{blK?S%$0>Ig^Ksm?!}Ts|g8}@8;4k1Isj`8oXP+c9a2T?1S zBvdOJ?_l#0XxdWq6A#8Ixc&=Q6|N1qBu&Ckg*O%clwVSkMoo{ZXcK{nwXichS==!3 zSo6GD2-0zb1mWJ>@TNiAMpZLub^89wXpA(tu0=p=GOci@pREzEQQ&x>Supk~)>GXj ztMYnrcnt!0x3an#4_(Fa-Ab|iu!Bon{9p#~6nqU8ub?!6a|R5lTD-;MZK!-vg!INe z$`x<&+sF70lL$SSU7o-g=#g|49P-@-Rtn^_Mmi<21 z%{2&*Md8C_-@CqvXM0f{9cU9i>>|)bb#ye3(00nAReYQS+U*eQ@Lvpj+!$}W93sRa zzc`z>Xt2V%0o35DeH^YSya4l26c${=Bf#n0+zgtqaIj9~!GTU97x@mTA1o?xIhB$G zzI;L{R|MIPzzYHmv+4waK8nDigKo9c9gA?k7bi^2iICFP&=_e$;lTxK}$v!JBdmtX*dvt47BJ; zzI_C!&>^3lB@7MJW=3XD+20}KCMQbz5bXj6;cN}X6XB7q)*Wa! zF?L{`O{XzN{zA={H&<_Pj9?IN`}Sx;o@al*THoTLA;s4al(}!VvkKA)s)s#1KDF z5d9K{fK>r>272cupdtIe2;*cX>^4QIyc94Rb<;GP%6XJ^gb&eVn@oY2p>+KYSb;*l z1SESZ0K`@lMM&~;3@~8u{=aL>5J153cxBd!XMbH9P+A`w@s%pmPK+#AB@+5ZJD&40 zM4z~FjJOw~iOB4ngSff0Iu7?G8ho!oHr~t6!5S5j85jl$XyZLkG+lyhk0jy6iYlT3 z&ScLfd${rl+=k`NBoznL=)h6Yn=q82DlplZ4{;S^3?dN} zozVeb#Q~fOcRLu+h?!bGWOm9$yl2%y@Mlui+f_6d+PA%u)qbBtQfJJYP=>C0_|#HSX1D1hd|K| zB2+Xkv3~wj3#pIKck=UIlvbzH4UO(`)E82Nmr@@D{`PzuaLeG18&;Z~EqUqeI1dEx z8u?Fmab>X*n_$5R2r`1Y#3Y#=&rC06!#H2$%h~8_L9-oNI)?x}aqfd@So^cr)=h35 z(uIj_8#xbnVY5!c^0*E+KWv6(u9iYD(X7;9nA8cV2oa#Rk|n`UvMDMl{vDJxvA#lH z-lv>Bw-sQA%qcu#C_vl}TXL(l3-5;26Va(7fuUjm%o^?|OQ8_?7DL5PkpRY!74M+C z74-Q(J34?{A)5f79P)in4_IR*6%A3TN0NZk*yqdusuo%wM1-{W(-^Y2XoCuvmf+%RM}&yE3^+0U638y=!D=?{Obr%(8xx+=+uZzQxoP-j z39b5K#beH4dB0ooAL~xv>u(waZ>_T=-#ysD)Tj^MNagqlAeF8F!>tNI-`SW7kxDx52Rw;qUxQn&mLjrVDBa3!}ZqUX=hyjFC5u>ywdD#Zn-x8R! zv9ukWuv;y#L+_B;2U(p!7SqH30$Cg|PYe8J2va)qLK!XP=Cd-e6&1`8LJOdx@3oYJ zSB8644OOd96M-ED)uhvZudKYL4X*0-hfH!<25YZ}i7owTMgkKG=)l|7{ixHarq zZQ#3D(?}Q!!~^$3Ci}9Nvcd_*j>BaP*rgKx?y!5M6Bgb$vCs*pg7(uVVPb=N^+gaX zc*|1_6^ULVWG7#PtR+!N6{Bub27k>KJ^h(2)9f>87i%r(1IUM%>ta*k%lMHqo^fZ_$Aj^*rMo zFyMTm$P#g=845>ha0cbGtNu52ndi&=z!_(nA+mSPFy;wro<+R^ReXgiuMDW48mJ+p zMI5W5D$ewu=hz3^fc+MM{T6}!7J>a1f&CVN{T7bBkH9z`=z&EAprgqC72NONL1WEv zWQX>thO%4u zY+;|aPSt2p02wj=n1|9mlV^L|4HI%s+nPI*0 z(UTa|h|bG@GRgB``N<-xRMtHn9V~pYvQBg!B zOKbT)z072)9v`zCD*lLqX(vVG)a`73&>%Y`$i#Ft^2BsLoUq~qZmdJYc0YI}(xNAC z!z~_BVGu2zSuisA(8P3`oGv<8TT$J@sKGA4!W@$*N4H7t04D&l$*E{UfPv+mtD!*+dlI++Feg*1l2Q2(#vur41{+Dk zR}6p9HQ{*wMQA19W7w{*M>dgqF*-XOq8Lr{m`KC)JCFqM@M#A6T0ne~(nyk{(In#I z8!;%~5=jy#VxzUj{uC@esq8L6o9RFi3DfJ@V=yKlG+}wUlU$^t;r9U@bV*)k)KXZM zi#9L+LcI_$i3eT1v*#6OwW1k#sv{N=z^G(PFeo_SIlX?ys+057aTVtwJb# zwm#g%vMbgCE71abo~(G>nvi4cWJG(v6Z0gdvCq%`8r4oiO&8O?2J0-Oh8T>&^Ee-P z3ipL8#XSoUXar^_8C}BthdGKLaSrz*w%y5P`D)N`alR`PWkF9Vju&qA5$a(3V1?BK zy{&kwDP0jDDyPVhuakyH2nGTB+ znm$xXID_pkRu&q7)TjT)_*SY z0iAEcD%If>7G=*-+X;NFp7s!hZsMo?i|66u`^U-`b#&r$?qaWza*RQ{{N&5{E)j|$ z9TI0`C^UT?Uq;)GYd5a)#pkS@kAR?aO}aLW?nmN5#q&{CH13b!m$xW%q;OAc|1hjUAw!Yy+Lq`~XFeteW$ zmh{UlggCebTun%TX;wy=#@`<1{8dD(iVNq;U5Rf}PIJEb)g zk8tb?SfGkpGxGzFk2s9FXEz^`pxiYIXW5~_qnu@^C`3Pzd3FU>9FSH4)1)3(QD2iL z^col}zoaV1dNU5l-kFqncKP3wnkXCtyCk)rS&_tAUpWEV*MBMtIsmPw!#5>Su#sJs zCqk7~cT}M&XnpY&SAH07H#|Y$MB~rwgrZS4B3;&1K+oc_@y|*C9ZS2vZtQHRA?ZLcng~J{ngV>Ij>JARdFH0VGo@ZpkhyTOr z@)@G~K=57EHoTAcrO6HNie!5T0tQGhdh$^w2pU3&|3nI=rA$9rTMb-(bp=R3$BHis zoxq7T$xQPT57PRZujecGs7FPw*!i1507)`zl*eDy4?aBR0um8TqScrjSB#l+Kjq5I-eORNe!=wYIRe=?eZw(CK^LIS_P3=m(#TYY4ST~BRMbsyOdT> z^D0DBe$Sg;|@jL~ux4`9xxFN*I z+DhaU;KgIRTvdb&eMX3SK}w$4Z(*=$vXYlw$6AT%yg(d|u#y)QnSlunAqcL;9H0^y z0s1j23)lw0h8qI4BTQxxDrNl^2d-;?0CED+w2%B40l*KS9Pm=%Jh~G;8Zg-eO0x%5eQSj!V52Hz(*khCG=HD=Urj zQvf1NK80ihlkIqo$K;#+VFGUDE_+&c(g4dulIeTx@x)w>z&K(~>JM9gSPf!YM16+! zpF-okiS$K-4yo+eH;ZTa6fo^m^#)16c}G;E2RFB>^9axo#eDW7-e#Nn%j*wEijk2j zQcPukNgLi5a9pC8@8cGwmbyf~x<8iS6(B148`UJ9oclf@k8zayJcV(@()C;LUQzHr zDPOy6K^nKltu8_7Y2c@q`XgV%4w2{2BF~33h7n9gIpszD<>C5cGG#y;-;*^6O>Fd} zWexVEDq3&0u^;O5TpHwpI`(1}ch(>*+-99Sp->E=!CBf7r>9#}NEh*hN0J42P7Gop zl1tK;@;-`*YJWq;-b6N{v&j3jeC3gbt*9qtYYfR&yZkl*DMQb7P$&jvl=u!l+ko#? z26f-ZX9hN};bK^eq)K0LlOWP|DgwUBAwEFRF4g%zQ8UwDG(oug28rj-MAlLy#58pU zZDeZLOoT>%gD@D9Nd-!)B=y&l1U*AQzY(mVd?I}>eNp1L8sDYIti)O>0tdO{<_ytV zT}$~#G$G5iBx@5DLDHb<)mZ9xDK+|#F*HAtDC2}92y+5ArM44+X$0$+5ey=35JX%n zsm90L$qJOD1U~mA{Ko^ zTI}$N?1@5dn>(7X!V&MOT>oQMA_pE5NeEU-$mWhLEEcP@y=I~5n6QVDBs1D6~p-$ z+t+ewyAN?x02S0(i8R|+QtI#FNu;@`q3C6UwlAUZM>!NNUS0G`OD0eTUKi5qbjm-6 zo-*-77}x{`g%ox(PpnybhA=o)PohB>@W}0 zAuN@`2v%nc{%zMrUpM2Gy#*7&^F$n(0!Z4MOd~`UBxLP;j)3&Mq?8?63X(0;ZSRT( zJWLfz*)Ag>^Z>Bh{yv_T-H(b81w*-1X$!$i+1^2ECTwq`yo6xrMgeRq1)!cdPy-3K zzeWI(x38yAv>~Sj#~Tw)c#WDi@5prH6XAcVV7t5zA(&P})8Qlq z@16b=q@b<-mWK;mFQKG9o#l7>g$>(H*ljrBu#hyxK{zsR08~qfFr={f6<;ebA&Pd5 zD6$zUr7|s4CJaA+%aj7_FNsFZ#6EnlF^bTXf`SrfD4k$3{YwDE0o(TPJ6g(2TBcu% zpnN(G%cRYR^2wl85uzM&;FA&d22rG4{yT084aTD~3+6{irBy8QnbKW9v`gPuYnSfB zwFlQn>%?`(f7_*nFX23#AK9g8xF-DAE*0SVj&iNWovzL&MoIBLts;D91s{{&zv{+< zVtiKquNW)62ZbV(S^I&bIAdgR&%IuGK5Knw!94m3`n-hox~!>`4e~c*xy-K8fYx(0 zy)|NfSPAg{Ga)tBcd|2Z81PBuwx9|Ab!cJV)5$aayLzV7qtBDln^;>O)+Ahyy$L0( zy*^D!lh}oQoo9bNWLGJMrkbS+Sz1b4iBFmnw$IdXlTkD{Mmp+dXzG_i{!SXm(RkT^ zN*MkaRMB}MsuJo$F}gH)Q?VZ-qqKFvXmSepzfc)o*Z_18V8w!8isNB5B8(@p9l-** z)2pt5$}`G!@Ih4NWLaipeo^+1;Cfa=kXwhX_jUU zRD^sZ0(hG__;3Rxj&w4b+_;3w7nvy&5d%Lktrn}Ti-NjJP)MxMJ#e&`d8|h4ORU`K zNzOaBcW@UosFj1z1BM8eH_Hpmz!B#ZdQv%l!1^>M6Y)iiHu*z5P{Dky$1_74NPQxH z55;3ptUhz@gOIU-^b11iGu>(r#y5wM^Hxx}A@#?IXp?_R$%o;=Oo0{=7>I!e{!RXD z>TFbAEri7iGcE}pIhaATK?ULL(*yrtS$`qA6JLI8@OR?i!tpCg14}MH{XTq)NEy#T z{!`<~=SCl+l=tGm7Cz3VWoRZ&UVo3lu==vBTDcouFDo1Y^!jH$3S<=o%1 zuvQ&z=GD(2Wo!^bOJcBEE7ILHAp`3YtuwBrVeQMPa=ZL%3T>C)#jW(*-$x*Y|C7u9 z)<-LjcqfzDC#H1;heJ16@=I{KA)kAVsT2zUJemNVSX9Z$2md8bmj}5>{Uj(O%6Usd zPL2deVH!}F1WG7?I6X?p&6eg`1Xxjh%vZny&M|Dvjn(f8xEJ<^`!5r7?vZm5(3`f` z!%B+K)>9Nm*T)lbH{_uNU{gS$?Q$92Kn&I;2I#zcPC;TpAVJU0VL$+}WPF(XCscg?q`=|21X1d|3_*&8aVVz{?&v&;2+DD-m~J_ta?oe2(_HT( z*4gL z01qqT>JU_ojTM|8Kn5h?Lx?sxfSAxMls1l%pe-S5CLazq9$dW_881-uEkvql)4_Mq zNT|oOBCG-={iad|Fj#~~p|0U!3hEBfFa#bZw7_tRiDHZsleycBBIR%oqT1y#NI}?l zd2g-;$24T21+%n<=hD$XHB1!ao_8r}6bg`EhJbkFhXDC@IXj^+$PDa~hygPdUv9uS zTCqbqcfvvdoOHk;WfKtvY#U8fGY=+|OdPfuv;a9b5~17W$rKNLK{pT+D!~%*T}{Dy zbR>#u2u!pf>r;x%etJtP!C{5<)50Ai}|iSn$4w5~2N( zh(f790A{?iXp`4d)^>Rphd{E(RSvZ(8k9((G$=o$!go{~ocraI#NtCw;DiapJCF0dG%JlUGCPz5IP=P&t@kUx|LW$^*Ox&U6yEq8i zh8t!uf1}>5e*jo_i>hHFFhCu-m$^;upd#936@jAhY##&4>Kc=PvO@6n$X9uq^%yF4 z5)C$!3H^>-jZjh`AXc(FsYs^wh!GgWN9yN&7Y4CxG6+ZPFYq6~Ontk*c^Y&P+AZH@ zLTOkJ?B@%}sA=yM7%rfj=mSzCeSk85L8(bgQEDy6%TRF*W^fuLz(UJ>b|w+44GDCE zH29H#I_e0eJfpO*X!z`>+-vwDZYc4;C?5WAx^+R**T2i7>vvEzt-=Fh z0%4~kp|>J*ALtFdp8OT~U_1FMs&@-I`8xFkq#J9EeIdR7nBLzst^3G`BToN`v;G!G z0l>!5Yk^6u%Im)dwJ)pHOtW z?8B{L4mD|;oI^nvP6`?*!%0(hj0~eGK@=ouEvh=_bGXZ>{!UjOuXohdAhg3tOva8e0s259tZ#t_xu-FSHQZcXhf zX+F=~IF8+skffpKC!Aw{L!s^RVca5&`eO>>^9dxVx*uX-M$88mE>8f_TOFMOL`P>A zji>g=11M>NDdvtdQ6?q;YB(xzxq(94<$LJ{Hi6Nfs+c_;C9b!TCTd~`ow8f*!iQ$K zNqZM46sv!h!8^2Js{l&h8;pxlc{0JQcV%fjwk)mZ_J&O&)h{VkJOADvm(eaoKEWEw z7_f5~RgC1fUBt;Pa5Xh-r2K92w-QRB`cuGtQgsJy$mF&U+k+vIQU0P65pmYf&k_af zx&%O#r+ZE2g^|1AWl`o?f`s)kl!M3x7EB~puYP&A+=Lw5cgPK!Hu-mWM>aBSFilq^ zKTMRTsR0?Do*2=57ge6wzKcnonHZRPa-fwx-)yK6gnLpT@!xdgmR4N9T!AFLnhfJ@ zqzsK~@QLiVQ$8YUn?lqlX(mn~>NNs(CT_s`riQhoWZUG6aw68hP9PbdxI?OgNENF> zR3b{^B;xl8Nl-U#B14mr!3-+=fa2TbKhsTE%Hx1agGZ3xlaSlCANjFMH=hhYmkUYy zbb!+YxWzGW#}Yt*YxZKJDY%C73o#BOrEQdVQE(j3{34NOPEvGK+x6j@-H3)4fZN8X z99hbs&mSoh&I_U&H9!K#&*=|;KavXL_*HVVD8})(5gN}!BdO7%$OyG>+lBIpKQRrC zJ`BKl-yN|GZWX8$(5*KQ38zDxZTAJ1+*h79RHVSvQcU5_74V~jdOtu^KjRHX!BOgY zO5-?S6GcUl?L)cmBbqFtEMN@EDRTEc%G54zpj&TrGmz5R*$k7+htuwPpGP(=)!lz$ zxW8p|fh( z^QD#sn32@yui#0eQgLe>OczDe zZWX%Pw&3j1xV!3CB0Lhm^L4vK7roOxAMy1{n&17}F3~mPHF5QRzYIJc{HJEa-kV&!b;3pHG=Q)cGRi&8Epi zT1?)P_KX1}{uKhnYZ;~%4+nL*4V$4<=jO~-k1k@nO`!zb zCJ z@6r}$ajtx%M)f_@aU{%MAY|J=QR}(N-wJP&bv&qz6qwN*XXz z+SsJ2|9mo!4(JzQHp{U352y?dpLzc;IC3`Gg&_L1CNJhsbh6G8Jke@seC2>3F{g%I z6EIUsHdD(62K1D4W$q(?X_5s5KTkh7D{wHaM{$ zTjT$u?(GAktgig=Niu-}GR`OoMol!r*hZ3QG(^EkG|>oA5oZ#TU`3@}o1JE9i!g(> zMNOQEGI^Yq-PLa0b$6LYyR>$zb!`jOmb?JrMKJ++u~-GI`osXnQbX{C`F%d;K2K(b z1f~7fKYr-sd7k^+=iYP9J@?#m&pr3tc7o8(%G;%C*dxya5?A4O2Y!D1+VESApGiAj zqeMGSj#Z$?J>LQWR{kEm&6e$s3YyhcIGfC}I3DZhMs!?~d#iSB1_H9s*QqlhEpv>t zoH5c|BWY+SEtZ4&rs7wE-yHmI!|&VpMTt=Yd{IFzj)6Byyz9|DJ_uZ>O_4}`lk}hb z0`ZEcVBay`LG>Sh?X0uNXI0I8Mn@3-WlJ4Ldu-|2C z9a?^Fg8+bIX;AXCuF7lYwOMDbtc(S8L>AzpFYLME$sxT0;w}%reEbSmUxXbZYitPaJD#ufMtD`>6(S<8aOD~) zVk;?lL;J{hen)Z~(^iCBsM9GiwsJK8Bd%~}#EFp;ipT(T*#8|eo{RJ>$SB8!ZQ0Qj@@%BL^d7{h# zC6jScai%LCv@G?Jw?=Z{JTJU5vlZhW!G+i0Q}O!fVOJ)nSY=PQRl96jS0fqa*uKtp zY?C%O_ALfar3Bu(HrQ!x41VNXx;s?$96D2xq~L_Cxpv zMh!dPfIC@SPdXp?5Bn4$4f#Y%scJ4h$yZS}9QMxOE4G%(hiq&vk+zAh62enaev3x9 zLbJ2lQ7G}Xfl?d>up9F7U-xKya`1(L&ol6c13tQe58sU7!w3FT`0&ZZNAjD{M)^j; z$6`jo$JZn9nPv8*GcW&j*ZcBb<;KmKP&%R==uTQGciS2J@;dd@$lS`QDsbSz6RksG z`wMs*IJe9jaA;XN?$>%yOhMPcG$?cMm&+ObCSBe{s){=u&va^8+$NaTK4L8fq zEa)ugYu|_4a268=#)Y%^gg`48@et?Z8Wz7<>lHY;9@ZO`y?z;DWS7|SXH=p*f> z*$I>gd&FJOWo7k|8C$V!jy=2c9c$XLHMYPa!Klzn@!%Q^c6bogu%rXacUm9(TaP{s z=e~n!M}Ow47@>{Ygs4!)IRUND0<7lpyc&?)(faRrSSNJYrhU-=5}x36mPI;BJ*_(f znIOvqMXJt$Tt%uWiD@R0oSp9BWe+#Gv|Z~$09ar6KPg}VjHN}Co+VqS?QUDi7w}u_ zdsEAZP{K??aL#$31czNq5uA$cllH12!<_!*=(`xjsUQx_Y|ACQ%^!OaWm~mc#Bb{y zn4sDRw|r$l*@XZD{4O%rhGw%LfEW<=@G*o*y)TGYHA*OIxlS@?bRV)fp4o!XL$9ej z$1`0B>z$Q>x1H~dOZy-VXK3B+^+=DPn{Wj>9a;~64LY+Sxh|QYZmd!*spYcG*Vr7P z|Ain`ZGlz@@#tQ~A)SuUzu-Yhe__lxbxmB-y5RW~sj_uOW^_bNb{K?@+g5+=df~G^ z_eaaBo2Ht?f8(jsC;n6tpG_XzYzuZzoip&$MD7u003YP2ICxqqxwPbP^KoyWaD%kP ziGh68KI)yqstYZm>4EbVbL|*7cLUo5-Y@trZ@qlCXW+}2Hh~#G_C{8m*%@$}c{4Ce zLWi6nZzJ>1?3AXfOFJQrhYrCuRb##5nI4SuIGzqEX?xI19nb9bL{&55zE3M>6KnfA z-@+ldY|pfPX?r8q1)dsBhEF<{o>ptFQter{#`e2IAOJkP0b-Q2z^RzvF_-y{Jy1sn6cNw zXW0&p{<7-0-2(~2qucDNRr#HaImgIYS}7%8$<6{S*&q7=@pcAzRYEZBsQV~ALL=6p zi1oop*~5+pHM8rWngmhRoha1}!C=;=AdH~Sv~KsHBglA?P$u&U^6@5AY0rIBYzArACFU6Hbj2jD-$pgMUPop1%rRtCXygC2pD*$K>|WyxqL ze4=f}^dqxiv-BXvFZDHG6!MFVX-f8WIiA^Ob{pK|kT%slI^P|aHXO0utGZFz%N~5n zUUW*nQO+3|U6{~d|F>|9;veA`Z13L(Vvq34c2Yi<{K73Ezr&Lf9^H=6vwUTz?9__L zN(IN2{Gt4q@OzOT9}c9;0I~Li!NI{}?{>bIp0-EpN!z_)DqGKgZfD8PW5*QZfMM{V zVjc30IaX{k7%**9q$;};%<$k$)Z5mXFusyQrV$t}Uhb<#@MGMlje(JzA$SZAj8hPj zM{>ywa6q*gojdGM?+n=~oD%$Ks<6uCED@|So&3>F{t(<$H!%SN3*?BvkCdgE9FSu& zYEGaPQ?N|;vA}q+DejWEz-a%1o`kkXu=3As{Fe=xImn@JQ1L<9%Mt66(`XDP&;G0(cAJii)lsJ-HpRXR%<`QRKUe8(7MtE+Z(Uj>2C#c}#dQa0J zlwU>-gi+H*Wp@kii4$Z;23dlW&Vn6UX$aX1x=MC7rM3=frE8JPBVc*4B7i_@T_+&S zJqWp*#d5K(mC26wA`7z(I_ymwUT-`qm5xEoj0Q5L<><8Iys1Q_Ud`k)HmZVmgBMV zIH@y;01+SuKh1%5q}lIfomngR7o=?Bb^=6vIB%PeXYYD(NY*fnllIJgkS>U0!wX_+ z_k5aaY1`6#{F>#dzr4oKmsm3ROX^qVn}8uv{EL08#jKHKDXx+)jbaNnKhBbWcP!Pi z4sJ3QeewxZTq@w%30_l5!5}8mPR!lU+XfO&4$I51yu|biglH%3BbvKRw^k)gNAzNN z{^%dW|4ZKtXFuZ&mBa-2x-yf@4XeD|!@52n5TW5G>Nh``Vi6QMMFQi^M72HXte5{1 zE9-_skN$mDc58BF=1G+bJ~WlV!>T=OpbprDtzj+L25lG5=k+qK1KOj;t3NR`MtfZO z3ECs87*G^+1rJLvhl&)X!msFGpZ)R+$*^Z_}1vtkGHs$mc z@3+md{+==b?uTc#4&6Vgt?KI7JRGBNv~_63G|fH(MkS2?)~lORuwAH9oYm-5lBrL_ zNAte(#|Hg7N2T&_Gd?kbC96h63CS^A9~Ul7)cMRufx|_ zd#)211go2~_3-jrwVP}j9APeY_b$)ZdJFm@k4&ee?CiI79<-%(hVjm#U1tSPH-U5@ z7>dwpZAd~`f+FY+9yK?7O3e+Q)ULDLnYJl>osFA7l&mI@h@HbDTmPUP_xa)kd zqhAeG14Mh-AX?Ro3{cIv^hj+}+IsdP3M+jAZeV5)BD{_jq5_T1KeeD=ObG?uX?jTvJ00`!-gQ&!{`=-|WA+Px1%pezMMJzxG?Tk8a3kz~ z`Doq@tP6U?S;gz$^R^fUBDy59x~ znptqXq@(Zs*4X`*M=~d9-?C}*tOa_bmLq$=w8h^z(HLGl@dT;xEo;G+3U^Oqc;U?_ zR_q3Qk*a2hAS44F4rD$W#BdvayfDF z03#d6t0y=RLa0Ctun$T)F#QB}Iz-W8Au@&p4`rMDc5j^DcuRiUf!w3`EsOk?zTN>K zh2I_r6@=foZ7O&uljUKp%hwz)kGI;(9{qk*p4sWEW;hl9HpKZiTfYJ20gDXn<)#$0 zqBD=At~#AB9VR51BRz`e%^2{kjKjlQ!gBrnM5c%DC2M^;{ASV9Z-SSJkzW40Ai>nbI1oynWr)bt(y)<| zx*X+9oa72~b01~!MCOXOOA=aSjMrE|wY`op5!>nlS?qZ@@qE(ADJ-1xl)z#I1ho2L zM)3B5j8Kl8+Bhw%n8{nFZF6t&Ux*{z=d_&QSrq7mfCV*pv_Eav%!DP=Oxn8$`ogfx&#&C4) z=TQlE0`-|!-wMufJhQ@;$8Xt8fi6~IG#mwG=51`ygWTbQ*R8ST7eOrLNe1k`MFv+M zGjuQmPU)_TVbSZBz#G0b0LuWJx7rSm{si(U4nS=p5Aw7W>IBmInUuMd;w3{69nM7V zPvn8O0A)Tg{LD(~+lse>Cnor> z4xX6kuMVED`)eSQmo8L7e%busiK+hd;E9ESGlk+g+IAF~qo0X7aHAx5&cJtkIw}VY zym$thdAKH6Lc9^qKY1OIGDPYn~Q1|b+gVoXDV^*w@Bh(b_Np+?Vyyvi^pDJaSXo`s@cGUPr2 z4sc@i@p_wk^YTlzo3Xije&vZ8Umhr+55F%n6$nO!Z;s%blgEO0VG|3WGgP%PD6PE= zDV?K#Z;uke{##6GJA0UizMNv*tx1r$yOE8OPus<|_!>9YfC^CP&%-d3)8KOg#yWi> z*cjJj)nRs5(SU(VgWd*u8Q(on_vxzf)%^<#riG$fVBlN5wR!>@2gA2>Mx_#b}3khnWd# z8ieI73HuDUt|WCB9RCvUI}~8BM~Ov<292tC3B2Vv_)V5DzJv=t7->zzMv}BqdNhK7 zV3dVi7cDPLeGh$h%#h03cE%dP zIK?PT+4_F$Ub#82+mytn9bJTR0zQ-no;W_dB}M)dUw>Aw`YUAtT*@H}vh~?0mV`EB z!Kr{d3BCn!_;^eBxF6>WfbS>V7js(hDf=L1zrMTT(D9bsa3_jsO4DO+u%{{epfN*M z_Q5pT2UCBK#m>{U55_09X((IlgSV>E(cn&*7mIxX`)c3Bb_!Jf;1^N(LnvD+e+^St zpcbDaYug~utXe80x2-yyiX#oJO3E`bnavGM^&9Z9q>~4Ohw`OAeFXc#kncw%91O^} z*f1^?Q`rL#=TH+cda7iAp(CAT>`%5g7&<%VDjAUVbvO-&^K?4rH9HMfLHQpjY9b@eLc2J+!T2IbBjqrq7@&3vN)ZNgwt%5 z?h}Xxb%i!Zsb#k$sbyb%CwZjF*IouQo}A#4&31kPr-{~-0{?c8Jb@3p8KU` zlM6a!&DR;Yh_SEwchmApR-Y1{b22BfY@a{QFuWzhq!5p8HE@vQ*qv6H@x7LR$&Bwc z_Kfk}Qv~?JQYPk${bFKN9T6=RrHO&2j^Hph^!^(7`hFgVhqr|1Zf>(My4{S=>~_JA z)0dqIbZ3O&FGuqAzlguV?vHC_;A_y|0avgYU>p#(n<*SKQ#fWKt1-It=;_GI=%q8k z-!t_$vESgP_`t`Rv2S%8YTgp+-*V#%K#5N{;DmvG(HcYB%Ctz>8uIK?Et##`-b!Zc z905|zHolHh*`rKANB7;gg{^b+N!wDDK`zsOtHIcq?0~H_Sb1RVPMCKjT6*de*t?Im z1T)GS4s!SC?{FImz&BVNn@>6SXwbi}Sl>{mE)%?sxkm=)9{CX~7~U`v`PT@;?)3r* zrJYj0azWY+x-(Hr~YyF zm>=db>V?Uz!|@pQqIzz{X}}7hZwp&t9GV5kPmN3zB@yaPGfSNUWtYP&c0VOb8pGJ5 z2V)>4m0gBlbfU&gO2Y8C@EI^@)Y?XdOtG!THQ%?<>Zj6tC$L(hve5z{t|1-7Mx6xB zSJ@y=!ta%_@RLN~x0*YBz8L({KLfvuS?y`ymvS2T9T*EgNd$f!IP~fZ!tWxm`l;IQ z23C6-_+5y6pVxke#==h$f!~1xUl@MZg9lHA-#1w8Y2a6hd}HDV`ylKyY4zI8HuO5D zjJ^$slZ0-V?Ra=Ihu@6<8JWEDmQ$fWzkzBet3@dcJf}8v(WIE%8`Hv*?hMyq<=#|a zr8o9`++f%d8^CGAHa0R3eTj;X49DMNwMJ#5dn1GIsD-#%{-$%4^Naf7&Ogjj{}j`gXGX z&1U1CEPo{t{B1#zUr_)3I(YL`{2l(|>GAhhk#9`?P8eTYW8o)>z%P##eKGR46>N4Y z{C@h{>EYLce4mG3@mTmtBJitVMPCelPk}W~h2Pfwr-xq@`9|R<%G;k|{3;`67r-;b z=)m%f1=D|G=}%>aRMM}ucE9q!TX|rA;UR#`W@DPw}{hP?z zI&{zeI=$U~lV4Aevn5b~Q75sFZA*!>*CX`KMgx>oq3J@(2!H;P_-sQ#8>~~Qg=Bg8w zl1@((83hJPN@DK!VXezwe&NVy2CZJT%FFQVpi$&zV4fd%LzU{cL$_ned6>rDWN7_y z*A;2<;31dELI$1TLd216hM-?eZ1V~1Gy;1zJh@QbOw{7?lB+%{d48B0GF`cphDQtuU^n|CUq~5XyuG zWfzkM1pop5Z)7DNwor^uW`mWqZcZUxCyS3&arfja<8RvU>3@Ej&Y|(C%{a62g{tzn{q>~z z&BC$9A4vpxI(DPAznJmoB5?Al#-AHl?P=)87b4%N@#iG`7LSFWBm%z!uY6(nT@Nlj z6@K4fwWon!CGw4dU)(;@4CGE}AK^>dM?T(#+LG*7e~o=)b1#{fUD8|xd>JgPY*!dpd>XIfDO!%_1s`o? zmsNN<6XP0A@YOFMSo2*K5S?Wa>scPJ{yMY@WSW6C!(jnCQCpec2HLndFv3ur<9>a4 zmKf)7BAsD6Ouva{tXZWN_y+pR5c%duze0mCV9TXZE7E}UWF8We>9elEem|Z33*N3r zJ(<2?uvv{>uaYD?fGt*^K*N(yJo**Jd%7Ru-Qq|fooDwjY((+eJlwcrk(GQLlr1ZM63lX1=l7;48>D`tz!I>46DmIa3s3dlE>UgM0#P#w1!_P_tR z?ep%Ar1tSWOW^me=S2a(85tshiSQ?fXX>8F&FOk3*!4Peq(bzSV(!jk9DDIPDvq+_ zfNL&+vV8k`or(PCr0K)s%^!e}|tdK{Bc- z6MKyp`QkVyzPS=_fU|G4YA0S4(&ys^SU>+%JbL0q;AkfoqUrK6Ln{n+q;n&DCtAAdy&*EfI-L#};*1BxwLm16+6eNI8!=Pz~QX$Gfm?qSD+--W|07l@FSefw|8-HA;X z9msLALeBj;vc3Zo8qKv>UpbWyl8gGWgJ&#brt+h~aJKaqAO@VK zll-|(?Xg##=+71R*h5=+^j~aK=z@}y(Hfa`#=2QO_z+#1lu*;;QNCQi#!zSYa?x8s zt(QHI{i?!w+_97)G1H(M*!&K!jGOg3`4{Dyo$t=t-x{N4h8i_rmQgcf6n~A3nwSHF zy|eWXx3ULqR^mjtUk`%A>B0U7yt?hqJGgVq>;*IF%?;|4LyYyehHv+xqt#db*-BLKIeY;-WJrJ{qGY9^~zYUWjV z4fb+sn?`l7OCdN>@+kBT*V7&7T*~!yXbV+_T}nRg68XrQ-$3%L#fYT*;GO7B*tv51 zsQq)%3g{zjndANm9^L+e%;g~8OY5OP5y6VI4v${0(zU?`bj3w<@l?BGOZjy@cDm}< zVIS+A2(;sb3MHFwYdk&ae9M38{hi#PB%R|`94yU3uptzofbc2Sc~{}06+Ozo!%Zou zhu)+=!ef(#4`e%jFY_O*s2VS@?OJ;kJ1bXVJj8YY4oi;E6g)(%Y$%IIf9SV@4md;< zn~#uK?`iP;Ge0O9;tm2b&;4JfX$yCmngcs~eQm0|h<{uvtUTa(<>eeW7@2=XYE4sW zEXzjVQ5}1?BlH-G1+g*&BWRU3Q_{3{+&{}GHd}MldwpS})ETo?q1iYC%g&>>aGl62 zg-~{27rR}9oR5Xw!6*_`SOH|wBQK6+HOpOt-`Ql3Wrgs7Xh--vkQK|yL|)@*JfPtt zxvEB=1>YA4$vY6q3tde%i5a}jOYo3~(a082QTLIV?`k=b0#F+q5B~{+sd~V8g8Sf! z?>Qd67&nekCH_Wc$AZH*I3E5K9zHxB%9UNoNPQW&Xr&fZuQo{UQJZS__$-W_v&VM; z8)9+kP?y!}(yT6v)TKgQ^5mkG4znx^_L_oQ_V~hb)9wdr#r7ar(!IC|oUPBF0ztV` zo}j}%))mgG!V9#-U7q&2%$w!HR^L1CXkUZ}wO7D{gSdrNOJY3iE`(}kl@ISlysC+^ zNnT%cH8Im)h51Kq>sDL0xf?GZg+*CIxSR#Ld&1?c#eY_m@SwC$P+GWLU?{cz-H3sP zwV=Jx8DzHuG0<1Ra%Fouy{YHJ9cKjwNJ#Uv z?zCOJMlAq4ZA;p)G#bR23WSGEMn)(o2`AAJINykI6gWeIr>Iah!vpynD$ogVY^I8U zWX6IrVjvCR1Yo?5tVrSJbS{891w09%z;*nx8l+)EEgXmn5HJV{1%22+4_VV(0Xh>l z%}($cstc)AOlABEE$g&`w`jSHMsr#rTv-0DsD#4FViXS*X+pCz_y+o;O5y*)0iKa%kcZpdeyol@DTfJ*xM z-$7-@sG|R}8=Ns0j03AXqZRm1;;ePo06qjn=mY~MPT34rzX>lv;$MJf>P4ZITF?RC1Ny#lIQqe~o53hvo;Rt;l zeJ+55(?bMmlml+Kng{I4Vdh zp9|XhDxUxVk9O5#oL>^#i=pmXBygsUFEJpT(HJbZ{1ij1pP|uI@C=XdI+dr^S7qMZ ztZwRjH<&j!ny+S?DYfR!eDhVcc{5MlV1T%*&UcHM&tty!nm2VuJ_VdT`U<#EY~69# z>WwT50Y7Zq(GVjU(HtJn(x9@O>h*$Aual6!)u>>H-hOXNlAP2&Mi9*y+V?4+5YV?{XElyL^-tFCZjiOSiR&tUfxR}} zLzwl=kgpt}>oFc;q_`BHCCcWLN_ECd4H%_fs1GcbQnS}}Jc-)=_bWyn@^ry+M5{3C zI0$G_$M!47tOG+d-Ye+WAd9*?1J&T0e>>GTk&$ow$fCcW1WU`;4Oqxy`o9Jc`)sQ| z_oSlq+c5mcd!D}d`>BbKzx&su$N$2SFA141#h&wo$0f;+ALJyy9ihXk=&TC6jw{eg zgZeta3B$s3cuFL`%JT$L^*R5DsA47^AIJAVBzRJG9UU*}d)<3}V*UEmyrjpp3zHsS zaZ$mhiY0?`>%Szuedu449_Rcp>2Yn+qo^cJDZbVJ$MMcr2xjx;;SZFGl~5!SQB+#E zmQ@W#Mb?TdDlOioZ$by?fb<9s#~iIchoBJ^UuE?<5fsDYd+mSaXn?y;68McRA3yno zF-_z3&C;QgPm6o4PskA%=cwWNwD&RaC@4p`1|DS!4W(6(o0WDs_@3PEF%h&Py zJ?QaATtCL|5Pof0;1B$Yke-U)vq(D!&o|=t9sDNZw*u)KkiG-IHF*9Few*>zjo+W} zJBptA;zsH?|9q-4|Vgd%k%VZ;~Q@EyfF(#b~)Kt)^)_ zYM6`OjmY}D^k03KV`n?R_7`h*nZaan26ODyV}C%PtXNhx1p(h1_@+=A{RI#XTp2E9 zi367!mHV$us+iCj(ZiS>5%7_~f1_0WR+@bL>HQ0yi^a@&zd`E2xU~@GmTt6aNwgTX zG4}LSBj{N=X>2dyP$6T7$2TA255VJq5gZ;DxZG4c1Ly0%y-T!&XO;eP^X+E5b1ROY z?$-Yk`pjA=&?6z^TMlJFl4D)4XayU$WPd}gcD%MJ)niHLt<79;zb zz3hHP#|J?uGwGkA)OEq|iWwA3k|kW0&t-<`Bg}A){)?{(@pBY2RNTg=z!?J<>5nad zc_5v7^f^!@dT!whZAW0dUbZ*|FZ9Q7F*G#)co6k%&d?a@+Jx{P1@ucuH9>o8nc)=zWbS`CfbcF7Kwqu$e9ie}~Q(G28(ANGRObs+jOy3oy;bZ6z=j}xF z)8Lzfb-^xAz2g~)pUZH;TN)%V?Y0Abv!G&yyD%W(!GcX!9mZw2Z6|BHDw>t(JSnuf@a{#}YLnK69gc3(vW520Luf4j{>u5Y>(|R#8r{=Yr1n z(pd2_MgsDj zu!m7V^TO4(#-56d6bqtYU=PmL#<1rMtv7scX2D+C(Y@hnXSg~$T%8lHMqaE(SJ=|_ z!m?Ng#1{Zjlq)uNEjNVz&}4&Fl64mtl=d-iQ!4t2K@K>@Ld$^lAfpviYB-4;`8gND zxoj8nS2p&Hx1PF${CQ}OOx}Nh`y^?! zYE{dj)g-B%Q%DJuS;7$1#rQ1qryO^xT-8YT;CViNi}1S( zzs2}1LHfP8t_X)*D_KOy^@zGWsxCj`g;6qPTt-eVzvO`G3~`t5g`sTbw~z(bs?`@& z^1A5T>Ur^jFXLGiyM#$07t8D|l3ccx7!^@47jUzeJOhqFu_ObE=aDY?y_dm=mz579 zV|pCO)v_qcMdr!W7;#ka5fuxtgZ}KIRFJD><7yOOig0udTYYeNUV|gF56R_pg>|(4 z0k_c(6vcH;t$Yw)dwe=7rm;@WJMsGZjmIo%(>1<9^(Z>9$M=DmH-tjGzW2<$EAd$4 zqt66Nimt+w$9Krg%Q4&QJ8b6VFjC_?V&t8PCy(!aGw%#MdVPO3UM_?tTCx**?PFan zT@%rVn^GVP_TDKy{SF#)LBE!JZC9eB`^R%2W}4vk8gMgFQ%JNE@z`F4Lp!m+jbgMi;o#PA@%w-YZs2T3F0l1J65u<{<1J~qXqJk4ng`X1b2P0%vgc{ zx)A>8=ZU`J2z?L65Of|VI#G@X>+9f4AB~8ytV5MlFZ^8haUutfY^G_cF}(ByrbO}% zanvaAjQp~``+_SU^+<~E7`O&vs{$m_a{q!aq=48iBmXc`(3||@kM#x*q~KikMbDtx zUG=^p^&NY|hzX@-Bk>0}i4DE1*8knIIsWAc2)k4(Ux18^gjvX%j~bj?v>K_N*lyUj z{-To9!-t6vtO<>&-Vof8hvAWj(IAxUEUR7Z;xf|nf-QQ(wW{+@?WHnv><=|27%J3w zTNZOS_t)~+?BGFbu+utq8}E<3>NTMYmgivIGVQ+czgzud9A8o#&Bh~u7pOEJwu=x= zEmxtn3vU#NlFVtb-2>gq>of2ZQkU$<)DTq0_;3=j_bFn_+gc$wFt1aUsTK>Ca}tu` zX#EN(q2;o2)TyYuODk7k>>Z)*F7WSYN@5;-u!|aG0R%0FiIh27_;YB9sqy+3*Ivtdaq@CiV$nLp!H-HT;;Q z<|N!dTdA9pzxktDAvBw+VPaQ2(}luMs)5Q_;0?ipp9DK?6Z=+5qYb31486_o)v|3% zwj$_xu*+Ij8)Zd=Ks@*-^`R?dV$??GE9q?Q^ z=B>8pQdi2ux^s|U|L+@8)aH@)L&(s+mXZbjad}XY>8Yc5+fcb49m>0Mp6eZ(m zrEGr0888`W0uCi&dXr69q9L}+y}6xv{5B49_|9Uo+#L39>G>YB&mI89DG|Ira--=+ z<SG8r@k7Nw~kJNneEKB;q^X zq>WLQ(%8--$t?OzwNN10;+;ax`KT|n9GU?W2$Y6;XbpQoB13C<4Yv?I6?mzY&j)I? zbv{hB*gwZ%bn<;m4N(|f@_d;I3DNA=Ari4fke-mJ6)Cym!no-BwtR_Gb76|Q@$1l3 zb1P81ZwbEh9T$nXtAt0p&uGNad+$&)@H{I|u@`$S%pAuMa4T_xEWQjcLnhykFMgw)rP(U?}Av|rM+Jdam>5WQy zQ7()-#VLWGqL?aGOqJI+h=CKjJ&{#`MHR|(eFuI;=Z)RkzGFB;^*VSJVps$ebh4W3 z>%hwzyws2V@w~&=i_0M)cFFiJdH}#%fEKiLfK~I*q1aQ-K!2#fy)5~{X>z}x=*_K3 zB4}(coRSfi+!6YeyWgr@b1^Ga1UHC@_nG|%@Dd>9q4-RoXf!#xGG-UPc_YokrD9Mf z-=oru5~95nM>6i93!RJdr7dH-G3eky<>G^K;#d$kpNRQxVzEXMN!f0{%}^IxHj=%m zAU@)ni@TQZs8PaBy)phWkzb@DzmL`;N9&VFpcmZ}s?bktU`Zu_>dk(VqOJ5i{1c`ajJRYuwe!jP>bkF=G|? z*NG!ZYT!%#^b9sY5o5moINUJ_PvDmROYu&>xC%q@^H%^GPVT_#u+z;zbHWKOO7}!% z-Sl`z`6n7mjSv#H+TTJrX2`H%ui~(gt6wvdmWC`o^`z4@%YTjGEaoz;m+N3n`!Xb2 zl2ta&67_l$&Kec_wzB!Iu_<#diwcw{nTIQu0S9I2POuA4XX==CVUt-d8-rP1_&*VO zZ1@E8@fm=HR#yF~DMIz)M5_X=ly75JksxLF$cTu|;X;7EY)TShgC8G6NR9ALgp$@yj* z`S9jxyixu)${fGNKbgk!Bny4ua1x#O-8~kayO=sAof80j=`2Nukp?!~Aa67!bDker zM4>tM@+={FULxg4@){wzK{;ehAk>Dr^2tO+jy{kB2(L#uaib39O%atY|E1M|$#}{T zyH#*F#Xphe_jJe{r-cKj4ORRJ>>#5srMI1(gD#-hlU+`I0kcSmXiO-yES}(8Bl-p& z<7NWbqm)|(TqZH-Tl69TBhz1HQNnAx@m5*}tN;RNsK{w{YD9s2O|AFwo_DP zTFa%rrF9B%%56Z?@dHv#-G-hVp&dalm6F9lh+|C25O6GpM22(lWs$|M!bSwr^EKmJuYT|`3MdP~0jOHVGRoM(5hd!@O`vOImA4Xx@SmJIw=#RjtTQ{bxUk-O7z z>JT#Px4Kg>y9it(N2kLSdTwOy;zHkA6yepM{AVF!xRl=w6k`wH;$q(ucx9-2D9U(; zP|nPQ42Al`x5i>ZO|}v>uVxTRba1pMj>_Aithk*AVHCFb{v+XKJ+$!FglE|DegBs5 zJenA4R;<7BAXK^1)zIRg`kV>*BohFS_JnY0Q?YLX2wTgx;#&_A#-E(PR!+*1adHCr zFDVCGGbzDwQbJQIUJL)gG%k%gXxO?8zZ>zq2X}H)RHg;(g=_X-(0y^u(bYBYfV#T& zscZg=xT?TBP|T(WWjFnK5J67OMuKu;0T=%UkI$>_sCLhRaRrfjpnW^<-zw@M6MMc2+pM!gDgK6DcQ;b5oHwp z7;X}nNeCsLL?(2bPjCTU=re(X#hgjP6IhC?1A_QcEs8#Z4uG37$A(Ub5WuHow_^k6 zhBW-+_@faBt$>h05iI(?|5A(m6%bh6T%wSZ!xRaF<@D)H^`CDpR4|mj6~}_Zpd!N7 zqfY>W@%X2opa1w%iTQE?^U7?j%ucaAU>qx0+g9UICTRMOA{EVKnwOQy*%A6Jz%>SY zN9aL3sCmmk1_~cE*ZA)?XB38Gf~?nk_KZSloS0Q4IwoXYE1J_(r8)i2Rno;W2d3+v zz@K$s5}W*d>~{6LtSZMvmnLdj|8`@7cLFSWa{!~r5KM1nwlE?-VBcSb5mz^!bv*O?Nf4)3gW4xrnF3;d<8+xctFg+=t&{>@Hdo%X%LD znGWRm`O!lcgSZQ5>R9o0kPNF|&A8~W@W!%!PDwJ@=>9NJlr#aL&!^Y70C^xv?m}^p zd}6&Nq|ji*cqXldQxO56o?n(~nN`F^8AoUk#cP}E6z9jXo<$w*O|qlL5qbshfX(wr zgA{QXj!Y9E)XGrHh^qltMYMgYL)K}7pTFa)WPdHUd?~YL>WVU)><%&kai>R?95k<0 zzy&&FLSq?%dQzmyk_y@sbKwKTDjcwJJ2QTTBQiSQTibMF4KiUaM_Uoqqmu}NeV`cB zV942K@qp}k_{riSl{(zx43aIxPu5K9ARAne5jozvf?izn>$sOCpQ;LvLHE!c)NKCQ zX7R0s>n*L8g&>MSNDLq{xtA44uP+}Bg$!dfRMXcX*46?|9}jW_e)+MiUJ`(Z4w|O} za&fFNTqHB~m&c=5VT8Bno32l>)Zrfnb$pMC|FRd`re-D1J;)|CzG13hs&>_$Xw5~V zNfde16+*e;A}%h}G+FC>9#17|=t+M8^()H00?<$scT@$gkFr7(OjFnx+_?qS8r&&E z9CD6PtM6H4^F4t-@G3;<$n~03f^a!@*3$&jSnmLKV2Ci}!OBS7^(IHL1IVZ{0i!?h zA<1VeTg}Gn;AWNNv~>g~*^X?B@7ZY;FeH)eMf|J(>_LXD_0LyD)}c&Y$|RaVglHzt z0F~eMB0!FuY}%3DF&3J01;Y*@6>Dq%1f@nZF+Hn842+9WH5LW%1Ubpqbu}I=9#-j2 zzOXZ;DW$I73kJ#4hgwDqW0f_~fMj(lbw!R^Rgi9^U29eS3f>N=a=@{ki-$@M-hN}M zrEyjf`;*$VkJFg}y(3hFEYP3d>Z{PpUM#rXJM#S|?j1mQ=yr?orpX5Uaw(WIIa2e%i@O zVgj9l?I|qc0=9KIpbQ`@LZpKVoHtpczoK4X5tXkDfTS=39?t+KE@H(JD7^}x8cb7! zbXrKNC+%3X{yUcdczZ(K7pp4Pa~BJage)@2aqCFcd}Go=N;T^C4opsTbW>Hso;a(# z8AS1?>zB^3U<)NJ0^-D%myQWBPRn#vHLxu~TIv)(2QjqVd_ado$w}^_ef(Sg8vj;7 zm`atFMeB61g{t0<`CGPYyge_s0_s1bdhD;+)Q+@l37 z;psgC)j(}D^Ish-mv@2E=pjYDiP1bRYG$K6F^g$-76dii&Ww=2S%&O0N>YHxssmak zcPPE|H(W-&Y&~t~>$uXQKQKMj(#~ZGn5P2SMvj0(fB2GASONKh|KiFlij01O0Y}YW zT+zP>0D-Hb8`aHa(JksGKl-A&xd8ZxJD0`V{ydV5QIfNptY`6@G>WV8&Af0bDl;KS7P?@_h&q^hk+RTBrJ>LeNgOX+q0WUhvPP1Y*PY6Ih=7O=*E zt85N#t-L*_%!6ASZ_g-0AO+m`)1w)(oRnKy21Tm@_Lbq-o`Rn8*C3LXov-DJceY{N&4zt=*T~zY zy6I<~qfDA#0Zht=8?(LRX>h4`Jl4@|!ZF?KCl{LiBtx^aqlE43DOwggNjU2j{2g5g z_)Tdcb?!dxy?|BQbbEKL)>X2N8eHUOd<{L5}| zv`#^aKI_Pdm`De$oLvvSdPE1K^BMY!X$d!!oZ6Gk;YZ|i^&RSjUd0dhLXU_+aCcC# z*~I7(i0{BY9=9YnR;auKh=pjK%S)qHEznG@v0%XT4e}5q82%Vp8nJ! zqfHWtY8EyIVTI=u9o*e;$Fh?O3UBvzI8uyIgFR=23fuixnCw?H7A2I327#4`hAW8@ z(IbP&NtpG3-k*cn4UW(>;<3OH&CU@_E8Pg@^eRG)ZesoXffESbKrT~#LniHD4f30RqA{fI9Y|NM zIT!1_)SNU?2%LUjQS}PHCe?f9NHeICjp}E~b{ANl$hV+W?x`px9Oupw9OCpz zYRVBt#CXQ@)S%^LGR6gGiwGwKj|L6#V==X7mQ?2)1ZE%R_$nAj=8LotU{n!GV^qV?gINIIp@L8th5>$D1>yi znw|y^Sc4r_x|u!NSy^(p?bV6 zHC@246KSbA>V2clUXG;D)_`*;{c7B$1jdW~3X{*RL%n@EJR!0F|ID^+%?BqoA5Zni z-?}&X9nEj1H-D7kA1^EL_+-fYoK?AyEky5nE>-U9^;__OJ$EQxf6|cxJYVGP#oxq& z&HSbKbHOtFdC!kOzgmtz2fl|j1xQJ;m1KLuS;x+_HVUD#}^wLZIkrPKsRiQUxH)Op{nUu9=UzO$BaMmGQv@8l{ z_ijgP32XuaqVD@D4R->0#~N~2q0O+kwJgr z9RRVfZG2fu;2UiXDa{{Q{UCjMU?C13(~9x|+?o`eQ&i-_UE7xCgQ?23^8{8OkXQR4 zV0YPuxDo18L{=NfUSspyN;(j?wqhUyBxy*)@klx-Q4gqI(l142llGy53Ei~POu@?i zf#cDRN&BMv6y|3)Ut~#N;{*gWD91W@5qqR`mq~G z2zzPeL{ck#7A;z`6XsZiy_oa|xIqT&?qh)oQe(;C0V_`D-pO>UqZNw~7WXkn>ko0& zN`KA|JKQ@!YVctzolzolV!;FB+gT*e^daTinM*5O46Y}uIV@Tqu2{3-p79L#hyE#A zxeqV3KexQofpiofdJ0t2X0$%P3T*qKBlJT&wj3Y8H%rf{i2R;*Tk#upmq`{!YXBM2 zKImV83z{K>4K#>9(3EO1B!?r^MR@JQpha{w>T+*!v|f%(qDE`w)Sb zR_*119B9>6ZTmnbRBEfXZ6Kq}t8Me+@N3bgi$t3){RCwe97)^i?q51fD`Md{m(_;l z1|RhdoF|2J4@{Oqx&|hpkS;?bk7UjcXR&~i!%@OEv@s=co&bnD$T9m9DDK48=7Wxv za;s&reCR328_wbv`aiz~orj|`1_Y%w>PNmtOEL$v6&c~8K{P?Q=t=obq||&@UQO7Z zAf;5lf!(T|qDnXeYM!ID8jf$XoC2}A zLyv-c!Dw*U56oHpQ?wsEL$6k)1SZ2l582DE@lO~^zX%Z70@H@lnF%fudJiP5dV;jj z!{3g@Hp@GUei$vK*x49`)}jHiUQ*2rS%xHFXJ+mrtnv5-p28iX$NYW;{mrSCXU> zk|ZoLWgWN}^At*GW0Va&HOyscY63Fuiw1!GGN@dC4%)bWA4Y{)qOLny-#td8sRuO0 zYQnix+hTjvOaHt5Tk#f#iJo+(qno35Vh)>~G?~ZzNA*L@)7UAsPOYy2JrOHx01cDs zvyA@uf!QB%Dz55_c=_d)kBoj;D_v0aMlDD6)sJrrjEh*O+<8a0FoxDAtdW}u*4T_h z&h_~ZlWD~3*>)qWaAzXQPsS8XMkjSjLg0O5i`yF*uj+8peL&B5`| zTfjD9hW@utkn0PibGWxGy;m#E!3YPVl@+!iO-6EE4!rg^ zRVTcb)*EHFOY2mcgX)81ygLvzb6j;hZwRWlzIJU71nY@zUY3eL#FQ>Hy)$aT8G01qqo+JfoHNl zJUPYE^AL^L_}?;A<#N~px3?bl-`etN@tLq}^UpopKj=ir*pJ~BtYq)^=>Sw%yZNEF z@s)*D^gQ$l?pVl0y-+_@nS7bfN5?ZgXBo+> z94A?{VYuPQ&0hWBbtYwgs3;>;C*~vQ_ud(ncO^Sl{*Y7)|BzHy)EG^SaHi0NgfPun zs{gHDdn?pG^uA)PYMV8ZxviWaYi9)pv>kWE-XxvOf5AhA^$nQL*tFvw?avKZ$8#1U zFJdxsm2n3s!YHJL2wR2~zBF#;;4afbt+#;p#auMw*J;~44B9yp>n2#vTLW&s6W$Vq zNlW=sWy_)LiL#!neSmT@BOzA~)S8CKBd$DXxgK;#mlp+Q*Ldpn*?y?ZMO=prZp>s< zfjkTiw}T+y%AClft~^YNylT|~=5<*=54rMC-00GfQi$AG?fGCCmkM}>l#|Zq!+=0) zhUpqG;NvuGpJtroytH9v*oPej#Q?eB7>;)R{u`i8V{`$=K=G1m#4=1Cgt08WU+lBoqS@)LHORV-LRWi$&(7 zyEi`oS1ebaIKKg17s_Wq!i6A6!7;7;1&k_$9?3pGR2x{Cf=AN7gV|5P>rD$Ia~Hb2 z`W0pcf%LV6np8u6M9$f3d^%DC*Em=-vyg_0F5Du3kkOdkdXYjJ)_C+|C{=sJRROZV znqNqA;v;DdGz1I5aCcH(vd#wp$ejs<605N@Q} ziUX*Ttu6D+l^z@HAiVcXSebcQj|dN~0^vskyYA>l5jo6l* z;vs6g)jfcK=}ZN2Yik;~hdN(KC##*Ct(RKbpgs;^J5$JqY?#*Wk6179HM6PpSI{@o z2Ej~i8J8fn`M5ifhf{}AW|vL$pUF=O@QINSczpX>xi!`f_%xVGVs3+k!S` zv{?#1g73m(N6lE_;C06fgZ!*{plU6&APc8#uqL za%pziY&>0wCuiALmrg8e#8U&FQZL`%l&O!yR2zgtvtO$?A$+gNDj8R;Trgo}wGF%1 zQ3aHJ@>$pe%O7vRWNG2bjCS4&JFLu^Nkrz%1}3dnK-+D`^e6 zMJA@#7utsFMtBspEA9pcO^fV_(;J{cT^c23oqDR)i*b1Q6m1I5dOp@Qh<}0e(ms;Z zd*0J}5MnW{r!kyjIR17^WDX^fWwgQ|R<=NVUXEiT=|x1o{Wu#SHxDguy7TgQB>~0O z4QGF{YclT^akm+^1GMgkLm&tO_Qjf9ivLnr5P%4iI$*}fY@q!vz#PbjlgJ30rwNVvNd zawI`Jt4MIHkm}tZV$gLiFHwLZEQ532Ep67z;N9eG>vcIg-m|XEoJC?OA$kLbWhZQN z)`|DL1Y(NibVOS){LR5{btQ)}&kx-SF`+~>Y)aE1TiZM~)nPJIB;BJeaq3rmRr;Z} z+5KVry~KOZETO6+Gz1>d>_h+p7ooi$`ZW`>NSub|vU4qt(Bn+_IC5P|=ers1PMPp8 zJFB_OiA9H&&7A&USK;nldL&AWwU+_K424JEk-q+j^{Q5$#&!YscDL18u3yQ&9dBA~ z3@GoszT!sc6wbigm~)f%b#?T6e!hZpe^Ol%!Fic=-n6~-^d@kD+Z4D8#_Qa#Iv$)4 zad0R4n?PNo->_(`wj@TXrBqYirmCpX&qa1HpK9l@uo>Kks*rsQZ58yVZIwzZ6n?CY ze}Gv1t-TnJH0i*yf3qi@MpQHm+}`Hn4oXQDH>^S+0DPPrw<)awMq2TZ>Oce( zcJ0N;7MQKJKsT_z7#V{H(;B?ewd)aRnPtYapKbK;a5=wL4wDe*-DbyUs#e6l%?<-9 z?$!pOCf!sxIX$;u$CWw8*#(-1tES|998ZSXdL z<2%q)?w%S6zBn5amI|t6{JTeK6K)DN$CtOOx!>@olRf#Zc zg2%{f%V#5YI$y~i*0zl4L!E zwT)V*drxCKOJgZZF@sL%neO-fc6gQ%U4`lAzz^>nVk8YSDgehystby7!sUXCG`NY2 zI8VhJS%?n8+6{95we_E}qPQG4XCCS*6~aNF0sEUrDwPEXg>*SZC*A?Yz2VY$qnRm0 zTD4BNRJ9b@p)p)a+QKeT-+=RTPQ*%v8fTT#hY$9r3IB+8_Tx2n=vwlcL2c{Y;NO*-U5BK&_(dm?-|O$gR82#_@K8 zg$Ak898`1k>2(wn8)#b{xqp=RaRUuP5$gM34AN^~237V$?KP-!^y?;7N`)%jimP%H zs3KY2-HqW~lPX2GDXQegsnSiVWSQx4s&xB7l~2E7hf36TcwRIh&t-c7O(X8A> zDAnH-&A@nsIu85n z;&H`~SrCe;41Bq5OE@QbMj-)G=p24J|+rpI6% zRp`zMxTOqL=~&-SG{2A2pkw6o1yGYO2iV@gH3|y$0|SP!LD#2UVX-uqlSE!_qh$1Z zG&fpM5WNJCDQL*aod*z3)}!A7g${#YyYM+tOL$jeyc1q0of6)iZM-ADW24QH^Wg!9 z{j5j1m`~;en9B1V?jT}AZ8?Pb6aC$_{syckL;AqhhXaA=1n!n*Z$CxM&4wmn%4rhd)r@PCCEENf8Qd$JgGnd$KkznL9A z!%R=?@L!l1tRInjtDq7zr5$~`-jIlpf@<>KQFrudB`u9fydL~C2D{*>anl8Y!WXlD z5f@)`IemfV=&a{?d-+Yy8idqnt8(R)U9UE3mo@lv5*x*c3%w4F((gbCSmT^;&1+jZ zAEWVAeSz|d;P4qs4`GsdiJ01pxIx^Zwn;id7lA8A1JsPdJpEniXf^uGDz{D}0Ck~M z^b@=TP}9mv@YfYMt86CBzAn@_khOLOFK3j^Tw8@37&z|21&2+|cjc9AE%c1U|@aVesttC=dp{@~v2U#>sYqLd$IeEp*}Z4@u}DQ=F2Rc=e%ZeHrI)z zDwNvTW4)e37HB%eqUvifqs(ctdQcn#k76bBo5+UwKxWHFf4LBr=?hFL%aIZ+!WjU} zhJ3;|1DC2&e9UVm0?y2)l=O_(W3hS^EOQ9ji549AAjRAhE+C?_bMT2xS02)qp2D^I-k0F4D=dtE5D z*ZI&E7ifD5`Y_w`q;+8$G#`_}g)Gg3y?V5}!Wtmt@w?11ZEHZrIEQlU5OA;B;y+hU zxr44Agje5;m@x#f2>=fKZv6y6v5pR!`t6G#Ifjc3xyUT5@D4)JqkpGXM1hDz$Rv2c zlP$%!+KB!3DA4!xJBf4_#VYv)4#AyoLazo<*{4L@k_%8IS8ku<)W=RKy9S}Tp2X9L zHRW9GOz8HAk&b_@I~}bLGb`;Z_q-FOM21!9UIFX?{qi?j+bN0&u`FoYnZ;ne&V!S@ zBLFZx0f5T{0DejUrhOIw zWZwQi;sZFQodRN}CqVpwWM+|s_-@u^8lX-l*?eYIB#RH?#;88<%~R?c3qC-2O3ki9 z{@AHy`77G&bm4i{7TV&UVLI^?n1P%oZb^>gv=_?{G9tx;{upjJxrflBao!5bLNp=H zlKl=nA6A5TJczX(;Ja=b2&y@Q9SIEZ5R>|DAOpZxM26Epks53oa{U>!(fDq zsKxrPQ!*31Wzor-A$-PW2!5Nm83J(^^&4=`1z2~9p7$sW1A@mLx3_cj#(q~BU`MxO zA=_~v8@2_CY85S6?Hk(&!HcObM{@K5s@f$(`Vge)tkNV+v-AKpO-?~fO|#<`W9*G< znlc4hW2VP7O-Wy6rjODzr6y>adBDNYG>gpEKU*|S{jT?+sdPY-7{O7ZW=hLaEw>m(wV$$_D# z&#|>2cjIU_015&1B$CA1b)=7)`sxkaa0+ZNi(#r;0k1J!%dkdcDt-1ckiLKw+=O(z zAtDCCZWDGI1tLu2RO!NzDrB{T;JxfjJE=?HO6v&;g{<~K`%#zmK-?z@wFLW)X>KL}40W zsV%R-DCTi3M0JU1K`|gff_r9PNt}ZX_Yey=)Rq zMOg}I+~tyJXc#xRK>-9X7>O?M5OG=O#DsPNtC^ zvIW6X4$X+3_DJeFHUVXx`kC4R@#d+gL`Z|`3gbwoOW2I6q2?te5a&?BI<^q!VeQC{ zl2AgIE zG7!O6d$-mE9NfjvYuv&xj2^YUpo#Y?WV_(?9L9gY)Ek2dp((bRI2%AGR+-|>ty*j% z3!W*=lBC|PkV41BHp_0+E6Er_T?@0IMC&u=$HNI2EzH`=U0i8AoZXEJv$pn$ZG^gM zu}!@G#VmoO5fXe684UZ_P9K^~4MHkNmQAwGI%K_or5L0D>+Lpf=8>O+(D)J))#){0(eB3A*YX@V! z;6`pMF7+_J@_es3Q|AkB7oUJhw3V+iU%^4ZVGeFt!+i=IO03hwqki1l&{93e#xsGI z3kp|uZmJp1A=Gj~34c2t&XK8!&j(@@1s0?d@zdgdEowZ5Z8FlsVHZ#xKAUW(o{lds zHgwm=wc0)du_PXNcRz>a3eQ~Z1?ZB*Q;QD}5&Y(H?~dn0TejU|T#E)Zw=D>yH*R4S z9RL+v9cvfJTs4HOnQ?th`o#92T$|YpyD6YVkZaCM(wZWle&%4aXjvdaOBY*Grh~KD zSg5X1Fe%|hW;hyVfjV1U`X_M{%s6bv$tx0RW>lc3x$LP=dgw8GI$;2`R*Wx0Wet?$ zpX#XYAG92kKyEid4nD1ft2!#2O|U!6{ z(=VbiW4ISsmJKDE*4G-|aY8Mms4Ze^aZD&G^`2Z}fU;!Edg9%o4h5!$7r4T{Zn!+Z z>20XJ_P{9;7wdVo=)#@630jiECDYd;h^7Zc9h<6SYt#W~oPQ}?HpnRLpTKHnA3X{? z+MPyTHxRcnEj%mD7|z$~L26f}aq<`<51>UZ&78056y=Im&OCPxc#ts zYgiOTI%WZCpV;rz7^9$512-zc-ju-Am)WKHUdAphIuY@yfvY~wT)()98|mSQwqEXf zfzgNt56#_lrSX#@A*}^%wb=E{hvfn~z@v5bTHJ}}s-xz>eD32lJ%@%QvGJlKfx*al z9X1%8Be+J}gllU40d5hj=Lp-P$~_;L&^;799}8Tj8_0d z<*|c67)W^^#gf>!7~oBELrIEmVF)xcKUA)nU-nqKfCD;X@R(M7>fcD_)Cx>mX(2AV zmuBLCWGwWEAjVH9Ma}7`r*wr%3X;`QkL_F)R=^or$$*m++X_)k6+%n zt`48cH#n*@5sEaQ=bdf9^RdQu_PRS#kHC6+eQFf~^KjifPhv*%9Rum%U>XgtAmJhJ zn;0*Tvw0BGZ^XfuW{W1)gO4H$0|J^0L?}THU)WuQg{G{YOixK3l7?;jN8llhLW+d| z;A=%TZk$GKC91oRJ9HFGD+1~$EEFXyT`r!1b_e@9I(ndn_3BQX5w6(48yLK zQ}9`&dYtQf&%CML4A-TgJ-G#^t)0z#S6$m$o*HboLZPX=w}`(N@yqmFh*rLBJwG$B z2lvW*;xPRps-I|l7j?wp8Hb_Vz?mtKCTKA*ycZKyxq&6{Oz6k>2;y52_PlZLD6awXiFZn;E-)Jr$04TKwIYYpY3bbaQTKNFV+~UCw2r2 z^KjpZepki0P&iOmSzklFX|<{+I;2+JsxkIkVi~jV@3px8=PT-i#&_j%Alt9)XpYYq zj3%4sNP#p~j05;psZhB*UfVgqVs);*AIZX{Y2oQ9t>r1xT70qAA%tP9#g|gBcN><4 zT2&43(r(pzZpq#NfdFzQ(*jz&q0I$Zjt=g zIG`!cdsPI^R~LC^t9xw-BraNlvGmTV791X0oU8A{k&LQ>sU$d>$pa7!s{u=EJrfW_ z8STN?K%kx5xw;A|buv35d6LswKTvgNoCwAS0q0!^93(}KX2Qe4SVrr=4MHGiigWdq zk~#|q3YB08M3G0zOo%8jY$ zS*Xd=!tdui4S1Y-y0t@0bYVwWi?Aky6`{K;^6=8yRSWlP6zXSN_Puwyqk+oxQrL5z zUm(GV5Z?{0l9m=T(!`HO;E!Vl`oU;*M> zzik%K=*;P9EyWjGiZ8SjpNDw>Tj%Xv@+RjP7Y~pXlaOcbP$1i^H&Ls%YvuO{|Cv0Q4Q>INs(E$}fwd@j_A`Wk)4Vhw z@!8SN=6`4GOj~$y3T$_SkKwCeJM5Mm)=8 zM1ig2tm-U_DNV^Z=WPdg79q7WSk{-&Om%|godmXzW6ng0BR(Nv5mL@Ufy9~fXmi1K z>lyX~0sVUI&fo0qc0P0nNdTO2q|PF2Sn1vDe2540r`sC>R}0<)L5aGU4$s(t_dkoY z;0uO=vM?7H#P%Jj#jrCD%LRN);bmDJGW{MeeNeqy8Y4{slA=>)BdZy{mx%4Qssv&e zF;pXVMlxbon~2RyfY?iZg2ua1Si3O*R`ms^0roo7iL&9D$r(J0WEdQ`wMc0wy9F?B zOR(C72r+!#_f8Qg7$+LCWn;-*9G;R2RLl!cPYrg((DUcAVaO6W_4F0nYe5`vlGRl5 z9QI~KNZ@T>+09lU+g(#Y0LDVoAQoPcg730|wkh7-co~fWo`FC5QT5>5`6Arh?nPRZ z3QG0eedG#ef+*U&JDkB1!VUECaBI#G_Fc{Jc$&AP6d$w(kn#mgdJ8_?-t+3<%2aGl z81NF!qViwCTIbt$UPAJB?7KMf4X`>c^=kgEeeYy+Akv-xdj2_Pb~eM4qs5DRF`P|S z{dSjrQ!72Ay`A@dqcKJ;B4?OJJjgi~I|7(~;G&LDVXuL0y($q)7FzPD>bPpo9JX@JFO@43LYf)^e4)98%>e#(o3kYg1RsE( z2=L7TKqj;{Nj!EZehl`aaLxccik$1`dKOwct*?Y_Mb>tt_rqot5NdxbwP;%F6OQLF zl<4Y&mN_weaYD2{==cL3Sc1#QGL7^01Xki%2lCv;l(?T}8&(wPJ}s|`d79_`px6@J zX7_%ya$4}BZB_avFL=&QEr7&uD+_r-L^Cm`efV4nJ4_9y)5At$$>@b3xQvod(CdX(*3T6WsWT@Qm zf_2#0{B2+|Kr|a=kY48&dv}m@J0Bdwhy+UWBtL=DY9Elgc`s)iyzHEd#UkA}0P;?? zIfJ(%ozPu%0u(__wIL-`DS|gJ9L6^p#f`mZ(Lw~nzy&X2?f)=dyfcxVY_ftZ6Ei*| zTueHPQegKVJi(-GscNT5bl$?ZrthaWGnqdRYsFmb5OZbf4{~*BZF-O^OY0*K za>;3b+n%vIG^~%H{Rn|-rk$19i_{L3(!3p-90-m41`3T-miPspyh?A?6$C}V=H0op zzIZYy!c5D`;|wCbTUw)ghVh?i3G9w6MW!H3po)Y&2G~nbBuHz3Z1M`@YahXVwYly1 zR5rPUTrtK4+-{sJ&SPm9+dOh}ja$gVb>J@XGv6<^-26zfWi0;qyv}^azsdFmkBy@; z-w6zM$p+qF=sjX~#8g*cHfr;Rw2g)@NIwJj<93+(Si&y@0EibU0oloYNdyNx68m&h`vNVY$D=djkMK zu|BN}!9A;!foz<}XYBd=t!GF_8~i7NXS11RnKKw6oJJ#*P=ng;%ei<(VM7p{$NXnH z@YA3=0#`K0mJQl-UJA>fvFymPCL zl6EXhM;l;|WkcqP`;I8C9=ZEOQaG|*?b`P?MmjHE$-blb@{E)_(DuED_t6=f_q~tj zxRIwawxRzn?z*QAZa1v>n5d@O36t=g7$zR+Bu~nCLH*2JJDUxCd-uS^__a! zR|ooYU%1pIPhaPNTr|70l+sqnah{wEteFa1Q?$i{5GKo_uUl? z0&jst*~}L%PDPc79jzM{Z0ia3WG}xHGj@#~$QkoI`r&^Ub1sx&ir|J=Uu%Y%5zdR= z!1H6Q6}5#{_(}nWyQ7~&!IG+6Wza1_4343ZsZ3?irLQ|i?tz>LR}2gaw}sFmLkP*h zHZ(@{Zs#s%&p*4xXhs5R)K5F07M0 zsy$6Kj4@cKaC90MeP1=2FwS^zoSwGbY&%*;@M6l?rWJd8&<&9JpHd(S_+wQVi)okN z2^(Xy8fH%@z~g-I4#opT%8i}*sg^3E3%_V8Xo2onH9XYg<~dRY>@@HSkJ?+ewjRvi-1rXX^W!{zl%xgc@;ma+VS`{jlg~3amv!3$@9z26wB32;5L%@x zss^)vQj)`^GqTs@Z-Z1N0&>*de$rCS-(J#`J_!RzOMa%HHh>9+Lay}j{!{_1m%N>D#uX%x~Wrl(U ze)%qmWRg(ULi}z^W5Nb7!_pvKt*!+m-?AW@`y`9)Ok;Bx;<@jqI)DuUk%f-f>_brB zy+)2)VfKO#ZnTrLx$t`JpTpcV~x+J^MtljfXc`Ke<@bu#EHvBp8Jr;kt_?wUK5%{|g@0QH||5EyYW~N^9eQA2@CGoaPzSA!G zzVvf|8IXQyg!yeZp94Q3e$Xd`XIwtq5ucW-y}C8?zyGa7V=C5=E{);do%8Sga%(1$ z>!%CwliH<6^1c=c(+Fo`57CKut5J=3)X|zrR48a`*#4WJ3J%NnI;KoYg+>&#RX)k` zt3d+}w+?4o?#~Ye3fDe~Rx#`+c*>-0KLTTYB6>y#Udztx9@#w-JLUkqn=!N{lM^C( z)mnadcQ47ec6$#j|Li7)=6AO^hRJN|?UDus^5$#oV{`BPN9{EYCrp5qH=Ny#)yER} zPpPKT+IHjN>Xx~p+y)M3BF@n@0Gs!=hFCMa4|KP`@7QJ=mSXx5*wgT~GuI9K&v8hM z)4<#rsVS|Q1Ois&-i|N7#^RQ(7kJNiH0Wlcl@TN+_yag6PYHz(O0$uiTh zZK!TlWi{mSmu*XH&VcJ)Z^7m%-k{dGsVVcXLo-rSq^gg%p|1vjquSa01X`zdi0}ay zlk7XvoaSTKua@jd4ZIHhkzRD@(cRvfnLN4~P*Jpp%VO5HGkZqv2|Lhq!YDj$kZ2YA zD{8QZ*WJN&lju)6ETy;ETq)ZII7@F2yeri$_*ir2CsQl}(lIvCj!RqEFkiPXK0k22 zhb}ssA^L|D6&jV9KLR@PluOVPUiR35Mp;gf#>I1Y>X^O9yMJ1-}8mv(!sIWAxV`o@+p=o>s8 zu95pz|J=sNE)?b;C?z?@Mgwc5H_(TR14;J^8z})vbw+!^b~!BC#6@i1duI-eJWvcj z!ri*N^P>}VQP)LB#f!RnEkUNBujmr7#lE*QHm_q))S=T3mA+lt856~12sH+w5hb^! zv^s7B^O@0}+(Wfz&r!8Gc*IKgU+Jw4i!pi~iE5qu44lz;=!S4fsv{K{_e7w^cjP{% zzB1TTw8S3l@h!F9*wzs|a!YdV_6YKNQZ(izRrn;A=%nwOjqu_FLiutL!l6{rgA=-f z?d$j@sM48Mg4YtHX~`_Zn{+>vDGWs>m+f_20M~K(Tfky*JWpvra}0de3IDjYOrl=d z6N$N-=b~$;J5mCJ=r_^XGPrcg?Klk?f*`-W&9Jo$kbuCSaHyMLr*Pf^QG%no`M8v~ zutuHV^8utA%dTQc?$*Jrr75Msj?}gzwn1H`!Q-ho?aPuncg5U~nl<_}S_i{%06bQ9 zfwvp%=^oVH+EqFQ9^u)zgJ{|WG_Cn~;HTXG_SMY+tWrm@p`04O*l%KOVdn4t2pzeC zxMOShgOh8X1D~n0yhd&A3D}s_Hh$KiYWIC+7~NmZqsnX|g_^_!#v4z;1c|=w;P{a1 zRc&F~dk7EMq5cq|45KxZ->2IFBj9x!jaE*#r}_usBkPy=$k=?k-KIZ(Wq#WA=hNn= zOMgCNe&*`WUz?vr`tw=yvq3&H*Ygvu!ldr4xC)Tf{YKJML+6_isLj|`yN-SE+s|~y zFs1xMp_UNH1QskPL$E<_SXXwosngeK8kiYlc2v~9vltF zYwI5_^ECb=?tFp7&28!&ym`*Y?$=dm)S`)v=PeCTym6j+^P1BmPeCP)P>7Di!PL?T zXzifZ2RJx`I-=$qe8zUPNSJYOEoDA1jC>Xnu(cO3#i-MP2KGaBX@XoS6+GsEw@%EY zlj>|>E))!luouc|APw%)+lu@hAiCKg?RJv-GmYEPz=m~9p{a2Dd%XS64!RHZm5h@r z%hrZUAuMv&+i~9*PL#EC2zs${Bx8KzF&K6y>)XXOt#HW0n-k^~#QJGjVHcRQ24&+p zqeVaCJ6dR5t-OrJ)ic9I8_m9;aSN-$tN>V{z<`?{AVjUhdmErbbsj3DvfY6}&_^&+ zLrcMfD73^;Q(o_=TY-3Z2T++z$Trr{R=`DD0o0yDAJ0_8=uB$@Y>1TgMRjwKw9bwn z(|SS!SfB@$$9PQ|BN~q_Mk6beRL?x9#bc_Up&5$_j=UKt8KXgo=r|J`cbVWQVyzg6 z5+1etMPgJ&83w-QidNjCIRuDy(qJl(XkC!7J}VvX{CmWp>2}{*LXA1yuy8bU+ThAspox=pDue*` zkO>kBRFQNDCxos#mW|O^MLg4{6W7$IKpj@9PYHZe64UmCiI?NbX#HQ`D70=3h66d> zK88YLxmcq0Frg~YQC%Y%$yo#am2&d23l0j_uJ% zz#MXYfxVkg?RIn$Pja2joI~1?&r95#qWx4LpxoP`c9_#Dl3k7+_6*NZV+u?P)%X?^ zoxnYpHdJv#vKTvvtY0a_@j_r80ilI-SEx)201gWF3OJG2eX2XUdF_KJ!rQ$xRdwf& zCuulC(NKdQZq8H|TMiMWxYXCJZ2BrPiUK`YrOh^Nj|d3f0T#G!2>Jm;nG0Q{q$F|D z)<<8^wpxLTsq=$xFY<|NenLFqkX2>!Q=H+mDV=Hj`Y@2{|OdhvihxDjT&sm0l+|05B!;IEZ2kv9VtpRXx0f$`QiW?AM zSjYQYe})Hy_u2YZt;XI(7*FRz6vO+4J5k%p{266_uP6%gPFCWe1&Qjufgjkz@Uqv9 z9|D?n%$g68b|yy}*GC~@9mkM22L25n@gh*23!-d%~O zznmJgz5C>yAceagyeE`l(cU;xa{SEU^G_|qwda1=HOpmaP^k1fpfw5o8ekH;xYFaO zJBj@=K+kcgu30w@I#lL32)8Q9C@4izUwsM^vY9|0whUOeM%anb&*uOYf`zWYP`RPd zpHb+u;XXPZsC=Yub%5b}JDRSFAY6vZB5yZ>Y8=a{OGRIJIY?hgM}@I)7~JqP5N@x^jS76JEPhrPrFakG(%fy$r`Itg@G2~Hg0U2+mH#!TyITK<;=ZDDM+j z>AKCdMrlCfx$wt559+*cp+acbeGjrX)#JVBY@+|Dg6*AYzX2eCzu*I(z#Gg=ZyAXF z=T?77u*c>9e6YtE$b#ExL{%7fWr-9S&aIhpyOAX+0|%nn&r>B#RC$eV=m@E9oPb(G zcROT!LStBmcWY?OGkEIUp)ss2G-f3LMWdpD@uE4PHO4u&)I{IkdD3uV#}&XcG|UlP zVH*Gk&L}bPArQ^`YTzxk^O6MD`OEqxh{!D)Ma;j?SGQPztnbA1cc@;q%%N_#8}AMW zVj8RBbqC&yJPpVIh3WKcHC|f!Bs&s~`Z#Fx3g}_nuRK?5sj!kadbg5auR4^5}V5(e_+5gS88?b`| zVQN!vfPJa5ZQysIug9MOe{R7xS24CG-R*DL)Nh|dgdC^)bHn#y_naEYP*+wMQ*?Fh z?^_YsX~S`Q;2rf%C|!@z5oqBLd7K7%l?(qr2*exxHc(NlmXctKS*F0f9w$&}x}zvG zT;`fg6tvb2cl1{$#%nw%P>r#3sEI3q_dxe@$XHf@)czS$h{f*15jZ|~<8#40+9z=8 zCGFigElEEckBvrztbtTdbT$pfCzin;44Z25(9RC`L_@L9qQ)EnL6K3O)Qc(UeCSoA z(XUNgFcHe+5_4|bR7ZU(2&Z1-68=_L5lOKwPP?|COVPTEC=L3QEM8VpyvudapK_hJ zKnn+TP5+513ybakt2F)n5Ib?9=;(F4&Vl8og)lLzJ_R*gzHtB}T;FCrh*W^$gO8wF zAW-9^u|Bh*`{fWr42q~|?mqQ26d`dYMXb)|#sPmkH1xD!zTugdhEnhxz3>lmo;@~} zwHW1tTAcBZX6ala{ZgZU2n#BYLxc+l2FX?JQ?6Krc-HVKd#v0Zr_Ti@d2V+lljr}z zSDZZm9PjaLNR$*e2rlWy$9DQPnx3Ok>4%;pt|--|LLbWIx6TY4 zV;CzE*rp;ws5C{!r<0Z$@+bRp!nNMJp%2ltd37iH-NnTJC` z=F_=I&#B+yGrj>@K$V9vjEua2FqO&dQl!)ro?X_9F<{v#(i$m8r^1%C>|7=gk-670 zA3`Qy7=%I?qFYiMT2$T}xgSM`zmpOkcT2T#Gb$Aqz@VD0>bhspdn1T=EGN-TCB6|4wNd!@8*aJ$gMl~yjAWqrVGDdM~UW$NltI4 z|8Af05+)HxYZ41h6sE^Qiu_lN*vj(WMDfYfZOvLTHx%NYtyT6~>{RC~+e;HLfN1%4 z-EwYCd7@i*U zo(&9d+{%x}4koUuHX6tV#FL|o6Xpi8sjO6%8a#WQKP`B6Zor<@O2{w$Q))xDRl0(< z)M-*Vs|ox#o-SN+ORBFLHiWCto)H=>>&UfkfLB8cEuK1bq{+Q+`u8={+ih)TRRs>$0PUR{>^P(EbiC2e@ax3jPM|2nk+kFLZq<5BU&zrh>!uE=pT*57h9dkkz=E zLklnFFiD`2D3q*q$8ft|mUOG|9x|8Zu3)>X$h!~Bn3nkI7;>n|1gj|V5RaNOXtyjM!mh7F&6mug z-^F7;eHJ|sPa2;^DoZv$RkozwIGe~g#(VUeA%wjhh6+uOBKT8!AW=1h5zNeEdHc^j*H`M||ZV7*byt9cGHBm(}?M8!|XqZV1%NN;_Y;LzQPm`|m|Q{qYEI22iiA-`n6NrpdZ zz%QgFjo_yb_!-pqzZ~$A|Mh@>Pj|{3!N@~s{$xTpj32$+A91E9O45p{;Uy$JWsIadjHmb(vD?jK8+CAduoEI zT8J8O4OmCAdGa*x0+=pIv0`Xu>5|iTeV%((4;+0A-wk!79BoKkVJMWUOq;ac{)fK(?xZNo9rcq<~bG16@GhdeFJ_V0=CJGS>t5 zEfvOlFiMb>Kqib>WXp0O$X;DuC(FUr=vTF|RFay@fh3pJz_B>K8c2I#z<11DNyjw2 z-6cmTJ-Bu}v$aTQ683$Pn;eI|+^ClYmb0VclG)))#C+=P_-s6Be0FRkmlD0foFBo$ z>jFcJAZiv=lUuiRVPg|UJ`A0^#3ur*@ zFTXhL;^G8O&Sw^XVxdN4&9o3XSkZ$}J`V!6O>~J>CM0_oMmKWefBl!yOHo$LZ zb1oZBA}8VMP-qfAjK|RX_-F{v$PFht!RkJHX?0klSi`4L->cCEtn^3<|BzrX=vv@< zXY=O}0B7(pf3=dJO`;UkG&IL%6N$}xDEQg{2}Lfs6)g>gqB;C)U0qoR?PP(;10dL0*gLA;Q}Xc1^g zri(Eg>@SuwS#8*E+=7B>qxKnJ#imDg&_*REkMSWi0x(mXk2{+V5Kt6#!}fvo8At%V zd;|neMSg&g;Msz}5cDpaNx0`OLrE00@%U|!L7$y4q=*hQ7V-_j%4j~$LbTKh^A{&S5fyEIv=TE-9jA%Q@O;dJ$jL?kX2SE<6Saw1TwcBjaXL&g+85Os*Wd( zPv=dX&Xq=YufQPK>kPOBYkkHWI!NQKZdiHUY_{|l$YMN%b_nP zpjp=A|GXAxLKQ2}{rp5^)x}hl*Eu-cIlv(7d81!x#|2*BBfXE(Zj;vqW!2}x?Bc6> zZYZO(2(u1GB**=w3p%Ir6*o9wzwGW1^g*Q~5JwAK{$m+>iEwuqf9w|IlAntzKZM~m_eF&w@D004X{GPi>tQy||Pp2XLf7?ysgb2GymLB*i{1p+gtM%>? z^!j;O-bk-as=Phymfd4wUl#V4@5W}b!gwg2G_YT7OL%$U=0M5$!sR*B%8T^4A+-YE zxt05eJH}bbe9b?%V=Vk6MkT%-=(l4$u6x0uy6isj!uwnut1b{V%~ikOfC=a6T?x_}uxAA&a?{bIT1tqF`~}Z=gA~KC z&SqJy$!}+JDViDrm9b$KQ0kvU8z`bbULzJ-LQ1V#M4^7zC!vV0#i5k5c`e${rQ_Sk z3;vyq&eRZw@Y3=+(-_5nQu6=fg4%mM+=+4x71>Tzg744m!g4SLF}ZP4&Q#&56rDo$ zuH_ZJx-M`LF!+QtJ3KW-J>0jUtiX=aPxj^aN4WyH*ucbA)PnOS(7?V1v2ZAE{)W?k z+2>JQu6iT-*%xG_OTIOEXsxXuFa*E~!fks*K;B7Qkp1 z8ws6yID3LelX|R5eMg>A9C=p$lSiK4F^@a}d7rMJ|B>f4RmKDz4rf?T$THF=EW;b* zW!!!I1o+0KQH<7HFl)M%o_e*O`5Zf1SoeQx9!_L``%xS*l1^mNyvKDon+F7gd1ng( z_(pyc9RD|PLZs1~n_1E4*}b6Ocqy!kNdcDtd*D4Zu?M$PuCZ0TohA(1@;eIK5 z1%6wG=c47I;U4@NBhL52KCR!8Q#p*I$Fse>{VW2nT$2{zW7!>*8~gwPtCe&6(HWb-V0Pz($r^6svVv05+C|333l!;CFWd z^%KMb^R;{}E3blLL5>f36S4F=cV z&Q;%1r7)?sSUbF3_kBgp!nVz3-Q{h+uSS)^Zq~}_lolvX!eNz_4FIW9x0>au%eDN; zQd0>*38#mz9Ivsg1|apvP@7#au44;`yP0fpQE=M?F&K3@@4rK4^qtbL;IWlFZyon4 zQd{y*)U>~6mFm@xr8CdYB~;;M14v$?b@A0|AHvX3=L3}Hz=6V+*NY)0oqcB1Axl4{1uJwys-m;bdBcc(#^#oF1{p)N>YMIFwRFse?I;CpxrG)SSK=N!;6vg{(ThnE`k~TT=>`{ASr2sUxLZE!dVEu0qz{<{q;-* z1VBt4QsnA6Eu$_2?klf~lU*bk?KANNvz$B$zFP2zenn-<3`?5eCgPMQO>`(_#0f%r z{p85;^Rbwj$|UmX2O2hLgVjOpv&_P6k87Bul!)K=m_5$ zJUhS{d=#TZb`wTJ9yKNh)B~C&1JoEHyW?)fBA_<4VFgw{-hyA;OVTffyoLJli}+1m zsaF4q!QbuT?++xB>s4hmIo4GgrJRSj4@rEpV%7~eQ!fI}(O1pYRgC@fPY}4PXQLxc9sVyg;V23cbR^TW&)#38`iC;He^GKmjX&U`kcpz}#drp8GqZmN+0|;YMVM{F)DITp z%?D@1U*FMJtXjQ7$7gLSKqCql+aQ$cGKS$D^1tqQ?R@|%rz#6n4}xtMgFU025Bv=i zo<0(MZxz!=LM|Sv#;%q-v`>iB_mkmFaW?%JC2H7E-QBtR8RXkghPu6D{ev~QmVBt- z`Vl^aDCSYU$(C44J;+Pb!eQ$_A!%Pzp5hwR zW&8|e=hCLAApYz?6pDOJ_L7 z3{Wn|k|JGTvyZ|zmVZ2RQobfRrAGg4tj&p%mChWI%y401;NAo%V)a$M1K*h73**&F zt}2}i6Bt!Wa?Hy56tGYZ>3mEmtO{=)cs{>@^`E<6_=DYi7@{WUzNyish)1~IUtWMrgTGi+%Y z83Qu(zjX7dANGNX&p{wF3RdN$!u~I*6}C-s?s_xMUANg9d(Cs#lwxS8aMN~0Fjf#q z!;9lqF*VtVTWi_ZWb(d7rO;2pU4$^L^Z;BOk2#xuj(0*h69D}J)?JL}-(X#Jn(4w! z=d*2;%7>tG+#+{2UU_NoTmg)7Py6e;}G`Oc@KGWe5FLA$c16a7L%; zAu@c%1S@)Y4SJZ|XfBy(wI-HGnx#QxcKs!+$?Q6Mduc!Q8Vh-#$pUc}sH5Oa=;}=T zEH9fQoj13GxVtVqF7NUz5!jN~y{GzEB5}-`+_}%pO8AbjP0J9l`LL=Ma%$ck%g3t6 zC_(UobHV=5y*yVv#;u?AHSfNqZnb6+-nnr=c`op7o0t5jiD2OUX7?dj@McK(AOnWQ z5*F86aiJWr3{xhKW&hP~Vj02`SXKcJ0kfzdmi>XIZ}Zj>(bf_E>xgD_pg}xi06X|a z&~gYK@zt+OYsj;aT-TxJ*dXOtd)05GnU52QiYDb z3YRR>^{5jdf3rIqSiC?l1671=JW{jdZ}#`LOra4@AlkwdJz`Ksz;dcZ7Fc}vK;nL{3;C#V3lnz4kCDcsu{V@M zx?rn21PL-QvV@$1+=?h{0%UFg@CQlg=HgXOlaPI?+5caU$GXNvmZ^o%Vg6DHK0WEuTV@9iS5M6U7R<9Yq?|+ z>v$O?R_4FSST9Me%XR4YOCM_BF-gBV{I@0XUSCTte`p`AS-&Y>czk3Mg_CPvm{fS2 zV-Ft7!A7s(Fr7%c)d@^OmoWjSGk|e6!1ov?Jo-DV9y*zxoXT>e2HYHgT)U2<-|D(Y zUZtS?7udcTLwBRoqM!rpG<9?;>i`(2=v3<4uNt6Fe5r<1ayH$A09knp_G%@WkUqOQlMcO*Pd)TdO-yL%7XKfL3 z%{sE$p4_z1!=$UK+7Wt~t4Cz`C#IupS<+F|93fS^e0ikFl5P>xaiO|=I#NJMM?w+# zSv*~$aiMXqa$ZMNA|}zNar-$bqkbtkkwLj%<+>4e$Rqgn#o&&V(2(e?f1Ii}xFZ#* z^3+rthTCVX#tguy_>6n;;;Vb{PZ-zx|Acd^8G;}#braC7xdfX?3|y|7X)8xI!^gxm zbt{>Ac2er1b<7rdh(n#pQ=j6HJb)mf(T|d3N0u_~UK_CK_F!zlk}GQJX0VjOC|%NA@u7Cbv*`8*)z!yjtIJVM0e5Z?#93q36IBMvU5MA11( zF(PwfjEJ3XPKpt+5@RT3ih9^R&MpCpSjW{l*uZbTk^qWB1En6D{K!)nF5LP1fdf;4 zt{U+^@(R2^!1sWibG4DLX#H6??48f%`SZb~`@h9{2FB~L;KirwNlU5+j!S3RLzz7F zBI;!E&?`Dr!h~~Tn26CaNP#D!*BBcx8GUueD`@Xakj1EPIsj9RkKc4)t~XzW-J4wa z^JNe*B0nT7UFF)0_|CrzwIicKmC3^4;{cGrw2fsfZa$c{joEygP4&!zlv9RWXZpK#aM5V+jg3%9hHaHDqHR0uAV^ zSd5PX;1C{FSv<1C9jf>>PQn9-k-4{*$GrH)y~<4e7YJk4632XXf8LJoKT$Z7Nz5s) zdx`-sFd&PojdlrAQMZ!8Pa#-95ZsbG@g{P>sMg{iKC#$;6)twmn&|Tnk*TypCtv(PGPc zcz)&mV(fl9et2|QT4qt6HYn+$h zQ%u<)=1w-~JFM68vGKLs+U7IVegRH=DIc^zLk`wfJQ0&syhg94rWs$8to>ZYuj>!# zuflHW&qC;af0ez2b?55kGAJ0=Io@i0c1IPomJNE$Q3RizqIezA0bEyoKIldM(i`v;sq9{8Ajj7y)d5QBQXVW-vD?smD zZ2LR?1A`YKKH5PBh&zT%=KTHk7ubb_6Hm@fQ6$LHRJ_%at zCy+imN^7Zq7E6_AsgLJM_lmK9CueMCK2;tx~C;BJaLcs@PPjg+yaPLB zydc!?_9p38iDs@*Lv^|=Dg6+1tNK*fQH3X@BT!3Ck}9H6u?Gw*w(_KiW=qcl5dR!J zt})^9EQBe51;{-X6Rgj_#ScL7ckJ&46azV1B6Q%bbm!6KOLh1?JP2Xile=H-TgxDy z?)@}WgSLJ`@9)6sYxbW0y$OMuJ`m{c_tWC9*^RC*^5p8SyK%Va=7A#Ywi$sIBZBMo z88YETqD?s%b#T_pXW*kqFJzFxi&r_Di!r)dV`}JLG()Bg$pKVrZ$20&2M*(_h?F)( zzbv>wg>72>HQ^p9L3L--9KO-;$Wim z$mYYzAAw(9_u)>U-VO{V(C&G3l)I%U#ExubGirtNhY2Xt4ZpTLke%#^+Bo1Qpg?^x z60d=eI@4G!ONq3h4D5e@a|o>7b9{f*_#28N%>Rv@K^dH7-cGgOKiIfqD^g%eg^C?8 zf|!mkR^shs+0G`~(?q_-LQGO-8ZflUf(Aue|0scYpWU>zLzHnb1lnx+2l14F1KMm_ zC~n*AIEK|WVA_Wcs^#YuMbb){|61`OcI;@NC&#F`2;EQUudr%{YKoh z#m?>(KyU-n6Ro1|0}!##x6Er;r)rEPf0AZFr}aJXd7?#|-2p_4Ld@th0sI&4w~s8K&q$3R%%mAMhy~%Us|JpW)IqbS4y#NlvMpW*kHdk}3tZYF0D5 zW6cIJS+nDm0w)bTby#__AHPzr_E37S{>=`OWcR+|YUJ~KVusFV=y&Y>xkB=U@W>J8 z3BwMkG%kBZ>_wR73nM>b zNo?#>Y;5IAGQN@Da_yeZD`iqzcmI^ih81-ynBYb;!5SuDwiyUrCwhoino$9r*Z6y@ zY>0+QvRr2V=tW(6rA|>^XJP1H&Cp2F>7lst0r39w-vKIEKnxQ&Eg}^D>v;{mk4SnsDaSIj(G2}7 zLJLJf$Jum_&?Cy&nPP!XQTG^D;mbg;Px#8o`5OG9f$m-kzDATT1@wV08DC!A^-1_r zhKxSLt4lTg<%~m^1{|9d_rvlp@t5-&dk*kT@95?6gr1vq^xlb@%);^i-ZQvjJ@AnZ(%~q#=%e~)z43Fw)(HRRc#Y3$WC>X&y1si<2n}Wqi9?f?3J3-wlgPmZB*G(Q`~C0 zOI13+#{$39rrua&9l{GmZ_e42AXqZxj{QN9t*&9;Wv5&}g7r1*^e!{wN>RAv@0)SS z1nW*=6E3$NW+EfJ3UwqCENPugSUvC9u74515|u7MQ{u|Cu(mQkyw#DzTf@+|wOU08|~~X>3&LWXn@2lPxpwHx%#xf#+X=v;U4i zOG=W2ZomMM(e;zlrBPC({{@fbibmW?)rreqvE%q|7co?nr)gSM0y$(g6vX$#*DGeg zI!c7Ap@zPH9Y5DnXiOb(sFG7`yiR{ha!#Ce4AjZ_xt5d2OirwpN#$Ih$(dkQ!bu`X z>|CG4B$8QWF@-vmu~{a?FRY>AOsA3GKPoyv$@i_e=?n8>tt5V3rpW7ozv(!gR-zaY zpD7(sDi-sR=EE{$mff+DCpN110yUC5&z#0>knIyf#amQym-!tk?o!2nN__lD72}2` zNf|2MO(+)snb|_ce^$kZBxZW3_)y@P7kFBrrt}pYnsPx|B|*r#R&-d~0;AP*n?NEo z#Ri%!y{8w+DGmW!Xo>@K*-YRHcECo2hhHmyk)+5fy74$<&aSA>u207toKYkv(R1+t zN1mereF!_$Tn$`9a=yiaQnLrNmCqSvc+#-ZX*O=6@jLh9%eiN}{H zplh|^Zm|Mb$O^Un$0X{a;|BDDaEo}*3`0|7Hw?*~l+Nq-V0)lThcKI^W9RE)78FnQ zWE{^@J(>FoT?oCjvCSXTB{rVw?2XNX@e9Q7{REh}6J>AfXK?v=YjFw}$j$gHx5}HO z3m%(;O7DVX(@_ac>xJe)Se59Bz`J{O!Rg@H6giEiu@3%5<8Lgr-|@$rb$QczSztQO zqemNeLslv7>gQHu&DF(&Qnj<=PDXRl*xH#rNMinkvc;C z$lzJnf4)P`^NR4qt;hl29)nSf-+K_hE0$&Qc;N;FM;37>gZ*E9nmPcn-+lZv)PcsW zDIl!~d5Q*HJ5$!D*Ixlx%r$Oi%V39zZst0he-6r2*MRbj<1Yc4-2z!e ztu)@iH@JTEW(5s{zm0?xp4>xHhHc`;Ty(#nP4(g`GF&n(pg;9=*fxp^b3{VtYBHgS z%Z}Rli;-VMEQ6N8>>3~ZS^RzwfZpR=J`#%BgAwB|4VC=%Lgc@g3pZ}61Nr+)L$-$_ zbgc_-!_H=&(y=K|FvS(P$j*Dv`M?kOLBON}FmD5B;h8DHHmmo<(m@FJtChdIfNl3| zl(#egRkgD90<>#jC_#xu*iH36ix)Vzbc|?=qY`%=lx&og&+*b1F^><0rCAj1OSVHG$5+N_&Ywp6eHJcgZ@|rzkxH)ayS;@R$ch- z0v5(Ga5RkB4;lq_L>_89k1LgE(B@x0Mg@qmIiQe-`ZZnPN}vWKUp7kF;e23i zQYi-BtvzTO%vv7!9wV?8sP3>kJO2!bfZzBp(amr+H874=HVE{d5BY3MKZ^^6SO0~B z+5<|0%k14_TikZ^b#m$SP?aTcH1aYdnFsc1uc!&uGuCrzPkSWw)X&t8;9J&HPo>PW zME)CzIMz1r&CwfyF|MJgDS89n3i$SUzK!GCaK3RwqgTKl6W#Y`c)xT_8_<<>14B64 z_&Q?oQe-T|3#vBHQRj$*cDf5Wi~hm422|&8caVQnr5XX<iiyT3^8}>9{s^ zC*&$}m#W*kc}i($g!e??5N$U%$1jpJ`88gxJHTf=g%drT_Lmz!gp zUumCBf3&>iAXgoQT3HS!Hk{EsEy-=6Qb_OuPE@pkousYmW;;kF%$1zb08q1=Eg^Sf z5rmy5h|&eeD?_VXp;8Cd5fA>{##iFy;DjI`lTXlpm1A1iCRITb@)|haHSTH?5=|WC zxj&pW;gkitF#O`;T02a@+SGZ_=YBb}m~&KLPAb0OP%obTBGO~JqfEI|88)V9`F8)6 zY`MEpP5ge?@%?E+XE3*>JX_t^fW)KE{1tCZ2ozblMV%GYc}MMd)^7%aY4;@ zO!n?uX0T!L0>`jGMq)L@TS>H^4J(0TL~#Ehd- zGQ=IB0fEe<@w0bGtM|NxUH!14&XW5t#O?#oX1Vsfg_~TD72b`-E<`X^3u!$5V|teYdG&;j*4&{ zZNc_EZ~JrA0Of88+gcjWNofN*Q5oCmD&F(9cgK<==%k3P?KFeh@Fm1i&$J(RM|`Kg zpgN)Xgss2F>^KBhGvK@42srw%Jg1{(;~JE(0aO(X7?^<%QMbDm#D@j^Gt{mW(yXK>}eoB?yy_t zoAGZb5mNa=?*{;Vw%WRsKDpeO!ks0J7f_95$p=vLDL7sQwDow5Z%FdMFu}yglZY=k zuHPTQJ8!IUHm}B;V3qe(&H#<~;K3)hh8?Ya6YO1h;s-gv+S|2c1S-wtvY}?*e?hHm zykI@J=WUP@B*7$E_Ex;O>-E$^!8t;sFufcPCCx5RE~<#7AUWsOULq9{knr*G$N2C6 z5x}4?1e)8(XZ;s(<@Zjb?E((yQ&nfB>Nb|@WPKx&Oiw#YIjFb}s1)M@_Oetb*81B0 zDXNh3X?E}KWgcrAer@VxG%Y-?V$b_3z1nB2g2V+#3HWD*mfJ(==3N~f)Y}$J6=IB= z#Mte-!EVc#0U#dhcKq7ZA(WO=v?rvZcf9p~wM-;Og{P&Fe zFD&_p^MP=u;=Z0GiDjc4&~jk&Vo`&%6+~Cf(jq`HTV0K1-=$tDXyZa;yFnJB@X{3A zFnA;-?5M-?YHJDIsBQ=8Trvdr5F6ge(gEPAa+YktWxqu1JFrwhet;VC&@FhW(c2=N zR4$bjWjvb{+>*Q5K}KcVrV;pV9no5oqF&L~bz0e4LF3+T-Te5OUeF@R$mwQgY?l7jPQ$kzQz}I>2=5kTD}361Gi&#{_57 zPy}G<%*IwDrwWPO5YsX7Sc6CD(JOu6w{okf?p)!Mh;haon5l5JZN^0^vq?eGPI6l4 zlZV|8aW}yp=7k1vZQP;zJTW-I;%p|HRV%;rnjQu7Hw2(gla%X-I*7w26KnYfB*A(lCnYhRVGSH1D zz^6jCvTYMz)DFm8PU8;9lgnQQV8`J$x{MRvZvRLk?w8RZbFep%<%-;ZE^VOxL}Vo1 zG(KxA+Q2OaF;9PT3RjXLx>j|xz5;(r921*sFP5+=p=-556zow@qs)NHs#bgT>GpKN zQolouEe(xrwIcvc9!uE4k4d=H26PuBWLr>?9oSoN7?R<+!*F5eu=aQCIIqGD-LE02 zL_G9E#7m>25{3H9T>LVCx-T% zNx5nueBpfw%!4K)*Go>IK&Twt7zkfV=-W07xF>8Yz&`z2Lh#DIy7*}_a%_0>;bqr> z&+@1gRNk61tR-iHnn(QiOerl3&9eYiJ#euEDNoq(5lSI&Lxc1xi|l}Jvb?0KPhe7Q zzVfDYcrt0dYp}g__TWLSC4&b-iV#mXdvLnELNTK&)_i)|$VxE2hgxSB+VoxO1^e0! zaB7csL+Dztd78I($zSh0vm0j)23(y$)Y(3-Ls%b}%g_VqK%eoll3K~(JQHcTm9e;cuY<_3qSx$r_202veL^Z1@Y-?uW7_%UGjad^_ zPZ(q!L26bBLcb}T0A@ZXE3YHN2BztKiJn+hT%V#Mp;;3{tBOMNOX{&zUoR`P@g>Q{ zWh8wY7y|^WYTRH^1XOYbx5vVB*IZDTwI`oFvqxEPRcFJur@$Y7N+Q=)+iVjoA*=B5 znd*vGM_!8~m0bKODW{|!_ko31uDQ@jo(2c{!d$SrG**|+Zd8|$v%rlgb6ZgtDveim zB0P(gJ(9?S%Es!-PQ#)pQQ5Y@DR`#`F46qE#yI(O3bq}`@C(Ei9EHjvqs)cad|QE&VMvkC}azzSVvtW3l( zeitVvpHkWEODbER$e2{wY*d!}$(4O4k>_%ifsGR^M9=12QrYB0#-z&Tpfb;8Dl@Tg za3as;un?623qjKo6s^Xn|0VJ8F8o#*^YKgKS7FS?TX2iZ#7k|!CiIVc32wd0FvfRP z)~MmqM!Aum6f_$_S5z1u{-Q6{90VcbTL?mx zX5P{=Y={C+F1Qm2Uv6wg97eUmc#$uqvwg<@@MYGVa^qJz+x&TYG&9{J!6FpP6|kZzKYO z7Cw{bKKHrzoO91T_wC$s&wbYOLxfyUJ?r@~iTQIIgUdq(VJ##IA(qCHq*WFza{qw&=EZVXDGzz1i2)TbLTJ8!EQ`K5t#q)@s%eY#^K+2w6> z)!%|a_2wxKSN-23P~Qnb;$#gv<957Lseu_sKJMVgqmW7-y#tz0%4SJt2@WOb!|4^m z|3x6m$F0^{ja3^8CRS+?xZK%=`2sxpsPxeB9S(de$Ko3edaD$VFf&za2S{{ ze+}gvbd{gNpWC}g9r<@Vi!+>z1Gy@*-CR8zX}X9#}ZW}?}4VF2T8V5wNUEnJMqZ3;7=j{cq}-Zi^bR6d00P<=E7<8%vtz52CqfY zSsWfK4>R67vCoVS6}=oTsH??iDt~XgqTKQo{HpO|c%JdT2+#PeN4H`^Io8`U z&j(kd7^a%_$qs$F!`qU4&(W9XB;V0hkI^T)_2uqloIW{EU!G@v&)1jdo8G_S)XSY% za2YtlrN07+O3jVF=6jXKdp9wZnyO;vF0BVGq1@D$rur-=W=$W#mDzGtgB2{Nl(utvgqFSWNyy}11bEt1Na;FAPWj^$4gofy4Wg_|c4`X3<*Tz}Ew*ZBb zs{E=W@KL7UnNoQlS(E(#AeH~Gi#BTHUj4=5_c1Yma~p7`YGefb-v>Xf;QztM+xDR2 zMj(RB1B;5$+&6}uH!jX<2m6Mp4}oJ2bfUN6TqC*z$_n^c1X&4An`cer4jhM)vK9m@ zVfq1t=?4fF1uK4F$Iq5bcr4w&K#3!h`aOVFs1kdE(|%wT;K+cmJ&`F`@d^OGf((TS z0^ln)ggtns;pb3@Udcch&C4iHym`y|lqw4JDt`A;RIn3zgWm<6HNlD+>!Kz%8iCFK z_e;SbXV?wVsexwZrA5IUh>t|_74j9Vvhx*(UHIyNAW2q?116Z?4_161xgbP>W7_vI zh<)F#kfi&km{PtRtaw>c(o*nu!D%le<;%c;PSuETAR^5K>*aJrWDr)OXcFLkj2ss9 zz4P>Rj`s8{>Z&iHWb-s?roRkOVHHYbt@`8eRI>E2hxvGbLH_bB|Twhx#q?YAH=K>5H)lzL$oqm&}OhvwtZ_@dDG#x z#8uC6OrMblak-fH`f}e^pOG(fQF8f;o~XlaR#c(ptPVS>gV|TEKiZ3v} z#t}GyJC8ts$PVh)F|1>r-c+(x)zdEWdu0X0p%BxIBCQ>Dbs%HZHoYCXS?~F=v$>P;xLbh}@#f+G&Sbw7h_Xx!Kv0@ItaoEH(!BX$)-D0D%M-+ z_G4J=NZZI!E;!Xb8E1=r@83##utbI?l6}BJLZnMi5L~2L>vzRLVnQUqu7U(MYQt#R z1<`ERE8X69OrRk`fXyRWo;dtK#Abj0PXF^s1gbZ94ZQ)pDnlr7^9(SdoH_c}9q?EB z_R1Tz-6CUpGo%b<;##*Wu5QL^f$Dc-^d542x*vPGMmGTNjYe0HA1Bw~K%OG{BJac9 z3J*BSq0kZbOc>d|g*jJ}Qn?L)>ZicNn3sHoO!+s}X%=A~u2r214%Mo=lS7UTAN|>PR|GTw|1mGC)}T5hZPXH^K23)k#K($ zq$iPN5=WIyAz7%9OqZ>Ns#91aa{;kapYHbV^p{9%CRWf!WF8`~P)TiCwcUu#N35!@ zt*W|`1f`RpV3Htioz%C338?bdP-EzJ;iEAre{2Osl&v8h6|@OhIT6~AdmuJ@(W5_| zfgXJ?dUQKRjbiE3%h9LPnQOk$r$_Gew@Y8nwJ++=Tj^YWDJ!mJstrSV3v8TQ(k;Gm zEmQ4XIEy?zQ**8g4&`&&Dl7P+LN>4;KryQLvKUjb$`0XX{bHxY`-V_me|xvub@=a= znjK4~Z)acFUEI?l;ecZZ@t>1iVGik4d&z;;ha3*_(Ub!k9|PS@F!@+QR8V*HB1GvN zawr-C;dL`k-*rkX(7%63**j&DJ!AtDkS&vlP1)jIjM|@Z&qjCbm`l#!?lpL7L(l9E zf1}D(M=Lp0L?KUpy^Jty^;hIB-gr6qf~|^GQ9O-JnlSdlX>H(%w*956>*jk)eU*Am znW3$N5fJ><-}?l#a9lE2^na=dJ4BCXKc>58M(5xQ^wP%1sijoLMKHL);srovMaSX0 zKDDAcTC5UcclkgERzf?XKW8^_Ury-0{Lp=Qq5Ise8R>xEdaHw5%Axx*L-#rL9ie+O zLpOx(b%gF69lCcy=-zRmd&h+CEe+jU7P_}W-B*S*3q$ul7%c|8T5kx73$(Y|Z(FNf z^;;xlo8hYewS?@qy6T^nkON29X%(s6k+vagBF5BzmFV=#T=hH|HDO8yEMpLmruMZ= zZFZJ+$3@I!=QkORZOq_*nEKrypG1VV5 zL+EX_FL6pbWteuyaLl2GU@K9ZeR0WFhGD83%Fw>%*6zsFX5;V)3P7lrpqrKLN=#lu z@Hnd7kr$dl@5ml)_NAd=1aMi&*3by;j>|(c(9daiK=qZWUsBI0L?Lb|La!0P&S)LI z`H(uj93zwe9vMtl6lhbf)Mlfv((Wk4s4}D-J6U}0g!_J+!qD5aIbNsgG)i`+>}CbJ zhAn^nXuCHW=kCotxhv>E1s%jestbE^1w%cCNqoDi=QkK4uf&(DdwyY0rLWAd@plp~>^R*&Bh=YJ!wgqrZxR=V6*ujdJGAoI6W@Mc=N}`_Y#uTlJK7Dn)+Cx5|93 z1~}Od`-{SJ=b$fn_ib+MyXp^+HaiCYJUt!5z3&oq)4t(>heyLBCwktE6YzZjG)(-e zwmz$FI<3Zj2A!9?T~D>?*!HwRX?y@rh%8k15m@D7+H7y175yHZV?m`AvZD!jSdLbq zntRH#qBr29Dg}~o2p|odtqjv$vsk$^!_()?tie(Cub>MKNlwDR{>MM}lCv_uq|@8t zst>TZm1Dwp%?WHNg4PQAye}X<$?#`}{7x~s!W~N=!G?1RH`}HxvtVKw{fm*P5^?^a z*havo4B5iz7^&akgk{Tq@D9f)IQF`2LAMpLWr)P$Foy01lws;B;*5F6K~*xNSSQDq zTQ2$ga*GW=hA+aC?>YFzWslFmp(=>Ld|W5PS@QfE^eIIlcBe~dbGcA|4-VHM2Ropz zD#RS)N{soX_>F7DObSw9iJqiK&1S_bSN+@BV8!&&`Xzeh9R2V0hvx&{5`B6R#zSse zdZPEhq8iZQ*1`1@jweJH;vHv5yv;D7e0aV-eGU%8JUkjXqUB7vN8jOk>J6@v;9nme zTeH-GG^qHNP?Kr67UYQ-u1==uEszJ?6jR|@;(BU3*y)t?KF<>PwYeeiRtA^J?+02k zu=8Ty0W+`5u#Fx`Ltq$Zm`uzAEl03f?_R7VXCVqH)A%Y1i_i0Av?!Q>;8%*@gz(g> zh)oZ(ZGg^YPzuyvGz8)H;+F$WP8y5HU~vvPd1ODHVu~>VvkGm#6}VV;XPbocM`kc6bEO^K>0kF7;i|CH=V&!|iK7FA!VrmdJ zg(@&-6{g)1HD{F#p%zTHyO3Foa*?Gm-pGEIDW@XxF)^~lKEix(^SGX@5EJ=L+594W zcGV972@T`BF@h!?W=6b)cQE26Gb45(4(%Ch7XOXjyOylXl48gepCAk72Tw2oNQW^y zR0t3Q|B;f$7>6k^<%YmX8@jbC@YeBQNn>l}m)UP<>A*UJN0{u9Q04uh%6meU%dpI) z8J>Sy;AA?oT*oYx@Q-6;8G-52R4XP^TpdFO=PtwQ4~?is7GT>#)9=xya)LA?Ee=-J zUg$WbIcKYx%`s?L4x!pc`wsNo;2ASjE~a z&8!twX`Hp~=#~?#<&n5K_*JhQVqz~X<(t9H!sS_;?m$6e&*G2p{NE)2p8o^^T5LtH zl|ng?n*7cZe#h$Y)x`2kF?Rqb4Yq?>p0e998}Rtw)hceX)?vo8sR}tds^KlLaAk(z zRChYgE#6~qnayp`h1}$fS|N;bZt0q_yAUxgx(0#*Ow(8c)vSRlF-9e80F&97Q7=xk zp*kgfJDfJ*tddj#?r#GxVw=&2ZgzLC0RLCe2{2Ze@1NI@o5Fbi)FjjW6VdQ5Niy6& z3UbVe@mByDTcaOfC}{Uk#khK%a9PQpHBYjvVd2{-=0>gjlrh{Rq6xAeLQ8NbGCTp`d#W zZ(wYVBlHAC0G$dyZ)9*rdMNxG1Y+%&vTSzrEJXw#!9sp9WqA?bFWHXW!vQ?exR*qi(U}|d zZ#aSK)a!n-2Oq+vV_*(ijgy4a5JQ;rs-uN6S>SBnnC6cUsc)g*NG2m?af`hbb6xKL zEQxnlFhP>RY`P$i4`yreCTdtrJuo2$V4iVY5>1E0BD^fX-rmJ^jsAx)Z(V}**=9Hy z3s6v{eqh9-U5If(^Yse!;_Qir;hO|T*>(BRG2yeoG}y0E@K!c z_M|URQ5^L3>D6G)LKrIf=ja!EIXN%GkGkQC8vk&16?$g$r)UrQv6yVPqv5Iroqkau zk^uwP=xX_jcJ9_~7%5kdz)9jNI}+7k*~bKIZP0{4g(8PTYxK-O#4g`#(c9EFuJf!I zVO3@;j*ud=4JYfOMJmC?%wCSHh@QMN79Ez%cM(+;F8$(~@|_3qs#hU>}_T zgW(O<%}#w7>nZry2@| zW-+a97R%~pF|5Ynrsg#Z@!f~t7x80wnel!vo@NrTjr0&~r!(S;i(~k{32ebhhfNqz zV6(jmVgs9Pajhcv4czKj3_ET82$r8P<`8@BHnju|R}8f-g6RgVh@SyE${7_-4bf>s_d_3U^6~rtbmomdt z>c!}OhxD`cJe^ND56`pO-$StpPJgk?{w`1=dik$e?NEOpYjHaaPw*_+1#9TlJ5UoK z0loOjyY*vQ)6*HAj8SbmZD%w`-ma*=!(%N+_c#&&Mx$QBqpf0@`5aa3#cdm`yY^u_ zy0iW2HeANgUy`i0sdr*yQZDf2sT;Xg&;APc)ZPA7N{|zr4bO!byaT4P9OP6Z`>D6> zn3;fb{UdVLwR$*cC$D0~uZydne9d_Uj7DTP*@K%GghNyUvX=hBT7h*%3Wv5#28XtR zgq-D@yO9uQVx3g%+*#qrJTHKl>hR+p&ID$Ll^N-*_}uHkXfDaAqZ|VFEWv@IVQlu1f|7bfs%PRl2p1!*b zH^D{7yycq^;l`Nb5s@WDNIC}cF%IWsFie6zeS-cAC#Nv_@bJ_Oq*|$MeZhSN(tT@b_a%!XHuf*8$Ddx$Ej}L6@F6d2uL{S7Y>^Dk~+8>XmqZIa~Q&cvQwFCeDa&TCxO3=f7XX zzpcehV7n(=k<$eo-O-R^sJ`hT`CMUqh8xd{qAq^ALU#%p%)bo%P3Wk>NlVa!g6{av;3r4Bq6zr%4sDXxoOEk06w919R;8Lday zQMRJC*}`?){Ouc|=ci*?=Yo1s%{3-NaY)~)QZ+I zAC5_1J}v!2n9O4O7rI@2L_`9beVYBl(6mt>B6ktHgCc(jZ4pKac}B0U&L57REv79z zgy^8W<+&bZuZN9~qH6f@f@2o?;y4K5FW%YBBt3xhiBL>ZAJ>J|DbC0j$MjY$|Aycd zQ>(DXg^{n`>OJWS`~tc4gZS8v`y7j3(cD=!_YG9pjaZJG(bN$G0fqL8ad|XAmT^PY z$9zYM+lvotPMelz+a7eLWA*%AN*;s4Ducol({+PF1@=3TmI?K5W6$-N9w|PdzgOIZ z8l0fz-_+h=yJBi^;TTS(C)|OGnt&7U>^lHk|H%7}D{zqA+^fY+#e2i!Mj=6|{z}Pf z#V=|3Sw1jLk>WS>qo5D>v7&6H;v~SW{R3|lT}zHDkVP4#mLF;g#PmwHbLFj!s@`BA}G8DsK$(_m=028+X$|XGQ zq_8@{=oFa*(>Hq1WDThBqwk(xZn+7+NAPcLtw(3R#kgwjsN6GdT*)p>$`;~$KKq;1?;$z3 zlcN{mZ=pBlTD?WZz?Ns+Jwm`QNo+X38MW@V@8MR;YAMDR{gm} z82c8SxV=j{-+N%XvRejD7$5D%ghz9a+I5h_CT@JZ7UJ#E+t8cpQTy@0|7NJM=|zrA zGUlkdLm!%7#!fWf{}g*;2p(-)Fw(1HalW&i#Ipgo9;pN;K=x>K<@b1U%IzI2CqCt{ z?B17Lj|?ZdL?>Dv{OCxl zXhqg04qvgw=n1{2Rt^L1akZs4!0pOZ@6qK)&=(*gyvXi-Bd%W?kCfP~c0KYr2|&Mg z1p@FUTODm#5!YvmCPL}g((n}r2OKcpxfqvAzZ2IGOh;!A*iipg++amBpMa+g`n4?4 zuf=wtbHR4y8+!8!XKiVb#g{%6mh#L0%F~e1yMPFXT(MZ>f*>!h%KKO5f#&lDAe4jX z}9z#VadP~3^ zLAcbYjt41$(%&c#O zf^Zz#>=>V;tGy!)?pC-2#&}u(8q@Pw6Y9m=vLapQs%13Sq}Rds0oSCbuqG{Cx$|9+ z;F&iwTKlc|sx%i;I~u9Eh0MAwYN;5}MdWCPG6&DYgcLN$!HZ}HFX%knaW9dD@3nfP zE5`ys6bL@*NDn{sbxQ)n6>$u>9E)>308C&4U@*Ukr%|~c_dOwu+0Mox%*i0nkHo$W zu~jN&s6%E&|KS^8G3L$H(Q1Z7={c1loEs@=oP{#TK4o+);sP(^#2rW!HsPQ!{;fK6 z2wW2D!MR8)o3x=i4b2{S26U5Gfw2o$t9FpMo}}R>g4w`_eonu#4-?qNc=71 z&f<@Z4|PHrnp5j+d?Lm7`)X+vIcb1fsC8^ZY;W=7`=fJ}*J zIUwNvRxI(DaaMF9z8V>-qt~k!77Uva#O3=EP_Vpl6j^Z;EOs2l2looz$EEbT& zGu6?3D)KQII^)^5BNAekAdM48$K7yVZUCS2*5_TJWQKK-HPYOs_$(5M8 zEYOF}jNU8p>b%msi}fvw?ppQ2A;20onH>0oIyl~D?GS^ z331D6=a(BF|1cRJndb|lYEt&X*N;OMXjUdQ;;S6SK~^{1qkJ9C{2x;YZs2?f+JkHH z%ze_~OLy|jU2Y_58_E5X9A9>4+716xX>s@*`ukJ_)o8oL5+wRyKH3jn@<4j@Yj{Cp z_cR>-Kb5$G?hyWBhEcHbM%;bs(zE~i3S)l?IO3F)rC7G)AS$-&l}R=Ryumy&KNiq*l&fmmXIri zlPB;Vg&JtcM^Sgehs!NTBe)m|JP7P_!9K0aZi(z0J|xl{iQ1-F0f>?o%Z1J`| zfTJUrRGtBw8Qy=ajr1 z8eRV^c*w`&l@^S)E8lFWQ*^+#9kznoqddT`h-(PS7grrSOylcftN~+t@vdjf*R8(m zO6U6=r8E5_I@2a2J?5|T2p7cIyEMQj@+USl6m(8 zp#xB4Hav)Q81ZscJ;>oyDF!K3b(p7*&qRw#&>MLR7j@2v>~|`{NA5tqjaTO?^u0%S z>o1kG*YC!W&fFq6yS48Oxm69~ff`&DvE<-b-VWB}OAUu#sieD+`o;ymYo9*^N}fB^ zipoyO5pvdVqy*rB{FHFYt5&cQ$x9mNu3e5Nn$j_?8FNavA&9CzMz&I(v0VZ=qi8Cz zENN84uKgBr2AQB;%9_(K8U*t)WmjEH*y=$7Et~f%s2nAYwZ~_>o@gwqZ*tW&G6`m| z`Xnc~v+Aubyw}ENNB%NIZ@DwF&p8qc8Bb2~}yxRlm(wr7FYwf$LG`#)^CQ z(OsNwlqqzk=%A=^xs?A-1f< zW_ z=2jJ{7_7H=wupe!2|a}#By0NCNTp)?0rfY^*kbB z$UK(U1BvJ)V4&M5dA)uwEG0o6h=gNcv}OqRNRiJs;<@81KlPNc1S`PO%6YzTqw{?L z7ay)D9qYTVbf)iX4HH0acv;s`3^Z8z3^7XNw_%s-Rn_cNuLWH*bl&>GZz$z=MP-O{aK=z@#x`I)+!>S^o<_vu|J3%n}>?17R3br+VL8`HCRW zn-pZ}OEC&wR~!kKhDl<0T$t2^-SrMojsbKV-I4xW-=?3EfMkzzO^+xcsy$xmbJrf9 z?{n22ul8lt9v|yVt35u`U%FnTD4U#XI zH9YyRTgz!gFk8l__SQ5;Ga1$Aw#YgTM_POAtAJHIi9Ii-Aiu@uhR5-N3)nOyHf8{T z#X%sL%^^SoEKUqeu-Lx?RsreyA;Qc)oY~bh0omC!g4yh`n4Qt4?Cg$^{q;^{UxP3t z=N6d}aPwp|W{hk7hz-hQfY~`oGG*ti2igDsWOj0efS4$l%goINJdiRFShERBF@mrd zQn1K|=D~3#gRm4=2#X;Fi#%zL&!pr&-T|@ce_#e-NYrdNNbgUkvMD({r0MkTz_sex zlpm2PShD75+d?96(WL+g|7|yqr-b+>YuS_=t$=dVxl@abY}N`Gb9DE}y%YENuUabt zl}q`#x-BG`LgOie(EQ55+8;pXv_09V~9z}K=_pIU)T6b)(_qtd$SIU()%h5;F6>kl%@CIX&I zd1l#2PG~%9KROxLr3;gYnoQ~sEdY@oEtjH6K+F^xPmzosd*1*geEEF;eDPngR@zK1 zn+O3hQ)oP8DEgEFl;~U#z_e*w*LqfZYZ~j?f-ZDDYjr*AXB{hU9jj6r|9TR&o;0l^ zvFli%btHH_i@lzuUPpGUBg@v2CF_ZOJ&~^?RqI%P>qr^;xvN0Ung*h-L9cXm1JOUn zPA+ix(oLA|qlMNUa0Q1=M#nkB|K6hJcn3DRffPwn>CGiE#@+Gu!>*p0jJ|Dj1IyA& zroZ-rDIt$zAY<`XeI42j$&-#PfitZ)oMZ>el*mD*By!Lsxku5+B6AKhDv=|jHyq@w zIS2Wh$Z@PU9IQBV4pv_xhqX5xtZ(+HbHRpq=~?rMT-2)fC`-S1dgYhGljK(lj$Zji zSu>Y~5|^N=SAO+dC%y8k-#Y1)U;WleZ@j{Rt@V_tbw2!|f@Y>3nH`BbvAlDrrZEpg z+X!hJtM+qj$0>#k<+e`^+qfMYMb~pF-SF)I2Nu3jm}VR^=E^b=FFC3oR|~?Uuhbv) zXTf_6li6Ol7CwMd_5^2)#&7TaadH zs2~%MP(i-@EyUmVe;&-G`c3AHp@P&N9G78BLiXW78J2@GAO{N`lz8$!RKRu`lwmMf zz`h_@z`i_GAY)hoTUbyA)S#^Ag9Yr+Lj{!aPyyRUP=@B9$VIS#y?S&yPRNbj8Z7v+ zBwCBVAbq2}G|Jx>@HbfSJN%7Ko^`4#nvYW((f@hvRF|4oi+XG^Cf5skon7CwGpftf z8u~N6y$18@+XgYQ-T>!F^k2!%KH8NXghdWkmC!)Y(LF*i%6bU4#AB25%L2#T4@~%N8Il$s^!{nZM7`r~%Urn0+QL&9 z*Pz#wTT(J*7XKFJx3>|kWwUaBi&U1NE5@Ck-;OY))?W-iL*Yri zIw3|YWZ3Au2r+jd2bV*|2eCW=X+WX$hVy++tnV_h&ZDAjN?g%45ywdV&QJhT znOF1=v~9Mw&WIJ>V*`=wU}o72|J%?UaEsk-|A_T~J72DWZ$C@%pP*uf!O&7;-!cF{ zzoPmTeJJYgg#IeiV=118x+9F=M|n*zbj!%-|3`F$h5FIJTeqmndB?j29Ejd+oeRUV z?a^zYMGZS{2plVO)gK0rwQ0q;kC#nsX#@WT_PZckCEJ#w&`Wja^!ZqvE-h(W8p`I^ z7^_8e64)q3SC?S*JCS#t-WP!=7GEUJcGW$HItd(0bJcG^p!WE!aB3u7OW1uwNK_7* zOx2>p4|W-ifI1)Z`f@DSm(^;0c`rVI@?KlV=ew^xZ{sP__|kK4a_RXhmY#dD^eo`g z6RjanmY>p-MD8G^Ft*Nnljz- zTduk}y6G?459>SilS*pTEg&6NLTWD8cfgo(JLG1kt-Z4ea?=!O%EsXq$PKm--(Fd= z6!)5;Ml?4Sp{%$AuE1Nal9!i8VyHOxTvc(~pb9eTZuuW5EMdou_CJZBQGmFcL3x42 z3I4k3|4UuyMqNvf{f2^-!ZK*p!^(gW3gDDiW4$K6BzOg+{^o;-)YLYca^5;e0n0uvjzHe+C`1Q(Vv6> z=XV!i`t#TcYH-_F^e|*MsSB9nG;5dML66J1O)|YL+DKWi@X!mJ+B2dyDqP4i^F1*eW#JicVC zFGfs7UktN6edpaa0fdw-Y_qn@+0)f_Lgnmde8 z=kBYUC0S5D;D$ORUc?(3OtU$bzYGwnX6pq62489iX&^rb^M-u=NDGdibYVNb5LCi` z{1(@vzrv)r%ky8(e=4`EB|a^i(;iP|RwS4nTZ@lcHs?NM$k5mtzUT72@t`ACi?^0^ z%UX709v6~-Lz45gG3HP?79omis#}2f+G|*z zQ?WY{mPrlFfVd^nHgnm77^$N_SQNK&8KUKmMbg+vrep}^9Am+`KTifi<17zidIisU z9?#nG>f;2<_brwuc~MfS1-&kwWtP$KN`u2ZmVNT9vdp*feVV1wZt-VpLpNk*wSmwk z$SOp?2wTwk5EZbO*4;%)>#WatYz&4fNG0sRaf;#cY$w7qu~|PW`qgTf2H-dz-u3Jp zK4w)%9W_>*WAj)W_t^#dmjQik324-^Kaam2XJ^E=j_>{qrwTw~==oR6Wo!e-h}r|0 zoqI3aHL^YCVQ!WXi7sQJ?7!#tt(l-ZOETSr_t-~}0JN2B*Yd09)H*)2dRe5TM<0O> z62&g0l*H&SLkr87q0wdd5^F|GbkojLU29p9b&YFDrhmwj@IsjoIrh|6Ju2mR67FR? z)8-(N)pw%|X|(U9E+MP-1P)XuGQpTO+mlvm^<~Ix7^3@jT;Pa8MAHF*JE>1%6INo! zFI}&sq$Yq8bZsR zfmq1m#abKkHAdOyv)Y5%(-|!v6_tUHt_!C7Yu4R~crAThH6KHR*)#bZ5zL*1XUBwS zpvr1lI~(C(ddH~fcsRt;vdQh>(2mPn((N51(ARVfi!MYmq{!5skjflUIrUEVZRi;0 zxa!K$Y9Pb&V}-C5g=`|bp8M<%@i!96=CinI5}J!;#Z}A7Ah%t+qmy==>S|5<9g35M zcoi!>YxKV>t*9&4>XQ&R{r5^|Bz^jAVrq?XpbREk146Rr#lDct01^xn#Phu~$8&$5 zc;2cY9$xUWTJEGjv+`v2iRYgLkCS-VzRr+uYk$`l-$n=?T=eEzEm!EAS$QV(iRYI% zQy+=CiHEK%&agb~+xsfdRKbH&@vhbSnd4d3C!W_~=^2UU!wmRy{gefrCVJJhXf^hr z)h?`vde=dJIku1Cvj)E_@Vg4X8}Td0Zx()E!f*To+k2lcmCq(E5BWCc@)2Q@tgNhxn(ncpL-bJ@#91*a3~M=UNur1!<7#gVEAz!%Vk-Gy z8)POY{d?e}n}RSOcRhL|*6^5WO?Wgu)oL5Ny)%;Oo2KRdCl;2q+cG+vGlLT5{t%~G z=&0GtMO$y7zKN=+u3QiLs*XJM-E&lZ{||ic$}PednZ%84elo*%$y!3ycEc?b_ULmt zty{;KU;#nKegP%o#DZ%Pbk(gzSOE-5Ozr-htnERepyRrU1)q~d-$tUfBq}Ho@LTI~ zHNNS{+M~2%u${UJRMch@M|x~JQU?o)h^ZVwwd!43vTN1;!%%2yyN7Ix>n28;J~wL3 ztMJy=#{QE6Ad%f`&VB>4i&Vjuy)bqqUK`pWhUj+3$jnV^ z9}E45!*{i|-IIxH$ewTf6{aYW=l00odgT`DSGS6Xbco-7||?*vUNU`t#c$7M8@H}P1}ua*8^!%pxP4-*W-=) zF|}Gvik)d?loUJ2PPf`6zSxbV?oBKDjIX~+K617hy9|-Rf+-BTBv`>9?b#EYa>sbi zH1V1jdke3sW5nEZ;;XK@mk^=nvZus6&=WXtSeE8P+NB*kGeYu7wd0>LFK)|)vm%Ec z(WQIUcLolOfsNQDf&IT9(iYDopCr>-PI=>;yk}gd=z!KSGHQPbikdG33pj<1{+~%! zOUJZe0VlB0uX?T0#)n4l8)vns9x}7zhG=AB@~tpYsQeB$_)>}X)-fdT(F7I0;xbYD z!18}`WtB1RjP@;x{R`AA(Tf28xx0XAGp+1RyPMQL(5(Qi(IVmBvR5+{-E#M+XuDxdH zJOdaUUH4T11jL-`fbZVk9Youz{V>?FEXCSBEzNSct81w@jk_?u;Y-)^*$o~QBxaK4 zc88ZuRaKHCz9|rCagyjPdX#GQ(tm2%Y|OP=twyWmn_AsRFU8bPa-#!uVwK5JAo}G= zSUEBT9fcF)utdH)^;B2jg*@tH=6{Qav&_}6%Tp|0F=FMi*|udbKh_YfEV ztwZ>A{Nixp&l`cG6u)J?{NibR_!d_>HB3VnwCWHKn&Mgl=n|@@&@RrOxoFi3jBKuX z{&A={o_maXj_+U>slIXj3;&AYb@g8%3}I(I{^IPxJ&^an3y$@T_+-wFwu~5F@U!w# zD2MsE)e&SK^<^?H@{N^r!gu)UpCS^6pRca~0rSHDgd2}MIrEl11iZ7lUV>^Ix(=S7 z&k<6Vv0tfPHXrKJ=vOnS&md^s@ifF@M0NBDv|l}!Q6Q?-@eC0z4dA?s#dibYpqyjM zD=cMUCurY*#7G9%)%u=Uv%7Ma;FFLV%HPmH`t_sU!>&h`@nFDR3uG%c&Yd;rcZlUs zS^d_UmEV|YVwMfeQeRQNtt;n3rI#ogbcCvC)m^(4=_sH+?rH35535NOGP)Qg>lli6 zr{e#e36P-Z$nsy|b}%Uf>nme^L7a<4k%MAg@0mh7rywSZ-rq@sG3@ExZd4)K(O6kYIMr%yVJ7|E%QQJp>aV;a2xKl3FXA| z#9IT-OOPwD57LkLrWo11C{cB^oIR?l>=zujd5^5PM3PPg?9iMIABvn*VgDtj>a*2B zI|EDdpof7%GJ&?My#fmZgF6W67zRHqDa0)bIH7Z>DT`he{1G-?FLO_ z0>`@iaO~gp5?)49rHdMH&z$xAPoYJE6W1jo6#i>EGA1zw7m5QK4kU>`3>@_&=4NPe zK(1QY_;xfp^c+{ye4Qhgq@IPdGRVqH z+*HI&9;aayaa#B&`T(3gA}#Z}UIxuMzh-#K-Im$%4qtMrTM!;eyM+b$%dWr|kWs%G zJ9=H13Y7<7kKgG3OZah5DVBIj#Jh5TM|mc1c^cWZ`f_CX^|h!`!5%2xhy})Ryy}jP zU{nq=S6~2~sdA%xVFMwJGNDN(2-hhj)k|9^!#1!hm(2#0XB(8dpW`V7P8RO=2&+&7 zo@nduPj!X=hh;0-^;;^sfHFV4`mQg*sVMfs zR}*%-;#HFSI6Fx424|;Tj~q1i%nboxsW%{sxun`z*-}Z%tXM6v+L@n<2_r|c^}!xV zi7u{>Nfp|aQ>Z$HZ01sI!Ld;k)~gsn2}T5W*7D}g)OSNt{|~xq3R8!}+l*7ahM3|C zS-NH5HPw`|(8Q3RWQbr$EC^|!(lO9@(Rw}`Xh2hidtuiz0K0D**R(q10sdIliX}}p zjcuIPb$n?aRQ`};HMQ# zP%iTuR0#d8X@5mo_%G0CSDauOAtmeiG!tw}PYO<(UMXA~1Y9JOawlqDfm^awES@mK zTysCrMD`~qv{Dl|xk0LNGzNbs2li)#BxEKBki;gf~J)6rX|X&WiyqOdT9f5 zEfupon6H~N181N4nb62jaux2NfK4E$JhQM0$Wj>X;RQ4VB55Ynss_F5f4|PbDubALYyXgxlXa zz{isH$Y`Ud{nNRX*0@CxcJP3rqRQ;8Xl$DL)x}thqtR%b@0u4Hirs zXaAZ5DI8X*$z%a-$$gnO=hB+of6>yLbDu#X-|$c_6Dx-d${j@8@4kf14h{)P;XD%jfiIKZ!{timvqh) zY*g$nc+!S_(LJAoLRU;d@D|gqu_mW$=J}GIJ0C^hjJ6QZ23A=ha`E~#d|8M;YWAUL z&tW+ChZ6HR{;vNq{>0~Cruj=B@YW)AFYulect0h)UknP~hTh?A6nM`P-fsp4ud#P{ zZ36EF!u#Ez;I;P-Z;!zH1L6I#FL)2)L!v(J=S#dk9>Pn!K70%hs6KjyC-u=2-azW3 zS9nq%J>hK>iu*I$=lcM6d0GJWjx4JtW|<3B>D{ZDL^XHk#qF9un|=V}i#z7#KYAI6)ul zApws~AWk3K#K7Q@#|e0>hXlMon&7bx1_rO!`nVt2d#R5H1%nTN*FS_m1FsK(*Rwtb z0&gP_CCVGG4}sUSJ_Z7>*ZL56J?mp2@b;MLYv&8(S>W}okJH1eK~drIs2Xr|>5kMm zvPQwx$Nw0C&?LU*!>EopiC-F5EzqGGO{0om1%*GOgCJ}-@N#U2QgTlX&fC}-aVFUhvulo4k zAP}0w*Hrw^N<9Cj;3tGQe#ts0{1g?1-)Oh`c#)Awd`-nK?ROIYrr;-pIDW}GDExa8 z_}dYZ^8XQm&?LU5;{Suh^KS}%LWtv+tOLYLc95HJ59nWWe9r|2u8 z-?b~L64WOBZZ!ay^}C^L4`MI~eeC>2DnFFIgjCY_JoXysp-U4~`y4|e`nKEaxB3sQ z=XZU_M#ii2A}N~Q{s@4413oeJ2cO?RHvIn3oA`G>aGVMMdgkwwf0DEp{xSY+@UI7a zgMS|nzAmd!wThLSDR8L?ylBZDh+3g4i<#oqHPZ&oVENZe{yz98DNXX1;2%H8tsrN{zn<{T z0yt>?iKHnm2AZ(F3fo;-2IW$`lmyA2H|lTgpz@pW8~K+ED!-}x zHu0+yEgV$-6#T0En|qcY?!qVAyKNuBt6{to;0)BXeQ4+Qq4W%D6LF><NHyE1 zrRnUzC*{4t?@j*B68*xTvR>rtr5*y}XFQInLVc#*+E+atsEG7KW5s8*G==>xu z`f{SC2ArQINZ|ke$ImbLYx>APe1PTu{;%VlOr?JS`4#@b=T9mBh>xFN@&EZa{f7Nh zhS@$wZJoR&$G98TcPYywu)P|Y3a7e0mqP?dK-*J{O<&1s4y%? z)Qm9+54MX?wsU~#1)i~3=mrngJ}inEU=kiY1N9BhSX_65*Araao~|!>Q2bo2RHbv2 zV@SKrszrj?w7%+LPPIngIlF|WSLIesQo!Jzd2k-`Fg(zU25=+X!&t(Lti`S2X@6%A zY_Y+74p-yIw~(ZMAXncGpKm+Eo7syPPE0zk*V_;oGe^ECXH@j(&Xa}OKKODZxqL10Fmj6Tr)FKH_`$-Z8;~+ z;55TZ9MM@WXDwUP4ueaq(bCG+G#)}`*yk?2)t3Xu=4PjNlMN3X{s~$(kH^;Tch(+< z-^|im{kevZb6>$x5fgEIJ`A^Vr_rAl|3#0lk2}LK*qolqwqC|B)#w9FX*k=Ux->)g z2?=gZ`_P~}ddpwXU}%?yO_tEqIigZkQ&qDvpleK5 z?ecl@Lf_7*K%afi&O64ae|Csuiuors(4MwiQ!N8QgGJItDglSkn*7z*gJ}wqRgO#|UR` zv)(=7X_uxcHa(CZAK%yz%}%=DK&n}9o2$q4_rjZ#A78vHWuW7S)PauqqzRb%H!usN z2#XR!_hbhK(VYN>JF~-&5RP0Znkg5G(m~e8%Acvu5|IEAA$0PA#x%uV=^g`-i$H?( zk+|AjZq5bX?uux%cv2dZL=N1$hiLAH#jIEo>i z^CH)#Hv6_!`#HN;jBQq9#iD)(W+SOkx(G(*LSbC$&XE42d(U$L233FepJDyS^Pg$` z6V9i({*&}y81)aQb%Dl9N_I)xS7%-@C8-9NO{={_ccYu~IHKSBIlSg2PR7i^tsu#5 zmv>ZKf!m5i`%vdoQr24zQwvf(b+7ozrC#u#z#uzt{3+u*#si0GJ`i=SrUM-gKl~>o zr=(Br7i%)}6T0PWiLI@q5%)wOr<%H*iqsy@3Cb*P`DL{+BUlzVmbU!$q#~i0HGT@d zZUbp-aYK*!g!DJ6o5QFZXi8T!DQ62tcb5s53l5B8X|Z?i_^6vkT=Bax-K-B$^&vVk zHBPC52tQ7f9#hv^;X?d$P4^X^ zBKQa+N*X1JF<4MLtxoU=V=%u?t>Wes{^lkoDq8kpz!KhV#N^$gt+|uP>#yr7(8k^C%bzxe;TTYka|uBpXe$@L2LBJQjS=@KzBXa}pjon}8?hq3oN6fh)R04q*k3S$#HW zCuC|d8%pIgqvKQ(h^AEt08lCGjwdLd+RQZVhpYwL-k?0Cp)CM3ezhOQ&84^;7ao_j z?=n?5#J{JSYER?@hb&zUi$s=;gC-digaR;@|U4Z#8HbH5mEb7MI_q^CrKfcS*ne_H#!6 z8mZsva|WL^8-D)W!QXI>;j?DXCH?K^82%c8e?R`7oBmnV@417&;T+Si>i68y-`+3% zfkQbMR^bWHq`Y31@GJO=(3z>uQmY&C5z!J%3;1w6TNbja9b zjoat-NG}ZQCB4$m*I>g~4$zr*&|zyJ=fM={)I&K5wW%pTQ4Bi2+W&o?#(v@Z9r4l{ zo9Ngb>3Q6*kWB9LxL<-WL!WzE_`;Z^(bXZ*J_A1EdpQo*9ljd7HQDcg+Fb1qxMAM} zn<3?*P7Ub7-GmxtlkA!Fr$sTyH|#OA>?I(lU-(RL2Jl(je&I908NjbS9egJESn$bm z!+=li->E90HDw`S(yCClW;)xiZd0D_&H5>|4WYIknq>b__9e93KO?W&iI{A=x``hC z%huDD(YHjK?7;4X*eMzti6&EtJcYe4ONoIPN+|m>o1#)$gfT%(+RY{HOKfKQl6|1L zKl_q|-Q8*O_iA5YS4~}b0{gh6eF;eDW?w=&de|2@v>A5Auk&MH^0DYQ+ZUXd0`!p2 z*-FSY+1FJ9`USX1nz$P#hw$Z{6wxo3xZP~F=D9?P(*hXR+MC2$R={AZmo~Nw!jt z>@j^XTY8-2kqEGI!JuoQ2fzEEe+jBpldX|YC;c3H)E4lklm6OIIsdDLeo7JepKr*& z2(U7~GYPK@o~LaTXQ2m5&W||$8{_vtxW@2bJwcXR z{#*6KRrQ_zBWjx8yOg(NOl(r~e%}qM>xb1W#@Pj?fmWoImawY%2r8H%%kaCXm+?2n zySI7r+I_sG{P#{j8}Fx?el~$mGyQA=pJw_w1o#UK`R_x1W$}C3R$(lVdbWylFaMun z`bGXf#q^8(e=6ud-TdEP<$pV6NwAl9|EYD?7u6ylxynsh3K*v-u#c#ze-!;34~!+jg-?IV{72Dmin{RWr|>7%Uy6QH)P+w!JO9M`w}<@i{*=rA zg-^dp*mwJT$p3{;ze(8R^qZqDc=f1h6{}1`O!0A7&{9oYon}ywI zzvie5p8x&JKgO>Moc~LDj=!d;3!nb}<^RH`-z@As<^TNBul!@g-RX?L{ZD598?|Qt z8#YUd{|z{Lqv}!gI)SF4vTjg&GiDWy?BBt2_fY+a+SJ|^KOfr7ca7Su?7qEh`0wbQ zKBZrZ`|n8a&3{L25C0wMsuZ#}io;jwrzwT3H{^VIhT8uNM2u^}6yA`->@!5l2FD=^ zYYDs)ba&Cyy_hA9v$e_Axj5EuGLNHioFL|TL*cS;muCs!AjPJe&EihnZrsr&HgUM% zI!}*=OGgyHqd9KWuAJEHpQbn6ekWWDysJvuyMn^BgF8X7b+Ihd7OB(jcd31^1L`5aC+(X@8sL=KvL!bF_b( zNRlI0Vi! z%swYukxtgYayq+~2gItv&vTdv|BQ{%=hj~ekIN{2Mav&M@d|%>)eNkC-`CtlT7Jev z=vv}?mCO3wt2~PnUDLE%hET(Co?*asmdZ~t4*!f?_}eT$Yd-ula^Y{Y{Hp%h*#9=m zKfv~H+AI8PxH&6r`{)#_G_gvQKIpN5u-@0=2?BY}UtJ=_sZOhYY_h$r$YR;Q%Lv7n8 zwgrbS&m7hEj5Rp4!!~x;)I0op7nC&Cp0K(eZ(J7z znDi5#nQQv;K|#R=gv%N|uk#{NmFame84>rL=3B>H+2 zybFoG-URO~(|2b5pK8CoRr7_>|Be7rix+19M*%#y{2NsNr|xuBMra9!g~w%a z%=PYAQKhbT}w3$$gjF+Er+>cgOO5$sMp>9Fc#F{_gbjPyh{j7*zBybe`y8 zk7v-sprVJN^F$8?%%F!sMGr%#rw22#dDxK|r~u8h!a6c?z@}^B+3$JT#M!y3m5q=7 z%6_hIqwl_-Esooeo+bFK>~jg9m3J=TvoiXEUjzR47(is#Db;)wtTgt{l!xnte`7MI zFaMv&bjI+>9JNKqBK#XKE3o6D1esx<4fqtE@bmF1IQ#Gw{qZU|`|uV0aS=WH@Kybu zYyPkl=cazi`F`pb4m=^(-5iW6iz@6K+hJ9u_KuZ36>bxq7ucUcSEG^rHhq=!Lm~D< z;qMBge#C;Pt3Oq73=gAi`UzaH_`ZshUh1cM8@-F_CsT`^;$M`F?yS+rDh&UKR9=|$ zk#pf6k;)5`KE*$Z(^;eMZ0H9>?0Q{B#^>*&oHvcy))_e*9O@fxYf}NG(0ImrA?Pp8 zFMT3*{jM+0FMT3*8z^>(>2f#y)S1wS9;W;3tCzuF&!uWiPLSY|*!{NpUHU4Se1+Hn z`f6&zw8UgyL=bbMmkj#ZW&ts zLdjN9p+!R3^uxBOIqbH2n^s(Ctp*`$Eg0x#}r2S7&OYK@_pjvqr4@{$2WD!oGPDuO)Vdz`Y#_- znD3}l^{4WE;^nJNDIedoApffJ$=B5KF{=OaF@;e+295et`A$KC(*p%?P}<2=)++HXJY z<2=)++6SfZ?AI^XH$Bupj$Q_6l~8V1l6i+%?yicEcU8VDZH~1o=(bk*J6o*kBGsgQ z>>0sl-*qnGlegy*K5K38@YRA>9oB;{?!@M)q5mbg=1)w=|j=px;Yqf8lsBLzg zLYkm6XGNa2eUvkY%SvaCFP*b~CvRO`9*y7fZZt+bQ2%F4FGb+fL@!0?(?l;t@Drq$ z`eC!+Qfhl20Q78%pwS6!kYPZ&qE#&vVZG_-tCwx9-G8Ds;<~-Q(Km9omOny^jB0-J zaL_Trm*&a91BaP$p5v_r#y)xSgq2~h0r@-|^iV`EBzh=<7ZN=bv9m&to?S>#;^ZO_ zvB6Kf@(-azMRj{)cTq5EL^5(pI`kJH1j;uz^s zbdes0;`A_lF6pT?(Zg_(KYUa5#Za6chR-EE)qo%855tN-?fXt6IW4_N&RLR|C7>dX zpW!$s7*25Ftl?*U$IH*Ks*gB+#>DY6eD?9Pe&hHV)>iXx96!Tx{0yIc{7V2ej-TOV z`{0|B0*2yLFr1*`9P}SO>qF6TzS?Uw${Xho!^!r_x6`zePlP|ULdQAh562xf1{s4- zqjG(#j3w5P8!(pG8I(|2;8Zz{RQMP=NBHhf;$u+ZW9S^=V^tdE zV^HB^Xh8Uk8?!RRxtKBQv>D#A*0X-r&B33zHOZRz{b0SPCs)^fdEn{Em36*>r)R0w z)up6YPQ?`Ak&FO*;%CznkCsg`q#O;TN{SN9PAv-ss?Yo+OXVk(>j@+%K$E=aH$PFS z{N&<#0tsfPmbKsf-SD&M!R*ws_nW^P{z22x(|&B@+h?`WT_)Sgjn?EDVbWEky=<3SQq&$eQQL%z0ku`6d(D> z{hj3b09iN0Pw{^&{DOHEORMnnJ&s?(f}f#tgI_Q!E^u)zl*IA#n@{jFbZ+q10`e$R z`S~8lFJZyY(4g>(b{j%~dRK#XeWR**-<{7`v5_oW*~yL3YQP`J#x{rb=9H;F-g<6n zUzXg`W{%f;-_thB%W3Id0t%D#@@*g+)qT**?B*?MMK5DzpgkM(Qeu+y@@*g+&wbF# z?B*?JMK5E|8ojkC^zv;W8_9jp%k1VYWJNDy2TJdN`>!PcI?B|3`5tdS68=Q`5250` z^dHqyeu~2R>AwZ@s@ep8zQ_45;d9)7D$Z+SsW=D@P=C;U1T*(X1C~F1Wc}*-075)L$z*)l|FMm=37>Y}PgnJvodc`l(eVG*nBAJ*B$;?kps?_z1!8-w4 z*;rNikNjWm-UU9Y>f9UN$;^ZyOxT0WV95mLfdr zQ;O;7F2VEZLW(8tvo3|w>fDs}G$pm#D0;9i8gInaN2K_=`tC)Z`jmg7r~5m2K23$T z7;ZPE)wwC{X-aCfQS?{TN2L3@`W{4{`jj>Fbg#wpX)3hEaLXyJ&P{1gQ&OvqqQ9a( zBK6nRSA#tDDUZ?9t>F1I71}}$c3ldk)wwC{X-aCfQS?Rir6bBf*p&WUm{$c5MCF`erWZ36d4AdBU8U zv!$qa!(XCqICU-mH)MQqS$wGXz7al@(ZGj7eC+U*_^kT-@S)!QM)*)h10M=~JwEc^ zhfnaE;zJn?d?@tw_=GNx&sWc%$IXY8U|nzr{ZM-S&k6y|Tp4_f!hFEOL&o~x2eC2Q z-v^(%JPMz}27C(r?}1NU7==$^13rcR_rRwviNdF_0iQw_!#93x+Y*};GQO=BecLYj zPKteRNiWV5W)(@3X5AuPJF8F{w_QLjn(e{`J+pDkpAp_l>%2KzyYOsLY&5wwt@G9w z`*l-Z_x%hys>|UEyM!%skXZIw0=l?KOPu)j#I_M{ux>SlviM$1*gh5s+OjKk9k<;& z)a)(*SF^X>1a-xc$dgAX*&d)XS-LS|owZb&+^`!Zv0OZfaTv<+JA!A2$w_MVe#BdB z^xR5WR#Ymx94$&;s(i8}vnTUd=0SA^#j7(YOXi*}gn`E*IcHfU$9~N(zT9}IV?=vo z7;D3O|NI6@2g-A{^46SnY<{%IJW~A87Bq$Jtv#qN z^ti;@dVFmY?8w}s=6akHoBcp~V*QVvyeC(f@J4-8qh`IOslL4ta}h1|?Vg1Fk>JM( zx3tR+|A7Z^{scwlN8SKdXBohuqFm3Y%wzQ*WFDE&QvVAMOrLeEHGB2GAP zd$TlZ`=fxR-MC5+mKoGWvP&C3_-*R%BHow2Sxd{LG_X`ESj#n~gnoX0(#C`Y!S;I6 zFoE?&Y_BDXb|L(r9!OxV;e{UYDdi)JWq;GTM9UFvX^O71w_ZrVF|!p1J5bTE$_Y&b zqPM*~#<*sEN|(I^KfZ7_U}HxB$EjV7!kLZRNzY^+tY6}A&@W;%vjcaA4$7a^yNT1X z|K$cj5Feif55)-99!E!KmtIe?bqI>JYboM4*HOe-KoVAYSHHG)3Db7<@&9zbi;cmT~Ejljh~ljDJA5~V{M zD5EG@0kaWH8U3ZK#MdkJZt1+zK7GKcAQ>W0IE-{;;7c*mHlhvmhTOoE0LD(6sbgv8?y6n1fUABb`zqr z|9vVxZjr`J{R{=9X^J*M${0izA)I~c)~vw8+by4lFgDsaPi5~zLHPz^q$|-zgOOr& zO#NrnA>F8GlccMrJ_YWPhERaDnN8X`A`Y=YVz|u4rRw$JUrm@{+S>jYVfNlTPe{UF z7XIG5XP&?y9fI|n{7d*InXHN5D3@jPqJNqvRN(Ic{GG*L4)EZ(*uKfXgs;t%__aCA z43@9W_>aj!Xjqv}bogKRBbsn}SibI`@O2q1316Ed@gI_dD)|OAnbu?T<|3Rsea}~> zoVUSDI@wwAv0eDFqCo@V${J!nK992>=OIO={dkaqhW+>!f@1BJ6k*tpXQ55R+DGsl zVn23LB~TCxzsnWGOuSZQgeAvHgSDECVo`u3ntIFhM_w^$zpX>!ay~_TYz&nebazDi5O)2H?A*>2%Ktj@hx3!YN5#iJ!FOiQc9avs56rYv2VCED z!aCv$!$YnrB4@Ye}za(cjr2QGtA!{vG#d_6leZA z5JOGT9^l;Fju&x>VFDi|6Zive0y}RcIAs0A#~I3qwY%{&EMO7r6t{qj$pYSGkaqxh z5G4NP{cz3IQ3Pig2ujJ=cPd)Cy{Fgx8S^DDm#;N(l;Qtgn@V)}3;u{EoE~3m?f&nysoVOl#W?YBl^~Sh;=U9bZYeEE!OoJ> zo}*Xq@zorE6r;d0cCMyLvJDf+=4$sR>AI1VX~;4LK!#^@xwbI zNg*hrIe2fc#*lj_%~#+y2p29UNtuFhtBqzY@LO1C=!Ji6wseGM-;0p(V}H6XV#hM& z<+F`*aivW*#hJe~xRK3x023Mf*L2`(?{DgK)O>_w0n-*&ukbN z@JpL9P0=Gws5uuwwl!nsgm(%~K`;j5-dQ|dwpzZ3ICs8-nTCLy?PqUk4-O1qn5(__ z=>?tR!Eulu8&pl3X+mj;ZS3L=#+4PW*Qn8_e`!$dBAO9hHMi}nY5G@djHc^SpeZvO zm(}c|u4}n0%1h@fSeSLlnY!G`&~+i3Is+fjgG2mM{|Wj?K(eI>wtYN;28r}rSYn&$viDNmNt#2 zVO}SHJRXG;!VWd;xQl`w3R>^-Z$BaUy}PeII9FZbu}TT^W5h2TDg_&f`tvMt)E}D8 zrDP(~Gx`i7{RKq2YlZjl+PG$2MzlUl1VJ1xhZow7fHhtC8i^irA)?$nU{jmT!s2!Xl+Ck>4#NbbJeUDa)naeU4>%Q=P#nq z8*(98ewLDt7jx&}iD}j;eoT5!+g?qcRU-_*Eo{a#lz}8oKK*>D|9Smz7(v#Dsw{mq zx&Sz0cqN|UT+igvLam&u4m+kdCYMwN1tBM3DJg;75*mwicRC=!;oVB88GHv|F26di z8~VGrP#xEWx9;u+HMDXJ$9inHfx>o9ENPLqMREshXnPmZc^twT!bUc$bejpOZrmBb zX|oYDU?yl&lLX;K>-JFy2NJZK=(lc10NOB={{-br@K1LyC5p~?2h^vznWBIdXs?@x z#H~d5HX9M1pnL(~$tiL;?Z>vHmfLf@3V^H^VsQTfp)V%=% z00mJri*tm0CD0)*F+QbJktCxRjZV#MT;bhYSt0(EtPAmB%Vwo3HM0>MNF!3}MLYf+ z_;VH(q5=dwM*9$QHBdvKgCE8(4D|!AQZ}^@FPya`&MRZt9wI~vHJVuKa5R6OQ9Jb* z`r26x$W^Jx1Wtv<9;O)mlX&BF9EMV5b1#&@x388W<5Y9AfSrFweWhR>$EwbK?5y7pxM#pm#rlyRl(I^r1Hy}m+php%?P_=p+F{U=Qi75v2HeGgzl&(sRZ>cc$wgWO zCb5B}7s3=;1F<)(J!YYKV>kOeQaP0R#^T>*BVnU| z#?5jDp*em^*K$I!2Wi`c<^%!!llB6r2PRpFKVq9D_*=?N3KG+U7$nycn|baT4z~{i zFTgRwdrBjSi1##MJbzCQPU7#G!Yuxtl{1sSbA-G3J6HG@{>~SUW6Crgn@@KaRXv2I zFfFr!?1UYCmyCg(`xbOpWVrE$KgpInkyf^yhU#25S#dEU@%a*u9gZiOIZ1g8mUp4Y z>aY|Q10P2kvZ4vD)?CkcJ08~vc%&!lZaY|Ng|ch8X_&XnKt;a#-NEC-gJ*}=r`(E9 z+1AsPD37n-AN(j8H~Y|Mf-HI*vmEj@hQ>*d$Lu7wd@<3tJr!^5-ScpiS}R*Jdty<| zW>h?b$0@c#wDzkNTb94gMk-Q(8&0ZisBS9)27|h-1l6?wUR1T2?ekRy+p%QVqq}E9 zezuTSeJ)YXdM-hlv1JxM>fK&E8#}DY&9tOQBJniIwq^l5Q%0aU|9Wmf=Pl;oboVR( zgNJ@^Q~_r;kjjNNNb+wbd|3)T>)iy3eli>8U@PUQdm`a9UfNGlk0~nBNN(Ru){cxE z6wM$i<^A)GyT=*ro?#r>NMdG>4~^hmbPJ$`dMYIs%mZ`-bzhr}R!b=qbJLVAEEtx7 zbL^Qqo(^?`$BMU;c!}fkoLwG)wN^9&T;yu0x(DPnh-)wpcts4+LLqOSw@q4*#dFJd z6MGg_QOQ7h6?G<>Jela&D39S_46p`qIdB7_U(F_B8eqiQt$@wk6cgN&fPob1^3`#^ zt$&Q5*6;U-jVG;soik3I`*!p%b5pfXXCcTNahJ*?h{J~m&kg?yhW{#xcJvMC-rg^v zs7V-N6y6q747h&x!8$m~cG{tJ3#+#LE>GC8^n+Ys`$9Za$&;$x20>@zmZK<}NbARaW#>)jhw>6L=~8knwt#4D60+C|y(){O`OWfIfryk1xFRMiiz@D9m5)vg{3D z0vIP`;!vWv9Z?Vmxng)t0Bx`}d$2ly)jHgm!zZXtcxgk<2qv zha?= zw_j42vQuGtv+P;%Eq{&*KM}?J0vxgUmQ!{rOmCK*6JIzOSGe(#!jzo~)0<`260Z%? zyeh7+a!FyzPKD{svg_gt&x|WP|B}L#oeI;NWp9cvoEBGj_$7rYI~Ark%ibJcxc|MO z1ltFeizgUmr^58cm@K}q7FYPkmlUS#RG8i@TL8}tA=o={g^MpKOxdY0y;-(3zHnn) zVfQ74DLWOWcY_^|9lt?|Le3hRpGcJApx7r7Tf}3xQZDUoN^%W-@=A(#%p`b}RqH^~R!V6|{gB|L z$KbV6p_DYl?r;pkqg>ka9Ns3(2yXAkK(%;B7oJ-wtG1coQA&f*Nbq>)bRbz<$KlmM zZ8x^gi&xh~`IIB8-4?9CcZ~s=xtC8i}v3f{`#%KnulMH%FI(5!+WGLFc z1W)aED8Sqs2v7Ph-mwtRt&~f95=mPrg@#n{nPbiiY-~*zDbdWv60E|q17+JWqbuxu z2*%8q(%t?Lz7d>$`gt&>s~9fGt8j>+MIAJ}D+(k8gyJf|59)454*4eRRZkiq%2Qdb zhlZR`hmJBs>js1p4Cd^}#=0Rx4ghmenI0*rja+r$hjA+5(`=89^J=;r_y%^R>^Jbo z;k#UnWm-6Qs!)9Tm*jDAbh*c$1B4fP(lM35@dd8HKdqSXEsV$aC65PSQXXH4`!FKCTTY`f$U*VaNJ6ZeY%_65WL6_A$r&Bq6RcO z@Nqz^$RGSR9Gsdir_sJk+jaVvgUy*$%sU_*RlC4uPDj+(MI*i4x=eV1bG;`j!4bBgV1Xp9Cn-iQR*u*d@0_}IIcl|2y{#NI6@Gek~*Xn zRphcod*%>v5FuI2rV8ML!hlefBqU<6TSZNlf<;&I7rG^q$4o<%e;F(}p#p=RFSg+&+DyM*dBnfhI-GhnSE_bp&WM)LFi zQI(Rr$15fO@E=tvxrw||@+<#Qm6ChODL_$#*^d{NKt*pSiz%M`$!I(|lZd~K;$z+<;E?Bt z_-iPh9Li{ZavKp(`_Q=`$z4k1Cnpl|pTiOldXb1Hj}h@lD4rZi?lK~t+(pE{M)Bk? zN8`yyMEtK1Z>*kh*AXix3x!1PSr+k#KmzwLwMVIZ%!veCaurejKE!hmlGa>=#9|%} zBnS{~&f7ZN#Op1EgP$RhxoTu^Ny!6tu_yN`fPt|MTNK>VN|)AD!wi{ybgE~A>J z#8i`;oB()+o4E7Ap5T5YToLjji^#%bAwejCndgcM&>&Q#sOYM`6_vPHAnH6iqRu1t zZ@K?i>SHI_(RlZkJC59MbPmz0rfwrg1yy~G^C(Xxj}a|PEh;H4gsTOLUuGDl zT||AfrnH0`1!~72t(_*V4Nf2z-5f;xpZCvSy_|nucCjlP^Up6w<}1NW4C zE1uHu&!hf0@e8<)yXA0m*?X)LbfoMgm3(YOr#*Ntz^hEV#KkNnufQNYykBCFuXHgD zwudtsWqcTC6o7|Iqos?C@}ML(8$S8}|Hco0=XmoQ>W}cI*r+pL#nNmX6{920!Exr` zz{co)$eR`YfBEsSb8sv%jSt75kzx`?<6*1?C&q>j=6G1X5^BLgW64xfZ-av_js#UU zbU2Rn*_9CXGPraucB)E%{mDG0yPX(HF)j3|`hX`*8ppEV$9I(m2`$B%a(mS~Mri9a zte&v!{CQB^G>W<#X3M7^sd@>?_?%~a2K2%zS_<-EY?h7{*<;e34O9?oK{>vv?kBKi z^bl72HqnA42Q%L&$F$62p-e-bbO@drZrjeJ471K&e4Yc$lUL2GH*a!I0tkikl_BF4N z$4Zo4Wa0wl22lt#E|W$Tw%G`M`iD6P5JuUxa*(7oU391e>hmSflL%yf>iuh(Si2Em zfSU_-I0~!w-vesCfCoO)A?ifMKJSGM)N`ab9T;>XmDx)R^&$uBqiFBzQWCS{+wQ$k zJ(0TD`?^?r9pExJ(8cx@m3+@>Ma?d%zu74;pM5)ROy;u_X;_a;VvDTk<|)KCB_P;j zHs4W<4^Ln+zGeYrYH?{PP?`*Nlf&$Rq^d?>K`4Y8H{5F?QC_GCH>1*aY_URD-o@*{ z7PWMC97t3Sg4h>c-lXo=BLX<#DEsTj42q1i;{T+d2WE7snO4^HdtxxayvlY{bp5YR!7kszJZ zk4clO>^w4+G&g-?xmR}!(CNl3V%0q;6~K|8I|BkXa9f(H(x05ixj$?T(tk(ewnGK~ zM89~|d%WpnlIos?0=k>_fMo93x*Q*%B;6J*-Nf7k3>#T!CId_cCE=^0R_X412thB- z(d7U&tNciVQBJC0DO7~bNHZlja0PZLKw7TBHU`?=5fEtWh=C(I@Ct0HfwXq6-~b@c zx|=p+uoQv^n@!s#+HCYe|2RcpNO&aSLH}3^h2S~u!R8R0-h3b`F-liDaJH6Z>SbkR z0K5;yXzf20R4&2RZ#yH5)vsf5fz|82W(V5yvg`qy^G_*u%lb6l)W(tK6rh z;n}bfRbkpOpJTF>zKjLXhAP5gkGBn!W2dl})5Y3Zj?>$=l@jQj=>vG1_|w9mGLRsD zJCLr81XP@_+GRzVIc#(wT^+;b+12@0b)#L~=ukI0)r~G*t-Afp)o z4|D!4$voz55o-^EFg_D~T21He#crZWY_*eN7o$FfI)d6-q@6|>G-9pZ(?;u$@q+3& zB7w2QYv2u}mjmgnan!$3Ny8xLl#~Rnz(9Y<7B$HmhqdXWH*A{!(q^@Xr5PG;<=Si6$e zsQ%z2v31WxY4&!;8^&2497d3bHPHAm@~z;x1qkzniK~O>3K6DpVnpPx;JG5n)<6Tq zrjC)U`+(-%y>2Ad76FZ%A_WJK36>ak-MQ_WP^2jA`pJQhA|t|9HSC&W?0)=+Jx?e= z#7|mSb5-5a1R~SA;43cF_9298v7ija z+8=@aIhR2|LX9K^+0@Mj$&NHo&!ID{nLUvdqnp`kN5+GW`6f+?qeDGn=!aBt>MZ0A zKk&~2RPjS51nh%GBvu%mIQ@brCdwVmXJw1*83%A6lFwdhdw~R$K^A2|qW9$5MC?J_ zXlHL&X0ub7BKT1P zgOE3ABL_tU_*%0IDrjwBSC4YPq|+Lp<@fpD~(S}D*}`V!=OQN@154^}akM%F08MnQ?v++Y!E zv8z5*7p==pb#c&h3swFB70(R_SNDg=IV;v~HmWn|86_lbb~&Q`>em-^lSo6Q;&Mdg zBIkXpDhDO6KG^%7>Lx9$A8H_V18Ew^QvkCBFxzYti>9FqsHQ_vO<+0`c)^R{HMh;@ zOE#wAF-0>CZRDw{A!#$H0}W+c*}`&+v>aq&DO?gCbQ&3>SqOfaSwWmh7T#6z1Mwtdl@cR2<^c%%1;|xSfSDKxvI~>`%7IN*YKfveOlIa z993flZ)g(l1nf68?13-y82iH80&Rv18^Vxi?_TkTA-uOuz((NAgT1Fp%Sx)wpfllM zH}#&tCf^O7$=Y&i-fo7&anQNxN;7uNDTj5y!OSXPdDhzr&T=Z2Lb|9Ps%n47!0rQ` zJ)PE|_dN8H)9_wQdXt7WRFwC$0Wg;nYfO8ssX< zXKkQ&p%z9SlF$}4Nv!=h&VPtkE1g65%iAK4QY#%pSt~MzHgKju^n0qs7HzjM#F<&j3%lQK@G|x zPJEnBX09RHK29eykvEM^9W-w5a<)JV$+%rcj5$~1WZe&c5v2`ulc62q7;$g!G`zh& z^7dMy-X3>#h9F5Qu^##=9q5}KBF!@u;sWmNRoaQbl}@$N#kgKFw9;H(k*TKKm-F|^ zv>#671nImUl$*Pa9GMhJgah` zc?zpG{}-PpTM5@av$19uwtFftm3gz0P-S-^b?n27SEC3_- z@%{lldp)$j_&7~HNmpdMAXw4}^9-v6aX4i#l_JGjvcXfYf#nx#UqVpPa>Y;>H3!le z=8mx=?x#3(yFC+0TI3Ie0Y+}O_I`MEPhf*`VxU-Qy>W*FiN1gZxji%>%AG7|TSzKj zmxpKStgUk{!1>u*;fE6ZO6QF`HXysd7YB|q_AAH5Vx?&chk!Ex8)hy5kjdfP4KoV? zQ2X{!DE%mA=|cq@re7~CU~PW&feq6;$;k*fO;k_r9-y7L)2o7rEi#b46-d)SiPzy7 zKysSWcw-@;_XDlYXOR;md*N+tqU}>Yw|Os!KdMJunRez{q?lvjN6NxJ8{4a?s37xG zMNim4HBeQoZR0h;4cF+y!wYoTP0gP^l@e~b4| zI1mAj8pqxueTNbIbdqHJcy$T?b#Ki1AcJvu_%YySD~5_D z8bDcSAg0GaVFP#=h%eOLK^`iRu7&i}BCNaX4E}!nmlxrNiF&jqmVV#G=|GAyKr|L! zoW!MY@PY9K(Um5|PhyY?;$wy+HN-Ch;(K_dD|4_Pe3bax!{O;KTh7fna3Wv+jE4QJ z^{I^J1AX4Ujfoipe8M2JC*yTXU*^GZp3Z2RWdlqKT$xZ~_4v?1v9<|~zU3GWr`=t9 zOm@STj|w$zOj(d0`LKTM9D*46m>j0CYo_-=^|;=n-m{o7dK=8dJq>&}Rf{`_a*;6< zNukVx@63dHt52Y2%^EI`^h%y7)$2H*slt5z zRfW5MmdgU@;%|d8Inaj&j%RO%O9uSx20zR4tJnM0+v#UzPA2Bd5mHTAjoT3r#KafX4^@W~j>h+3Us9;1i@X+tmX&$w^CsYz8TF zjD<4~X71rxv?WN(%BDje@`y71uo0C0syUwKihUwW;hNnY)9giDvty7>eNC*i@H`BbI(~Kg{b|A7L9o|U^<~nNs0#Zj0-|<@< zr~|j(kB2tQH zTBLlQ=smsuW6pRPhb&)&t+y6xAEcpdAM_Zwcv^U2h2SePS3+PIrm(lU?$v@olXaJA z_aQgs?Gb-`4!9aBdF$`Vj*ty0g$aQLG12QY(c6oGv4P%sI?%T6=J1m00TL(T7(cU{ zsQ!LZ6jdjQ!eXT}5zY!i>yJcHJ{Pv$QK;QOD4Uu*8(GuK!b=K-VrU9lD#L_~VSqU1 zWOtzGS9APJv|n8v!=HAU8u)+w67cVXAi6+Xq4!T$>!r$H29&lN{jAroe0HOsnx>o( zmDVX{%i7JBoyq_v8WH}3bu)m8C%mNmGA%pCy)5bk-m<%?WgiS}*}Ina!q%$`wL$|u z@CzhKtbGTHfuNRzUH8+}Dm9PpSU^ju|B>ZK--Su_E8fXs=w2S$FmC{NK$RjK{%)eL z6f!+;0Nhh3nHARTFF?M0lFP7N|SX+rn`;v{HxgO%K|R)Cd0C06=~3s=To z%c-#I)?)2{;Q9=rhBfr5So;>?j&}Hz#>B8=X%Tpq_YN`Do4jj^%K{c|#kGUz3f5gp zPP=9U5QD>h#0(Ir(VhucCDNpK+C?}&0P}Yd&IQ;UmJZR-?wuIrsTj^tUNYGKL)?64 z;*6WLptEsXUU{*J?6x2%1miyonm0Y8nIl_R1hm^Qln}cswx~CMiU}q-iCDiow=m?J8u$9PzA7%q^AqN~h~VDcb%(#*aA9qA=ZtWgG=miapxkriyU{}zVPB?&C$pm%tmi3UC%~UNH^{v zUjg>KyA_@lE|6Me)Ba3BUozWUrtN5fhj7@?n7?Sz^%8A8&by#>orggPY6>cFbxwit zFlt$ptUdc02@j@f-;UNI);@>aJIEcyVb~vX@HV>p>JeUPG6*`wr!AtojzrdRK-=jG z7HydU>Y(>X6qI!D4nFJgwswb!FfV(BQTBGDEYyaeT|;FtIWnZNlXj5LjK*3_6i~KI zJKQ|j#vRQlM2k&^FSE?>LMq^Ebo~5+&fI;NUubw0zKvluy!+|29}Y88JWHVjZRn#hf&(B8qm9tZ^@gd*St27R$4=D-H4B4u*Brc-y z(-lw~(_}|0&hzsNi!fUa%kQebIsCnZMGvKiU2FX;8AYb8rGi=O@w?>HVC?I}1&cyG z)gRXlTftt(Fa^a76OKR>Q{%04ZD6$?LXa@;G`t8R&B76_4@A;=cx^+cY@+bTKz+0%rz$^PstjIkD= zbml=nqHm&T@v&P89Fo>wS)V7&oiYst>vCPQj2ckxV{!@UCL$gKR&Y~cz{D&(V6MVK z$Z3dk<{m`LQ;{i=ss`va=^X4;06T|+4No6cmpgqBatCgC%+Azn8|95i;-0CuwK}&hfUi=2~Y78+xLx zj%#qD(O@D0$h}ICSDNj{Ng4Em*#}o}LQECpVXq-Seh7@t(NMn;*%X6T=Jh_eV3YJr3_BvG=H7A!Z4MkRL1_UN}nM2E#9G91-^ESgSkGahKc| z+EZ<32YTOwe|nF1clC07Tf&Yxp`MM`hc~3nVoiTYMvVzryztKW!i(h7C^-$uKmL;B@XvH$ z7f5J|3~&0_j(q~9C@@oZzm!8mJG#H>r%mJ#)wED6U`&@|(Hq{wAL%pH81(?e+JDD4 z5~eY5vv;?sJc#d_3zTb3IpS!^JPo@6(1;klaITxv2*uKn#bas5U0aXS@^Q97GP<}1 z1%kkR$2}k#v$I6N4$<=QABhMk$=#+i2!}UKc?K_&fMjy&6PixgEv+EoDcnxRPpCF^ zifB!$WYsY<>CYB|Ch=+i_#_}Vg^&w)aQdBW`YsRwx@|hmHf%tAdXe^@+zTR)(Z=1h zfJ2*(n+ITu(ZK0+a{~7Ob1aR8+SO(P&0cgDVZeP47(%@bh(2o|%9{|6D0-K?KXrk% z_Y|}KbTv&;V&ZHT523lP9Od;JNC|iT7;}8UD;2bW)ZNheD88`^!?T{21k&N^Otu_A zIv>M&nKK;MjIla?B0i%Ty982cKf_~TS2Jtfxe~d;u7m6x=Gl9iK2PN9q4yvBJ@h87s{ z?-tl+%DaMj?+lnYO*x(vWlN=r&h)zgOkij0_xdv%gU7}C19gyA_|o;w_2>@eBQdiX zmrH$Q!?njB4YR<^fbaZGnl*DjqvZuBF6+Sd+&ahYTt~9Q+O&}zYd~I*&%PkRk)KA7 z(K+B$qt|wl6xJUghuxXe)M;HLe*ymxPyjoXPv)uCEN}@v(~JbeyLV+7b-b(X1JVl? zQG0M5OuKz_^3}Q!B;7tz%0X^ z1nN}EEsd&A`8nd%sqf>fr^$|;6*DOKT%vSE1JPHV+JVpi1nxmfqmO{SY71VvdkGdN zS;{jA*PPY$JA`$%?euCop3HZ|wAr3S(u;RG_{JDZ%{dCL#|9aS-a_b<)Q_XuQQ7pK z7Q1wlfd+fM5O)z^;2~&xcEDNZ*LCpx$h1sO^YlJVg(Kw+gpGkO94q{YSfus2Bx#t# z&eL&k0H$=jZ%NkYtdbLTIMk_hT3?+?C-o6O7V&P+d37q?=fR6K(ET2`i-l8;&7k&E zx!zW4zC<&JIIZX|^tL2*y_eV_w`SBo7C+)DMvbCTjFyphk0jmqQKl zS0R23ey17ec+MAb00x@0*@uV^{lAo`KVv$cz3ru?S2tD_zKVNvAtJN4zJMHbdk@_R zzx5q_@UEN zG3IU3lCix4X{afY*NJ_?xQC`4xuPqThF%6ITgzy+VLtfJYa=|w(7PaINmU~)$r{&4 z5Cd@MZ(z4ae44)M+k0%(!HJTWxZ+kdn+VR@VqEdNZJ;sb;QTPv)63!U9yD(}Xm$yl zIofPgl>Wi~{1FWDhf5eFt`~+}e2@5X=!LOhknD>Ygx{QEHewcNxB~TgZA1YvR1P~; zwI$ZR1|nq}PczUELmwjG(`cjGR^l+$&H07XAdcJGzKq)jDe<4L#Bp2YAiLfD)$A7E z(D7*KRTr@vZ?tho3~vJnIN4CS{C8eBGpTOkrmYt-Q^cm-izY^S%2=xZn>or&oXrWz zS!=LkV@99rJEaRw5-uSkO5#3u5Y?DJjcpzB%!=(C8apetaR?X9@~uPWzM(KS@$ozC zj>D3E0T;_rR@{Ue*bE6FxxvJTlcoHILQ6cZjJAMq^&8x76%}gphEr=@=<_1T9KB$q zJ|v5fP4uy}^ASHbHthuwmnvry*4b;$lIyw7-rEF91+jKHm1LExTVD%HCJ`?m;R^0(kBwXhccil;XqKHNZ}j4PF9qKELE0`YI-;*E-g z1`-3r-ZDf8v?4f-oY~Dt5*nV77o`%s=nDw6*~l=_zffbPgxyi3e&E3uqOzE)#&Plu zt>JTAS8GZVnkAYldl+}LE-yzmo)%Lol`qAKk~{`#g~XUEUxWMTR-P{tt5no_+3R4S zN3MlL#)q?ud_b9La+=* z0odG0J2C2y8ZA3g?&D;&`wKq;GjeG*#F+D#I)lX91i;N~ zo#~|+WJw{TY&YDl$S9UVju7TucW)(A3#Va_QX~F*2&Kpo;%-~iGSSCn9HDq3Tx6N3 zjLHdOSSAC@ccc6?#^*CVlE7?afWUC?ha6d*g+t4s zp~?#D3iK-6a%x-@r@J=+f|AWkiJ`|pE8`5Fx%f68`;8hco_+$yq`@GlDi z2?sdXpDSA6BGK$UFBLa~j}^8$f{kko3A%heB5Dx<`)~zUOL1VZGl-31i99QLU9@r^ zL~iVS8PKIX+`dSM{rqitU5TVAH&BwB;QH0P&%$|K0Vht!g$wY5E=4}Iv|D#SgdCa2 zP`gijqD6O0_|)C2@ieMsEhhdk)z1U^r1vpVp--}7O;exb;LmCNIh{X00h8&II{0%p zf9~SXSNZb^s$|lWc;c>D{x5hoXRSMUHhpc9_{-))9W87>4aTlH^bvjoHuGQ$4QVlS zma+rGwHjO|=F@H(EePeI#&T)2uTU$%2U2z;1&ha(EeOAgaJdgNDl_`J$iLi%VRL1R zKBMqI@C9HR+*hF-w~pf?u8#E+5M|Y{lnAPq%VV-~J$A{-<93fT;y%P^pJU;j@jxeT zHC%r!D(OLI`?Padum}uieOkUzKc*k8tSyp;p}r-MP^q+v%8BkFsJsMJu#qp?^o!g7 zzxE$G*}`D;sr{PK{(U8Ipj{(yR}~E;5q8i{IK1t6B5R}&18`cBfww}j2RaWNJ8<$q z`-naAncmZEckfD%>nC_PEeF<&^di%GJKo5+&Ypqc?A7GP;0td@?|Z%N%6q~x%u)`) zu*3(jsU`w0gq<9Lc7z;2;ZS4_N5Dlh7!-FA0^O)P6*D>Nz$5;c z&H;yx$=4$9G|3uBj*RlNVgBrgu3fJPr(9yD}R67L80=f`| zA_YAy)}2s(kILhFS`y^htVQWal!n(-_d^7N>xV=4+>j;rubZU#unLVVZNdbkNT{V> zhkM!LNi=@w$)q*K8c!!h9&N45nstm zo|xy@Lvx5$w%f1F6eRncIesNeko&;GcAuZ!;#Y5;GiUBxKg9S{C838iFF+8Q^-hqY zP|efSybjIsEo_MCQ1d)}wU9Ng9bYW_1%#!MIFuI{t^EX3J>`LfWkfOU8d6cm z$}#cdl#-G7E+s}R$jRrWK;S4L{kW$bj6I@pPm7XGClLMN9uC&HS}vNHfP@)XdK)kv9{tF-2;$(rj0WJPvrELUGe?Q4W=gKc?Ak zRNVOsyjg|4<~;e@)svO%O&S(fH#!1|C0ad(3FYOH5e>vw_12{j0kDUawM4$l+!TlN z0e#@M-95Q?B?O7tlEGf~x{Bcjvke#ODnJ@A8(0p^W+7&?$5F})?!e(6NXLKDw)!OT zWe7zIo)^TI3;MChGNK6*5#ueN!Bh|$aM@g-ZfWG4M|H?OH%q zptrsEJ*Ay)_Hmipd(uWU8fmG6X=$`lX_}Q(Djzc|PSdQk!vN4tB;4p6h#WY|?bntH)4ovC0WCOe=LMwV!Pipp&4B&D6HD+3+k<44hHa11`cEI^6I zuy|Oml5#8;Yx$x!_Z`;H^_3KA51YqJBTvtD~I^5a6&wML zdQQ(l7ZFH#oRUr6lOVZ#+J9qv6g4Y^tNQg$T-b@dz!1v{u2Hd#%a1|J2)}nB{3vTq zPUKUH%D@-j8{B(fViRZjYNtTlRMDarI9aI!RziZ|Oz=ZqM*6*p@^DhXNRv;BuOx`C zBxf{LV5A0L&`~D-7R#<6Is0&ZN*pnGN36fyJC5A6_2baILOXTF5~vXFr9F*Lh!7f- z;S1QKtt6+6w{k+Xm1BL{Uig)0rR0kICkTT5BG@X8qP(ea%p!eUa&fb3xS$IcW8Z@K5=apA`@Im2)>qDR?fIhN0wglw_qY6oOmA3k~N*EQceXvr_DNm2NiU zQReK8yv&U#Ly=Uu(ws;&Ve_5wP38Pbx=>lcO^M-6VVPR3=-1roAV6P2`I?D-<&fTaRvEfoJ=#M0Y=OjX8V2r^BI5}_>P*4VdZqKT4O4Bmh*ly+cfcLGnNe496 z9hFC(`Bc26%b%~POuR=$**{pVqn9n9fS$a4{%JNwh(&2+qR}EtHSkF;9S~X z$Q{dbT?8)GdtUOhrVKbZLlEhX*me>kK3(oF(|&@Igo2v3K5{#JFr2uaj3RNU$4Zoy zX!n}=70+7K2ptQfiXPzZ5@#_-iL$B>!$gC&0stnle#*xg}sP)L!l3)=V_L zrk7jlt#gzPzG_@Qetu+s@cdMiGTmNV@O*}xgm^@OIGC8wk?i#jBMLzVlh!xtHAHTcT|p0WN!IXja&&)f3x5 zue-#ZErr@cq>#}qaFq+3Yj0(8pW!Q?S>uu&Q5<5<@^JCDvXi{!K5&Je*I%F7xf0q8 zU9K1OvkC_`4r4%o^ZR*rxUD5(is_>?N!nJ_hI`-n6d-5k;1;lRntk~sq_dX@c6Y|8N1o8Py#!SjR!f_!j^rYA6yt#;QaVHb`(;E1~h*0 zU%f{yd$Da(cAS2;em;I5?DhrvdaGo;^UmG_tZ7;03S$5P4QVR$>oEp*`I*=6JbM6B9IrZag_RA|1%)fsN%U5_ zmIAuEO4Hp>!a(7~!aJ(_85m){xda*1lr8vbI*xO?YRb;v`xB%jc#rQyEP>>ug}VH69|kkeAWNaP?mp~Z%G*+? zokVe#*9B@1R|}pjEYkMjXg+3N7+NMjslAV6CA$k%Cdf9;l?8lgJ|-7|D$=T`5^g)q z*2FS>KGV!}4KkIRxt>6+u*(5~CUB~#!!gMTgf}4`2W)93NOEg010tv(Mos@_q=NO} z$zz6Rh5*a0&*(;d`eA)Whxy)bzF**PJ{*Kv@F}xGzd?);p3dL$?6N?r_OG8piI5`) zLXXlsP$}hjzkxS)yOfv7$;Oou>g-68HW7I#6~3QPzCyp%SO_&tFDlRtxWZVs9VXKCBo2>&+5JFhm(m)AeN3ekkgdKI>rnNL* zW6daZ)SMHLY0WUD(G}4^3vP5=hD!#AYmSqBffMQM+x<#&e_7LKB2FXyp#T0obS=%@ zYIT2jQ$j8&_KGuVK{s=Z#%1+tL7)6+(^+fajyqSV1rG1q>nv(DE;%1<^)4K3m-AVH zL&0=k+G{{9c`ob=hK&B+h^e|4j zjK;C;(N>iQacp|D-BQt~K5Pdv?0l1MU99MLtg{5}SiuVVmE*vxOAKuRh>X&H#BdDN z(!M*t?R^7iuCu9dL*KAe^t1B-K*hc1u)uxJ`?mC5R?x?atlpv_*zW+K;GvTow}aO% z8N_}R$KFhiVt?@3C*rU#vT~4icBfUn%LrT9op$vuIDvgib(bIy&#HD9zxlxmy2FmM z(VP@UHWd)=vZ_UPJiT|>zrX9iAGwo@a7~7kBU!BUiZ<-_hQw<#-RD$w1V+ZuKg4`RIP#E{4E1_-z!h6D{rk z2_G!w6MW%XZm?$4anX|R_=6Cny^1+-(Mcseg)5@&d!oqw7obDYXEb=1WMT%7zI z$e(9q$ae-Go(GyJ_gDvbjPj6Ommi>^%4&yxgh%PCasN+LuxZYhGd+H+g;?Gi#HJ^< zn`g|}jUAy~Md5rG7Hx05mDCe?jd}_RiPuJLT4zx-oS>(oY6=Mx_s_Rdk~)K$Iq09c zhE#(U1Z%J?JnJ#?8z39`S1QN5As1k^JHhhRBbB%GL!T)HeYz^2i8#UJ~1UbPAuq~I56UEO!u|8ycPXOSo0UW<%ijO-ge67j>~34w#W%@ zyIhV;Yey-M*aaB>78i0xKBaQkMa!k|G@k!6I?7)HBv+oL*;V>!>soXR;}E$zoC-A$XR+t`N9xlw#?V@A~K+=-=q6Xi2B^%&02 z9dVe+XD}i5lUn45--Se_$;t*MW{o%^bu!518=1PHT%wAl;0#*`xNpfRW;KCyRI(zp zXM^p)@dc4yh73#2T3K=i^v@~io~8jSHn!if5rSXo?GX znbzJzYDL$?<#o9#{su%DtZruoUDu9?+&ok+c;4_P&Y``Bt{podqL@6w%zU>MEP`?n z;2&6(>OO(A5+wTvb|@rc3V<-(aLO8XoKk-PslP;oSJp2~vMK`*;Str>4>Sd+3yeKNR!ykcC=?}lku|@Pw&^vhOv*EWv?a=sK zO;#6<>IceDY;w2dKzLCCMcvYm{$V3Sd%_PVsI%p(yyJ-FN^jo_z_dElp(z#aEDl6m`fxON)1ZSd4{>}rlx zX|&%3@|+J?oBkqN9(HgygCF-WaUll_65aVfLGAFr3ahc->D>BR;RQ}5zfV`{y0Bpp zKPlXgS6fbhH(nrNUH|9!p|^Z%TTnv;McT+{hx5BJT4}>5A-vdO>jMu55>_CaI>#Qq z%YkcI)HzmV=G@$wZ;wcM^k*_K=m^mG7n$v58)uS&lr{UbqxdxTrj=w02yVyIdpD=BsqMJKl4M;A3X{V!M8(;MXAM&LEut_ofDTbDM=s67*04$8 zMMEf@=Tt3fZYnJZ85(K{21b}H5NULw@28nPD|!8JczxPBq8Y}E7!%pIt;XD;*Dg(f zu+PtKKbb3RIHjB&y=H=P*0X+`HWyjjgcLk0TQm%w1m^gwgc6miy`|>ttB6?Rt~vV# z-s@8|EDj?x&5|H9z1oB^#>Z*Q)uVzI?IaI4%%Nc4mkk9|jiF$}QnZ3@4wGkx^FG1a zRwb@uL>Y{_HbCdmxPnBrLi-r{C-)9PkS88Jn*?9Bd8NF6wEx9*+UDAm{Gi5 zmpd?*M#x~jFbWkQ5#z!gf3n?ZEp6utui6Lic%@1m67$KnStnxH`d6sc;HodMB+M$h zFni|6?7>_l2E90ah2bpjm%@w|VD!)o+Mlsyo-fDVPT*lUF)IW@Xy=iq92Y3Qhc~U` z4lC43jj2x1dZZaM4>9GD&-}_Alf=-+m{1R{is0`g{?6gA4}YiecOIkYS5>)Pl|NDC zci{20=AFfCUgLrV;w!iLu~SW#^P;m|qgiXf%5QeT4nq7O7uKpq8?$??l}Ga#KAI@I zg5{mj^WK5Q4Cl_@kNLI8eagV1M{}fmlz|(h>B_)-$)^n5DJ3fd3+1eVyt9!7G=F<5 z4xlNITBnB>SmlX&UZb*Vx1g-rhk5YGw+8agMJ6Z%RnnEpzynlpy<{K2)YM3n9>_Z% zNg60PJ5X>w2q#CZosF?=u=<>U5gyzGh+W<`rO}F2ZkE#zPT{oY&EM<*jsO;Co;V=>}!sI}#@MAAzLGc3QyI)`Oy0s-up{>(}z| z#oEi^da;6c;K?K_)n|aluOVK_!1u);e+z6aU?6l!zxFf0F;G>i-w|ku{Y(Xv`Nm;wc|6e5rpw=c zO(!Wc*Cw5CKCBblFlo}k`y5+Mjm5}`ZLtoYOdVcu23dgBXbkbsXjxK(^(a*@*}KmF@Q)WT|XU0$YMRW)vqSaC;HAO z{7R#!jV9Dgj$CM97v;#7c#fQ40KWPn>^AWV2yo(JW&}x(BX}lDclk~_avpM5qwNWc_FV~76{wYqb zE^5UnqZP?$g;CYB1i7HUM0*Q7LJcU#%HAA=iFw4(aqyR4xlRa&h$ZyA{TbZ{2Ex*< zi9YSIV>BsbB=`!;v==kLiaYbpmgPg!LD??-6q|}P7jj`rw)05U5Jw(5h&w#oA|ypEZkE`vvml=Zm#ZMI+|WJh5hxuJvbKBZe4& z4itQ0pn5AlSl%|sXlDk3gW#bg7c77vLz7jCA(|#+ZQ+L!JD)*_Gj}=|Pfmu^L45lX zV#NM$0?1_&xu%IB+URfg!@nS@oV5oYLZ_|pd;cV5BFj=~s<*c-?-OdAg!S(CzmGsC z-Dwo1ae#`I2c|9S>_sLM)?Kk`)av&;k0W6a_1DN!2MZ!PA0L3$@9R32u(fM&egqs3 zg(ABG6-)hD!(_(-HLra^YiQU9x}MIpQiULGgf7Qh~X!X}%1NW^xDTxaC%& z23I0j&oZSyD!9{;2;%!|&cnh&?iY!#w6NWQ1XT5HV07psai@WjxU(RV*%aC@O(8ar zCj_fcgZkJipyYKVVx=zf3t06It$4B^B;<9#;`|5#Rv+z=cHmZC?v*>l+Jy)joP>>r z7{%`g&QP^~!Uw?wLbOmB24)s3Kw z%)1)aCNv5mChs=QXOE$=w%UV{?|XvsIlI!D99_D9C}lFR+jBYO`Nn z;gv#(EGS>V7rDFSiPV{Wx{MX~J0{6|vHW}383^wOJQoUM2{VFCC59B14&o{Xjgefj3N#(wXYEODh76%++=EszMeZd9?Y?3jW z(^_kLJS|@8>#aRGt+mu+HCzg))DxAqSUoLTk7v@cI#mi$k@^1rz4nut1gMw3=X<~3 z_jB@FS^Iujd+oi~Ui?S)Q*i&IfRA1QP-z24qoiKT`^8|^$_DcL&m9sN-n`T3=_Se8t*Nr zRWbZ5#<>7tcc;-`G0uhr<9r`J!Z`Hhiut&V!-NL@z&7Ag`4t#uZAfCAY8+2t`-Y1q zBrTP}J&I(Ql38(udX&_1tA z4oOXc#wznkY)U-%I^k&NSU&4poI#I}FTDYL* z7dUuQMPwVKdX9>tsv-dxYZ?w0XEPxpCFkZQmG8+uHF?p>ZhR?lLp^0g;MG zv2;l!-c{!4a74$gwBfwwQl^?Zlq$9mm*U`dd4>xIw~ORO?5HEdg(_fn;h8-s!Z*I- zr3hJ+5h}_^sle+r;q0o0+*hliwB?TJrlVNn;0;%773`T6d?)L6u8~)|D9i`OVG3Wn zW-KPKu69>FF0vfRqE-eH=eB%USB}~?XvfgICwE)cH||HY_=L@8#S4s3SqvLsd!dC< z>JaRHL3#MrKs!PpsmZ&|T&`R$3q>5}dGqF(r*MU{c{zN+R*r!hG1v#ZVz3R&g`vId zNc+Gw;*v5j69$y+(%^+Wn;rQJthu{TlKolTXGs`4Pu%Pu$bb!Eeb&!kP#P3Ze{`TT z7#sK-mKrMlxhnpTtoX64?%%_U6&QGl%aNj3B5G$*Y~X1)DgmIxJTElZh_Vl^$=du7 zT-(b&aSZ$m45K$38Tht}i-lIsl|c}3ZOV*bCddzc$S3UsYvBnA5N8PW8VR~JM@5A1 z27*}zYJgQ1E3)pKg+VJc=*#MU6kHn`T%2_$#WrghSRik|a$UF){vhRsP$VO3b0*rm z;c(Frw*#VK*%23ZfN+B-h+}NH7N9E3YCxat!ilQRvV&QhPC-6cl#a$lt@oheE5m-? zAkK|u-NCa#UA9e-rnkZ*XQ#8C>^oFA$JTDzJf3*bAPz>Ye|_M)@ZMdt7o{^&|A2ft5}^yJI!lF!O`yfBaUYO zp}Xi0-tNsz&l|a2l#6%)^8)Z#^qf%S2J@0oWVHDND8W_dz)2`gL#GNZk#G_Wy0d`~ zP)|jGe+P-cG3LzhJUiY9n0lz_6Nh<5*0XrY9<|3_t!|ouZHNJ9D)p56KrbBbQ&cKC z=#9L00fvI;e^VO#ctsGJpBO0sJsH*jPyk~M9uLOC^U%|JmBQ=^9%j?^=q~DocEF4A zg*QKTj@$TlJK{n+wjl;JxekQq^bnv%C4UOWy@Y!u-P;w3FAHXZvuxeJ{5PR@^*|k( zIuvQj+VmSF8H%K3ZMq)@kf(#lT*NN7=`H9G$UHw&VbBMuj(}3)V%RYvTrC`NP&h&p z1P8!=TaKeo(CJ__<^kaMCE0 ziKo9zAM@d!@nn;!yn=0qFDGN<_kIgzp?g;85?k7QZ;@Q z%dsPe!@Ew}&4pRS=-&LVpfk7+gGszBwz==?>GU*naUAfw3%%928L+i;(bJKG&!NqN zPvdF89qxE=E6zhM$HAh|$FrE#EvczD?GxQVM|SjQlICQph7Y0?I95A|oBc%x+jHDF z28vZ3=3Xi(apdseF2fz#&~IdIrq~p|>BylS`R0^EyKN@aZ$$?#Gosnp;}gqdBYF}q z`ef3_1y+cV+~MH<$-&6v;NYPh&;j%4GsdebJj3+^aTfDJ~xk&DHZ*GJF5 zU8JNK?g-^##GrZ&`&B6CEgnz-TFdUmaZ8`Mv)UVZ^el$M#My`UXs7EeZ}d>vNn+osbuwi>KXsPYoN=-Fc(CXPnotaV%7P8_O{SLiXLSGPQQuuz+mX zcnf@RHDKd4=-{VNZXXx98~01e#kk;e-1XG3^S{+fw8ic`POokYzm&Qw_vmUz?qJrf zYeCw>e7M;Nj>98=p*K@QA36e;eDK5ggl`X~fTFvfqGxEp9>@qCNKM@X3C#)j_=Ijp zYN62sd^@Z?F8nJ6_yHHb)Ro>bs;k)6G1t~roPuOK=B9*prG|E^#P<#*-d&Oit3uiE zZa6MxvIq|ih3b*?iVE0I)gB*8drW3~+=H?p z1OxXx4D%j94A51adf`hQb5qNa@O)D4$)sdiF72OaqjyvA^s}OIQpld9a40=$r`zh? z)X;lu(X3lz>R=kcO{ z?g`(K0gMaFci^$XJE0l4!wzg8-Y!C)ElBTSz*fLsrfs!LaVlz`)DFsy+9tID>V`1l zHmuze-DfXWkvN=6&4f8u&c0WNKMZ|j4_tQmRXntB;!{c;qvnEoqp#8sbo;5)gN+77ohMscrs?5~u{j#kl258c*Cof~~Q z>&dHdP~)=jyJi}%C);Vq@_Fd;B5q9ldZ$X@Bz<{N-_%8N!#+H~TP49bY;Dg6b zeXarDgW_4K`}X1N6oRD0`y0o#Ly_mezX(&` zy!-m4AQyx)_rg@w{naD6vB0U}bSYfuU3>0K25I}tl13Lxmd%o3nuZ#uaS|OS&|#W# z*!Re^kCO#?=`Zx_YQkFSDgT(_Mq5$f~`I|6= z%PVmY3P+YY%PX<&VBg!!BPHR})?)P^&RmcGsn1vATLKq%XDq~*2E(^_L)$V!^|OxP z+^q_84#Uhz{bTMc>)+&YL?e95;@Ni?MqhCB?&8HEBoTCn`pmg zHjb}}|7O~!&c;|N_FHK`cQ!OaV!w^{v9rHP`zWN}1$%t;VqC3zrKaAX{f~CA1FF(UbyCYXqHnC0yxnGB=^rio&y|Rfo5mCwJ$Sbmu)4>dVO8-DaQV z4*sn>qog~d3&+-BGch58FGI8Ups@|y8hFzMeP4JcZ!qBg(FMVY=<3CJ7pRLPCu240 zjXZ?+9nc)++r`m8wO?~VFta#1CeO7xy}11v*P4&I(s9GY4*LMr%y+zj}vxO5SYKHW&LhINei&4F+2@(rs7IgL)(P{1PHxtS0w^&Y4e;WgWPJ zc;0`2kHWK=Le6>StVPw4*Tx~qNKH}uwX@9&7Deh1DR)OrXSxa=dlA8_<5xz4Odk(m z)}(%tb6)Vdo8qbvk-t0*|ITxmT<5tYTX~?%|_3*?6pFu)AmwGWrp31umVIAvH?fI0j?y@J4nZM}AxPB9=9wg5iP+Vp3*h#%I<#sKxlN;kd{ z2JldZ#LwEa9rlJ<=Z1HgW3gv6D?9k1p!X;53eTpz|I%PZMSewvx2mE7cgbhq3PB_{ zYED}eaX%$p2CFOc!ioxfbQhltKq!2xxDQvhu||sg>KE)Md=~|PjiMV_ydBXB>hVi+ zKjsi*mDtS7IWN519Fw1u9sHR84o%*jAC4@FJcl$?cUB*+;<*S>ohENmNCIy z6wW!tVzW$LoSBCWt;TlDb&=a8GE_2-m1jrJ#O_&5=S-?}cc=BC`?*m0?%NnLH`aD; zdjoXLW8r!T4NOD1gV?$moHd*IY^Zu>ClZq~4Q}PfLu$;tkd&b_y}LsdVO!hy_GKu7BhK-9 zSAN=<@Yqn_gpJ!&0S;golGN7!9H$^uy3-Hg&GAxn|F9$UVcg8=N`(@A8tzS=gr|q* zp{SUYFT`D;UB^*pV`RZ)Fh|!(9hl^>5HBvsJ-q%2T-ePNmG^6*yp3@j{SKCGer;E= zePb|f<)Ov6%DZEp+Cu638>mrA@(+fvZaM>vp)<@-Cy_d@VI!xvm)rBBS)svHbeM9x zBWlP0_JYvIsq4QJpGnd{w}wR2%DyV{3AHPy<--9xu@5|s`N+I_rHQL_-@wuwOn^)B z<|S3}ne@Rotfhk4RS_QO#7C{O=OALa9d9djrY~NCW2N{yAhsTM=X(uA*quL)-2@7N z_-RM-k$_4jJcuh_tOj224_>P>J1dddMI$pitt#>e%9xZ{XL^+P`F^q zyYgt`TS%ZjJ`=8nzMBXi7layo@scl3O~v;DCYY1DXRHoq{1oq9J38lOgx3Gmj(Y>@ z6|HdLPaTnb#Ew_~)DhiLe+H-3J7qYDzA$4J?pn#yd^;)@ z{Ch8m7#*VxIQ7f(#0B=wn=@*@vfYlyimD2xxfd6>-Kr1rSU+x(;G}Yq<8Z#Jq&(ZD zuGr#)B93HlaSKevAX$ev|sn49gHV>gH zB9CB=9>TlZH#@5;B7aa82coUCg|U8#)S_j=_B%TZG7#5+2=EHexHEd+R@N;#UQs!E z8WUfM?`eEr;>!cjR--IJt2n}!ggxWEVNW)miO_*i!~1wa5`(Cji2?4?(Ci0sqR$pQ zzmaeDL~z6j&zxc?hQz6)bRH>GYE(5S$>V0>MULsuZS4acbDenZvCrX|P0jN9zvA<4+ zhIUR_8oda+XWc3S-?69w+W}jcwzaPRAJexOrz029xAdNNLVb$^UT6mf?#YHZ2e1ra z=}C^!w=m>q)3>NJt#pR85`RzMqSJl?`9BTV3D^tR2Y4Ou7T_=d?ec#>-@?qoaVP#~ z1116T=wh|YKca6@6VkBvuH>aFK9a?EudElZet=K$s28swpkdC!MxH#Q^IDC1^Xd(H z%VSVQ8JIrQ1~%6ac-!lyp~tRH!LCq710Ewc*34RI>u@Z-X-7962JvAf${V6Q7LCOY zPUhf?RuEC+GkL8+e^aRs`{fj>$408L&e?5TiV|Sesxqn={$khhYw(|#!lee-+EbOl z8jP9`?DgT@2fo~Oc2X_)qLoSmeYp{1vwl+S zvfNizU!W>ED~?aq@UiJGTZjEByqtpPQ!ovr&CUHN@CH88Sqd+$Jqmge%efGxisZr- z+u_cda6eaa6$|mD`(VZ~)Zi!TKSAkdp)i{d!jN;L8^N$!lE=aUOx6tqKj7-r% zvjqtRo4PaHc)ikBr?Sog2GJd0h;`J-7F-MZz&wo)}tso&thmq@mLWB~o1@F z+^m}%_%h1^bV+GVNKLpujTX z<+$LrbS)M#Sx?$LonxaonDbxQaE8ng4~}lg#M@O=Z%Nhhbl_0!-H16n+K;VhSvax zzjfTozzFb9JyadVW`WG4}+_iBKF~BL4XJ>8tcz5c*T9nJEF_dpUGBTu9-` zm>secWS+vPS)00$sNNfTSE4q<>S3Mq)PBCFvpsw| zR^yMTcXa*$mC%$;hs<*iLzNQ8VSZw)^>%fh5zXHCCcnl4(^#0`43mBO%PP(3eYg)c zy{~f=)5k+ee@YE*w#um1j-UHIp|+&=gw)z{8%c(Cuz5g({KLu`{Ht2{g>9-rx;kh{ zsZ1p7IfAg$@W{^u?9QS(r*e}P-}8$8y4%C=^VuhF+tKYgI%N7}$aF-TR5L=<_|)>N zr;x^|r;yq{z`TTuH|i}UCcsU4M|7or5h<*4u9g~@SyG`~t3rRjE*GLMXGvYgChD>d zw*b1=9gRA=*L@OA?Ow;iXXy0L>^j+lMy>BSW3JBP-DsL>GhqUo#RT}Qw5Hn|2tNZ% zaIt2BQ-ldXw%wg)2qQI!VHdt=w{(ZLEZxzeePw4uX++xckEgLYRJhS@Gbcj(b!rwH zWCD*YK=m;R%~OT9k8gx4)V}I4c;tNSZtXTk!z*$gj3F1LrzQF%IrL{3?$p?m899t? zED0IC3<-`?8%Nn#XYpfTO0~li&s3LC$p)DQud8~w^~Ftu^TIEN-aZfWKzLW;q-1;j zM*An-D6J~W=crdMN_A|#HnFT$y-J2k8<`8ERWC5x#&^a+O9!0;)w|Bl4LF`1Q}S8^ z#v)9@+XmCR$8YA43=2+ncF*Vwr*3;Yl7thP zAnAjs5!5l!|D6bYFUinK(U=W9C7enE<@1ITwgt|@6;G-Sw!?q7f!!P<(g$N_PW0u; zMKL9m#na~92Sq0zPl#kah-5e@Z0^H@31()fB*U@WlTE+q$*|bFJ>%d3rxYZG2OvVV zcB9j#bauH)HyTLAyn^@S4v@)k3RiPk7q}~gsph^dXwRyZ_~0i_t#9So@n||e$v7&! z>jC<#w0k4vKSCKE=y;8rr!~Rz@zxza&H%s2%wZmmm1jjh#+Qd{pq}wVBNIN2Q9A7> zhx%OT4OPisFe`jn=)zj-|Ec*%Po#>CJL2c8142eyIQyVIIcaTML~K0p#gUS!Fh zv?K9nm%;wSAJ#m;8vQW35DBcqntJnGP%gYnO6bU+O%W>a*NVuufhBC`Or{ydgE+*v zBB4@x?6Jq9V?(n`F%%hQR^+<~9^s;Q;C2r1FUHX*<9`CKqN1ML-)P*>L=`$Tcr@tT zoklYY8lN};R1Xb)GTd>Jay$~uQg1ONf~%A+dk|t5p00@4ad$tGX=cnbIgD+!gPC@0 zJw^SuV}oeN){|+jPEZ`prz@c7^8l-)D1!PdB}-wJO9RP@-l@WqJ|v-V1$t1{=F`bP zed^jx$ELJ*P|1)rX>&oYyQ-qPd(j73PmaMlD|g$PbMOe)(<-QEs|!CR z0OP>P3pjD}!J~8Lbj{({Zu^&h1&>j0eg`X-_)NBsWX-t?$yV`kckWKBFgQaizEwls z*g;{WNH5l-D$J2%!|2D&Rk#j>3+=oSmtDG??FrM0Jho2#QkrG$F|wSiNi z1z9uJN^Vd4fGc{yN(@Oo1L@Q{?{Lb>Pa@gKt!8%`PbrXBoP#q9a~k(S1&)u% zaytkcvbcdV^L3aT_rSS2{#!g7$dIPDajQ5qK1lpPB^>bqx5YsB(F|$e^mu<5PlB0a z@1rZ#N)>dmL?vR34onTqjIEsL;L4Q9)E}d4BJgpQ8p_(#k0Nrlx`!B-1l0wUfu~^0 zuvs^1Mps302N4k`xr-g0>G9Rs@zoAI>J*7%xl8R?F<-k_%hhNb2jrG;RmP$1w+64m z^0!*nzaMUktMzZ*FV)P5^>5yt(X?l|{_UD?U)ui0t?eJ)ihaQsU7b}K8*jT`~k8$sAf<+Cn4!J83z6eWj2 zzG`p^>P5m&PmYZ$~zrrHL~D9iTW!$=+KdkgyO|^y$%oWP#d7pH*BdNJI(i}c=FCV>$&zfTq)b^p4$!#v*sKyUp}jEd_3!!zUbOmJdK}X z2+gJ{+W0!A;OJ?wcqZMTu082-2oClM>}Xp#4NQNn2l-sge9oJT_i5k9ovZJFOK~!P zr#;fG_|=}X!~8v7#@Qba?_Z2Z?nmq7qDudZ1Q8S;R^tIvU7s@NNzY|%8bJC`0^>+X zQq{_T?)m8rPrA6raM75zx<;AjBmZ-X=jI#7>4{^UMoR zdd)nqc|pmiLrat+{9+`}qAR;524>9hJTSP$t! zPOr+%!wZ z{Nf58KA>Xkh!iB!@C>D)QmC+^V&8m5w;F)P3(D);_TMR~hgBE95bwP{ja__NYJ!>F z#Tk&Y)w8q3d@wfUQS`xZYIk7{-6?%@Tx9{R)DtTataBMiNy`=0D^sSw7FmvzYgVS> zWF^-bx7<{9AD0s0!ysPR&Qp?}L-`pYe5fz-Q_STQi%nZWC_ZleB@)n{E;79x87r6g zjP%I*yW??XsR>O;H|FN5wAcS|2}b$~=7(qH@Qn|QY53gEh2SopFG*7!^-ytUKJJub z4Bv+A4)3p7a&{jk37oKF@C>{wj}ZzLdn2{|!<67v4Uaf%<`w$3Bo3EcRPANlnRq!0 zBM?s2kL7^YZjPPs3ABljyKt=$pDjcL-q7q!UmE5Y*B}ybNms)I3?$0*c;xzr<9KAV zW|mrg-D2vx_JSTu6+LRaRgp73uxeQow)f&oTZguVOgBVrr!AP}jf_VhQuI2fAbJ*E z@kJGUJ=YxTjo7qTFy*8{O|;&s$eBp5rlvSo<+=WL5bGk80x`$gKrx)S<0li?^%o3X zOD)H>R2=`z+Qc!2)8%2{>965f&1nxi@vwf@rnlh`uHx0y)2UA_&VcKL_wW*2;$rH= zkrz`JL?&Sk#1$x1$FG8xHP9GXcT*cRwY$A3ou`MZvah=?_v6kgbvboGFC{Ds;_MM97%7DDpp(ByoTBHl3?s;A&Oq{;a@#BV(gY=BY50d0|-)D(31iBS`$9P=ixBoU&(0wpM zwSxVRRau)j6L}*=aH6JU;0zXURCv)r+af%t=(cx3ZSpV_NZh5vIl|HHxnqL%40|+X z!p9vpC{ys{CwBf)aVZx!e6vC?kg1BCT}B>sEI)=NFVj4!Befuo=YeoA*eJo{{%ttC z>CA7>8H3AXMb4Dyl3l5p1xO^?CRIV$?joFh@}f>uCh7X%wQH*HP&3@+I%q)h8AYAW zJiH}e6bE_EKr-R1f{wx~(xR8--joqMseMCyOfYR%>X>LYzN@2_uG^!EndpP#kjNM1 zN0G8_)>yPR-QRnoB^HIr^j`Yd+&cscFP*=&xJlU*UV0|tK;<0=%$dh&Zqo^EY z@~k`WqoL0=z_l6}RlPg0(w6(jB^xHrQk%uMoP;Ak)!$~1j*hWD8Fb+;)QevX@*VGs zL0SA_5Vwc;&7j5nK9%}pPd=40l}MN#YRE96XH-Qdqcc@SpxaXF*jDLU2_2}85He>}MK)qxL!IsYU>c6D6v8pO z;;L*KlEq6o#ZXn6CqZ-4gAz52$95SqQEBlqnj`ldPSaJ@Z2^8EX=t9tH^h`)lk+s2 z*k&%Qi2N6%-|(m!v0qXV`4;RrQgd21=4H@Mb4NIamO6yvsHa8V{V};b@&_R4pjaBlHZbIzSap34RM(4C{5;fsg6 zptl}O!!)BrobHT6?e!gY9wg4Fj`*n>M5h+!O6JpJ^a1~+yUV4sTPC*ybgF5U~jb>X8|q+Tn#7& zQ~??R?SQ)g4*{M8YzOQEya^ZtIQ(`a8*nM$YQQ|eV!(FjV}Am;A80!`{x1C*@&Oz{`~Mm6I^cQ0Q-FN9^S5g?!UMJd?gn%K0)Sx>xS0N_QyYP9!lfO`RNBK|>u9lVwe@B;Dx zTM%z5@Q)GZ89+bab-yOxCg+W_sJq- z8Nd%{2S5#Q><{X<_!}eOz}MsP16hDnfGvL1WyFtS6-=mYM9S`T3q#1P(s zV{@Xm?)X2Pyf8*WX1ifz_5z*&-~rnIIAj>_p#-gf%K_H{&LiNCO_qjH(Bu$K@S6s* zOb5&W%miEsxC)R1m<4bfR~XZb>BbCWrg5clm62o2GCal{qrfOMij3l6sm6*5mHpH3 zl?XLsA#OASCIK91hZDu|e2%c#efiXM-N?_0{O10huu~8w17YR?R{|=I6Lw@6tNe?P z6V~#x;#g%^@HxWr-GR?aGw){zYn7q!VQI7eD!f31c+P6UUX6P+?$2~H1^KZc8%R7I=sd`v&0_L*n73udo_0E zioIRqn8wTU#JykRc6^_KeB{1H@Bxi`t`)m0UvRI+`MTacQ+2${1@~+0cZ=P5h2WUR z{nNzWJ6&+k48iW1g8Mc0UnzFyRf2mp_U4E^rg6@7h1}6Mz9`;WBJsZ{?zvc(M`Q0K zU0#iymx$f3algjyOU1oM z&KJA;0>S+n`!5u`bAsSrjlC1aen4aYMPfH}eYak(>GuV3j*j<5aetejxXKH+w#%F6hUgM*4RKMwuYiwwDo5m>`r)q51I8Ebp z!M&pd_c#RmM+^3j5$rxmurot&Oyis~&HrBzZ!OjB_XV-{uTpR4`?~%b_k19B??LVV zH|?)+&mrx9So;rZe~o)S)czl7|Bto5#yv;0|9@%!x3#~#^0{=MLKUA~dHU;F!ClW@-01@~&~)%6(}&$7o}k?`JqI-bVP--z9> zu@!zK?$`eA-%9u%jbj>nb^S)hv+VAE9Z%z!#@?57c{H}dkHpTGbvZTe*VwJ=)uZvq zc$R&uw-BH1!~CQ1*7;(${Qsx1`$b((jotsD?Hc=ayZ=w&-aV4vvgZUlpBLPx@u$__ z|AK^f?G@awar>{u{;BbINw{8(V;Z}6i@RUrK8>ALc{R>iSZH9mWNcj^ILE?hN8V=Y z(fu^0vG;(^Pvd3J=zRW%>3pL0i~Uma\|$8>pOJH)-`S;74pJNvX<&P!73C(Kx9Ieozmo9z8n>9hD(D5JB;WhUE zNZU1zX?OSI;vUoP?jP&;+Pzm}zjp7{IHuj*R(jgqt?TQ5Nav?#_mV8yT-j5JFWWOC;l;w{r79T#{LJy?$!NsB#vo+|ARW7#{M5_ zyT&8q4cWgh;kIZT(>VVJ;@+e2Q1}t$IH3LATO@qD#{C+*biGa#-~G=zp2qzeyY3Zt zzs4tu->3bZ|03a+Y22%^q3d&^_*<)Wf6;hrm9}fVb&~uuyT*MQ8{ZUnuf}~EZ(S_orTcs0pHqW3 zfiUjnz@4~X)5W<}{ChRd|ApB5HFoRqdMn0H#@mYZgGvYM0A!II*g?P^5 z3T1UKaxY3vACqOr@3a(1SGM!;aWe11k}KS}b86U94X;;~iRFU6*ciW4c#N^f0PL`H zPN6?f{>FC5+-TWfhn+GT?YI|X?13G}nN@*ke*$)#=N|Ik0z2Iqp6)%cGat*|4m-%s0 z?9ijDy3!uoUTB<}WIq5q-j!7O(Z3&dynr-h?}HusclD!xFYMV#_ARiV2|MdY{~p-! z6#J099d=&MWO+ze6L!9_O4`%j2>ZFfmj8{gqe+MCUf5l*Gku0Hg#CQr5=5Xq2lfkq zt@u-5zYumSybJaTN%nEDPlUY$!1xZ>F9Np8b7WhgaWU+SPuVX9`y}m8`&+Q{#-QcD zANEU<{P)5>8Fu~{z7O^($|m+FV80A@mY4ny!+tq1^Cw>#Kf_zoK=fC#5B$mc%#Zea zV5i=gKiYd>pRR0T?|?n|w|FXa<8WYljK_4?-mE*@jcv_zNE5a*%St=T#xQJC@+Enk zWh8HtpUJcAapXPn6XTLk*>)EKNCTED7f=AG0Mr5603pBwfE|E80a93~Px&!OGO#|$ zkP3S;u>8rux+DXvDm{zNR()Al)|2&P-AJSJ0c-;gpcb$Zunl0d!3?k=5sW;B4T;!5 zFdK+vLnpU^@HTW7n+t$OwdDhr8OQvP#86qR@~|#e`K@xZEv)vi+Qe!Xt8J|IVHFOuf2>>b?|A+!2f?Z@ z;}RIx@;jdY+P8lbMi9gO_!M;07okC6?$c#2=e{sLnKAo)l4mbVLx0DwQ*=YLROQ~+q+3*4{GcmJ)x_#S}n z*BvS_$^kV08hdIl0cgI|R%lEG1cEJQ(<-0K7YMWlT%a!qUs*c8qC#9~H7ZKV=O$T= z!ue&MlJbPh!Ykd=ax%wU<_fmdE^qd^%vM)ZOOx4D+uZaupR3VV>sQGb40jd7wX~Wp zUrTFnMWd_DUt8yMH6ZWi)-_E@5o^t+)|N!PD^D1&&8+`B@n$lfKN#@2RyPIAU~RLj zA=pyKv|V+z&CMzUmTSfd(_h-!;#=EfUS4YwxlC4Zs9aafV!TAXTm3#H+}hIC3OdyL zRyWlph1E3jt@ZorOkcgCOoECA>2rmmPY^lkFsp*iW|P?%@YU9XLUlKf41Z#}=t%Xo zW-W@FIi_}bOKV^i2;dL2t_akwa+$uss-~9Vbat!y9JhUZEudg)%PL=siS$rbx2n%^ z!`22?1R1c+qOW@z>D18NitJiexcse6Ev8}vxYYaVg`QNlmBRt#z#px~q?TZF^CkEeyU#4GZ8JS!v(-Ltt3T*hZep))YN>BsW0d*Y+G~z7;`@YfZ*A5YIq(1K|vWG2l;t5ian6KY}4g)5 z?kdC?qolayI5*-)-29|)RX9^J1L3A5rMC%gE~J-{4!`zXYs@(kR;FfNgTdJ`h zEP#w-`ifRVY=GaB82x>|g}%1dV4w~&)o*O2kbV;O-LTizC+rUy#h6$vd$sW=TUoHV zuxT|{f(6a3ZN7Q6E%nVlW1FqiSG(F*5P*CN0k8s+7-T`bx?>czKp;BC-Ir3~GgYCm z7E|SI_My1O%PG}O^}d3}+CXJ1ax$CdtTTN^cFIBsYQ;^+$oOMQH8Sxj%T>B|v{Xav zSP=9D)_Hva$i1s-Tk3oTt&nmsV}C^1p&%FtfC!aJ=qsr=j1Jq}=GNu4&7_E7d`sIF zwNM^3jN7%H^x+y%!g`wFYb=6{(CjmhsqUk;k|6cXr@lS_8Oks&rb}6CeXv=#G19+I)7wgI)G-tX zEx#J{wbZRM4kgh%xehNV_tsTtp!(9L78H9j%Q(ahFQ!!2Hkrk(feJ{p&A$1|SEBmH zN5b>9^j;n07*wCnD`b91EIx%AvbFXZwyIC<8v@@!QsJ>u)Uzy8&YgLn08{bj(;-)~G zb}(*a?22`55Fov+YkYwU6G9!R{f$JscmqwX;P7?O!4)+7Y6AtJ)f{wUaN$)9m1Ivz z@dg7cz~-w~8M&5UCDxs-L9@-6Wx1#pp2nQ#ul5C+QDGmuG%9PHMORAIO5it)=N0vt zpmfeN6J^jLuC`KT(a~?7P$P=9jQEurKeP=rJzJ&UiXnl;GK}ks7M2&4T2gt5ZU?Y> zTPs?w-Y7)pR|8fd)>nFLSx?tREwy!ZU`)CjOX%WB*w@moI)4TF78~<&ma@3DjhAEm5mgSg&eHdGsD!ndVfuOd+XpJDvs%CyYa5@ZZ$ zn^_}T4W|mLlNySWLVxXu(aPp+Z9{OiDnWX8VC2By-MUT}XNN7ZVyVVTNmm|g{MHrT zS}Z3Kr+_JfX9`-IL8PDS5?S?`qkMzQRgsKG6#Z$g#`4L7mS$~eE7GZ;5-R8qRLBx6 zs;iB!kS3BKii;DgMnR*m?q-HlmA=a;R3*Z)N*5{>eHP5w<|`~PK4FgrK9e~dvqJk% z`VL#8&15*FgTWa3HO6gTQD6p|vDILF4I}7kC^)dZ#w>-7Z**G}Q>Fe2!|ReZL&dR* zi5RsBS7}n5cP?mbYOa@%#er7zHZ*Y2T0DxFQW>bNyIHLtRg%&tC8WyoA)I!vU89&s z*{2INP|7($)8wqSYjM1I=kyQ=l(G?^IKs*RW$Q=6MW3{_&A;i+GVb!k$ij60AQJ&RWPF}D0` z%9_6?G5~S}I#n62)s* zqdqiMwu+BoY>@FOp_?;qrVGUi8IJTgb~kzv^m1lhV`4nGmE73U)(m#nj(D_}T%r0~ zB3yeS9LK$8U!WE;K{a%Zp!ra+Hs(uNpu!iRj*RjbTx3v5E(@r4*tQT9!$cGqqA}WT zm6~C{%2)|e2BE*B=#`W;gqIuiXeEtOw6+>DQ%M^~lqTo{_N%#1{Hl$=CFNGzM#<-f z1kJsPo_wE-N~>yDP@XAd7{$>S(WKk%bk_NL-#W!krM2rY*=hM_4MqV77{;QCqJ`ER_-h+#HV4uK2Y2HG+BkM-`%;#v!h{T}1tDWKT^ORwhqLxK%Cw-?--cZpp^6py2S(9amEQayLVL9@hI8yAV0@Va zApyH#!a|S>z`sqX1O0!)vKE%iQAMqknmvwoR{CjgEl5xKV2>`H<#4$*$Cb<(S|$9> zm|Nde+#GD9sw@Q!Ie)}Fgo)+{R&e|d+vYbkw1F+qQO{-Fz!jWItoq=NixMEL z{3;nnTZ&phGGCi9LD8fH)oU{r&@7R`ahDuZQyF7Im|Iw)Sz!$Mh=U%bR?X2FbgRJ1D#@*` zbya=y3X6YM8x@Vd=H{ZczB;Tas?lngy;iWN`jybxhP@!VU>(;)`kttOy4%Ejbpc|0Kz^ zJh%!TZN^s1jTFOPosOp#hqxPR*}VauAEL%QtRJ~H=(F4xwfKkoJZ|}jD394ir>GVu zhH;lFr_3@wi0Jjk-B!tUK@H>E%7wF%gs3hlFDp|DXou#W%GTEA<+TAY!*vFxPCo{# zb!b2EIOM$fWd)TM*^IAn#8hR$P-omsTTx4JRaI>>6tqSg?W{RGIr6TjT{Wr-KquoH zbOYfNF3ad59INB`=pqAxPT5mftirW)gxOY=Uq&j+@kdyfHY)W=ebHKWSJVVu zQmtXt2qjdpdOmXciCSwFC3cLY3~e6crzh}%R)pn0Hi}4V$GW5Zt2oz+%%W$(g+haR zEyx(B(av&_M#c|QDx2FZJ~Qs8O;hu$Oetw~`5^t+Y-D1r(H5G`i(1w|!DKwE=;LK$ z8^560Q-E!wE11vxqB5GdE6G5wEJ2I)OuNDyD$}Eenm|~pIl+boFvjt8`(L_!It3

RlW;S2IL5isXjV3wXKHgjPL%|Vsj$1$-vpKVOal`t&YjFR%5i#UCT4E>PJ*m* z2~MW)!-a`7Bp#fS+%AK;4lxYmS7ywH4NDV9M{|3X+TX@l=q+7eAgFO13XVy0kN| zg-9`Bo|a^mG$f3~r@0UzTskgGV3}Ea%j`)qlR8%`AGV8CKA*AN2pTK!=R*s*kZKc7 z&oqNRD`1-gycQUzE8t&?JKs%kArBP6B>*$yoR8A5JWZ%aEualyS0UYIl_vcvjCIO| z?Zux5@gyGuDXm7h7NqS`TrxbL2Bg@eQmWTE6(aQTGFQOGRAp;HsoTJ3{Nt|#>H1MW zru{{0Hc?Z{jkc3Nww2c?MVj+bl9kB4PUTRAlKPA_|3F@ex>cawq{|mCcOtD)v{Nlw z|BI(pjGDFlLn#DH?h+55hD-ADGMFP;*| z)K<`q{ao6$9C!`-WEt=(_ytt^Pr?XWfH7dYI-fbxk3Q3s&$037cf|?(Bu$AqGEMQ5 zn8|(|FUXCxXzNB`_Lo(#twjx1p(d+fZ&7$Te95WgHWx;KV_TAKa6Zx_J!|356kVE^ z*w!3dTM(aI)}ZLb-o+R=7oxaxBaREB8OwFEt{Ka~(OYKYsfdHaJD8Vg;^^IsKbI;g zLoq&Q?WtrQdRg;-8EA|nMgcW0R|xU9ejfpun({Y@HC(o@F3tGKnI{5;0H7UZUlG%`2aUy0$@DA4v5^1ZdF5kYuL)c)xyx*$H?8@F3tGfc3jQ$!xie z#3sTt0=$5HKpr3mFazKQOaV*+OaQn5)^8ll4#1Ir0zCn50rmqv>u)E*_5$t#tOeW% z$OnAdFArgI02ZDBvl}o8-~wa=oJrULvjG_FK{)|$0rms-0{Q??03HV13+SO8{E^I0 zo8Yz<&wWo!}`zKcElL3)lka0ki}BfMtM@{96gPd4N2C8!$5e zk>N8CCUOVT0lW^_2j~av1?&N^?REnHJ%6_G(+Kkf;Bml%fO`RV0d5Cu0{lJy_3$?V z&47Bqjetr(DWDLL2jED>UmNBs!OIn13m^WtcH*xBqpRRK3Ul4X-&D+Uf;q#}F7c=8 z_*0RxxUU_;beW1dfH_aq`ExPK6e|E+p)6J=%8rsh|65WxUqbRIps5gJe1XCU0(Wt< zaB^72;jbRIC|vl@U!5|`+GM#hOZjV+S?b31R)LzugzvfL@+iBc$90$Z3vIaenxp(Z zDi4NFj!*yO_z8cB&-9YxGk@NS!4A=g^b+|?_(cAazT}^XFX0pUiGLzL@lTXb(i3{Q zRo+4`F$=xKEc6odwYs#lU8`#@W+|nZrG#RZ+A()4JWF=1rh>Rjc$SEg2Y+0-^4AP$ zioX>aw`g~t@m1xX2m0}MjmCM(EcamO-%8c%BrpDF_>pc5R{-9ptjqr3Niwtj=))h|$})>SLfpmdQDMmG%wsu# z>5_{WinL@1S%XlfrKacDvP?p3$}C)ax53QxMwWLHQce!TysUI7>rtOl2^q3jzh5Th zn}l*O7R#~-J)XT88f4(vkQ+TC{8(NqopP8tX0eU0h1n__>q%E?BFGh7{nih)5Zh=n z)(%!HF^xvl%0w8Jl60DlaScg>{)M%ZfsAwRsbqtEKDAJie zR;c0eYjt{7eA=ZCCgLaT3?=m|1ou>;6#TIcV&`Z>{ue)v$_YF5Yhq_TtuXXY*hj|q zjEFCG887RUpVW<|CXZSau|kmcj(Sf|UM@Mn)9 zkH~ydhfw@k^TDy<#Xk`~K@Uk^(hGo3n~=^V@Ox0L2&E5m%~glKc7-8hn;&7=Cq}wi zY1%HB?hjhpx>|@)CIDy^Cx42lr~}K%3ov@){muT zD~Oq+o@KUh8$yeWv=E$D0)J{W7GXVIs>dzrgSpx!7mAr<5BZUrW*OH-=PYz)yV1^H z0a970ZFCp&^~%pOTl^}0o^L}+I%1!vbKtm8sd_bi#mte`GFzB>0+H#C_x@xpxR)cp zPtOs@3uDP#)*F@NNdAba-=>ZK2~vB@Px@6NoX~7C!dqh@(-FR5e_>lwj`OKBWsJAd zlDz>*VYnO9U>=q%E9O!Rq<##iZh&uAC86$!();oE99$}8a)x2t1aKK& z!GDf$3QM8katQYCV)=$vd>O;&)(psp(NnC4O=1NYe zCB6(RCaV{dZ<#)GVn_*3o46R;l#x?$Er@36q87mdfTXJP`e@KKcMI0-< z)kj!Ai~nh68AkTCYtd_@l*#QOe8#@b8H>Mb)p*M~3a=*GPG%Epe~`Y+$C_g(hgsB+ zbmk$Y*@_b=pIYgQ3w5xTuQkrorIJyT_@!|ueQR!GDcNf|esP?T@rWzw;q5b3%h<_n znCvEP$u<{PtIZN=i~EJ33+u@ru|*e#BbC|!lp)wE{8{li#>ft#lug_@TCjdIhSFr1 zW|V>Dr;K3HkS*g^p)A*Aev-Dbc$GGmjr^26-d?N9HV5;v?Ao%;674D6Kpx_cw&5Wq z&06>|ZSptAM45GDe3sRP0S@*gjfb9N#zT(FtPkgG$_N4EN!ckE=}HT`kT!RQ+SDE` zyo|x3LL$SK1h}5A-2QL<Gvd`0Jc znEPK5vm568-->wx!)Wt3m|edUcRS3z+I;Xq=n(gd`vIDNFXn!jz5glZK9~>uLCjAi znIEM2kK%q8&3_Sd2h7Hw#Jm>fEpLgr5oZ5?iTOsDoo|b|6y{!S&WE}0zr}q9%rTf# zQRhi8w@1Z19_D3l%06mu!e?jvH(gE{{bF;9TmbyUnwn2orY zlluwHg%}IU&@U^|>q?aN#B$^6wFILhM=Tj{8J4=0Qpjp_p}ko3YOb2Sa1l3|sS1$p zNH?y!J%}OUL_Z;Bjn;iy!p{$+Y9>&y@#%OrLg( z78Mwg%aY2$GFtN-!_EVJM8=_+J`0o58Ez;2uSY#t<{F(>!e-??Pld3`!u3#cJuI8h zf$b);1?`Del(aY>SoOTnaH(=l)VN5^RGc@&r637gVJ<+}3lNLa@YwJBFIigX;yk2)pJ!;B|9 z?^b4uKgcokv-p-~;b)qtzaXEBS=>cCLzhIK5r0XaYYHo`X-Q^k2P}8$>~NDow=>Pj z{obl)Vr*at?okXML+CnktZ^Y_>yL4SQWk|1w9W(-`Ln{hV7A0^wsh65! z6H*(`H~5q!vkq?L={mJu<0`-h8CuTv@Ei!WvpnU))OhkiR&|#n7Ee=feZtTUI2Xd& zNEm8cxsGE96QyHpIVr@m4%QhA%V#clY!O`NA{=FUmcAKwuUexwBh5P4c-Dbu40w8i z>2Ynx8gm`bFw_vSAOScr8bo zP|uNQi$+xjX_ZD@K54l%2r1`8cwWW@+K}1}z|D}SSpwk)p6lSaFb`u3PglCoo69k} z(_O|!+AHBgYBE()O7!5QuAClBl!&Kw{Hh(L4TVF=2|Qy(>X6>dpC>OCsB;p~8&UWSQ756&)Lo`az z^ox~N&XMx86H8>ZoTPfZQHJfy{_jFd@oW@%e+}x%78lyJ!o}(*pSLeEwGyPv)uiy> zOss6#p28b9E1n^5S0E44hm>V3o`&LB$1_~T2*p!V0p-KIE1ImX5hYSve|_=JTE;9yEmNQmLrcZdXDvcq+lSv zA2kvgB9Z4*)XGE&M7PGV#6%6*bNDMnENi@BTSy;b8_=DneTAENzKwp|i)~XoQg|y3 zZfrH4_G6#t*d^R6Z7+Lu>l8(J9++XR8H763;VvWd=KRFGIC5JYu~50N)m-Swq?WV{ zH8Z3+eON;|CCq-xIgV7Jj*}xpg(|b8@b}IKWikBSzUT2M~Xy?CtBco^ng;-nL8!Sg|id+hMXX$#w}jABnm4%p0RDg zpR~?Yj2DZLiu8KnBa4nxFc!-x>s2aMN*ppmP)-rfWbSf~oGGvsC=KvrHfzz0|H&LF zeUj@u@(oKsN|GOjpYN74jtrNp+D@cUt0hOef1WnA)|k~QXNw9vtzW51B2=+z#}SB{ zW0~(cPbHs1C$+89n^w>Gv_2@Kvv4411@;HdDJ`HC=^%ZLG-G?xU8u?ykhzGVST2r+ zQ(>M1ADOM#0#=EwdT^{5UhXkTeLs1|64@a!97ROWNA`oHPYm|RruxD`OR8ellz1R$YV05CDI%@ z(#X9R%F9B1+2>>bxANh9Eq54XY_di<)<*IvL(LNNgUC4Sfypgj3>)hu5}(AIcBQ9i zu6IENHCM+gtCZc!o%4G#4U+kle9qb4>hUM8|KCqjdJUy?w%q4S(^|F3*hx7jc@KM} zMnJRyi8`>vpPvSww~VV4KX6w{Zl{Q(PF}LcB5Q`HU4?7OJLL4^ z)#%gK7R=S+CyoUczmBYz$o6vAX!zKiymDljWF}7V`}rrJ>&SjU?%`cWO0ZlTkq)BE zU_YRS=!?@J(aMQ+0#`I5Y5Fi%tk)*T?`aN@iz z*;dj`#F=%%IK#^_3pC~|dYM|^9zP$}C6SM;gRM9x%4c|;Y2z7jwzBk4Ypsx=vBQ%xv{UYkXrW|L>QFyY7kg-pDe^oWTDr_}&Di@R4)PiQ^X_ zY+{DAv@eNSTH>ab*uL31T)NZl2G6-bkFHEkuRmB?Mx zM_If;x!IE3SxYf@uGy&TUuGOo;OJay?mYYF8;A^Ovl_qurvzTGX4r`3T>jC?@MTYHp~> z{UzXJc0i@$U_kXW z>4l>EBR`Sm)C6%f;dsej##ZNuVeK;~kBw{*av-^d)Z(6X6aG`SqFqKoYfiUxJFEl8 zPI3%KP3m;`V_a&^SOezCF`X-K8RJ@2i8%&NM7qi0+1|;k2+FY11302E^zih_@64YZ zC%bNbRTA!(vZYvC&Y_m{Pu(i(cym%}R$1qa@Z)YIYn7Z9a~iG-V!on{V{W7X&%Xb? zIh9-`f?h1vGc#V`-?bJlB`^o$+Si?X`m#xL<_UOm$43WS92$kJc5FH^WOwMKlI( zZbG5jo}cDp#RTw=vogwhqInC~&vW(LhLawSD>cF665E_DONXzm#3myM+oII#X}Z<0 z|8a5lLJ!BCDQu0lKU;+K+l>E@&`V6jL3vWNGlsWpNgNG0ZySWQ^r3Jm-I{e_rtj*V zrS=4mfvgd3due&Ruv4X6$hef-s4p{P3iC`uohMhKSPO0Z^rb{Ycq0c94|B*~WCHwc z8O7zZ@Y9Ap-+tciv1~lHf4I^3eB=_+?~bX=kv;x3A6;6L0Tw!(k-F3aK&;G!c)JV5GN4MuPtkb3iGsR#$!Wo`j4(=iBIi1O=jF5KQm!5YDxW=6p!aJrx z*+k}pCN3#3n&Fo6ZCZ)UhNU03^T}2y5;J*1PILTq(=)h3({G+blY(%dIejt~m~u4I zA9Wn$yyQ#r+P3mD@xFS=86AP)Y4bc$K9Kpjz_5O?-=i^l1rs|o$HDnEq3lygF>4n& zCHy69=q?FLRz`#1)4h@G5D5?KY8VVG&(DO;cUiK;S>u#>nS++O?`Oo<_RUNA%hS`_|I0-$ zmc?&8ySQ@5j{Nr?ytiQMp!zpb9@_inic8;n?Nt5o!$0UV`HA+=u6lHJe80Va{BF1B zHWj2j+3k#P*W&R@pZfUi%>Clz#2N&LssaKVA6u z4_+?(&a`=+3y+t2^Ycfhe)iYogu7nyl@Grqtz`1MnG0U4T3YF-L94O%wuW*jkZrvNxE1^Da{$s~G{PK$Tk{;c#s$xLL z$&2RvTerODNA@dvVpHauw|bYp;d#b)c*|93uYLIK^^Y#SY|j(k9q&GO|J6tKo_^rv z_~nB?RjGIHZ2$c(TT*_zFM09p{YI80{GhbpyPkRZe>gjR$r5}zsOzze!u3-_KT^1{pImpg*op%dBLCd?!RMI{Zn6@?Dp2e3H?rV`gql=cNR`Q z^7)*+$EN&d`kw1*)H4shld8x*zJ1GJePj?g16-6*$Y4UkK#iA(xIgn{n5Lm{MJj3 ze0i$RtKXix@AE#!v!aAI9a^&!@J7| zuGn8P?#|tL|8eo!qGz@puIM@RokcV5t?lri?Xr{hJ=Hm;$AI*>8}<)>`WL;Do_*|l zb06;$yLk7!A2%I+Vc@|-d+ykJyl=Nh-o9zq3kCP3pUMBA;lahr5;vE{{KVV7;rgK| z@2@Y8ulm|-6}M*MbN61ja_>8j^m+7~!!CKE!+m!j{$BF_*M9%xhi|Uxe)5f^BZpu8 z*64SRd~|O2TZ_uqp1AD4I`6N$DgCLx{kC>jMQ!$zUH&jPp}ul)YSXWWdyD2Jc{(<2 zE!Q!-Z_a)Fcu~^HQH{foU6cFBGe7yo)_rf^e(0f7T-ktlS z2Oqy8Zs?(>H+zr%SMS+x&wQ@<_~rdq7VX|UG4I8gOBUUHPoIjbuGydT`1ZRy{QD&* z~Ns22B{BHG};@<@g(QCs{LL%2>Xa%$%c@qbnV^W~{s~oP>|R z!_>@}noBol@=OgsVeC}xKOrk~CjCA9QFUoC-PaC`9ld^rH-AHQ!n$wYlepuKJso~| z*Xt>N-1y0$oavBfWoJT9$htIBFpAy)*Z7aY2t)0oXlgY`;M>Egc;&gYwi?o8EaUOH z18fXz8f;4@4uQ$BNwI`U#>eU7@f;T$6PE}?W zm1U4+8Aqr!>pheesn>V?voZG?100n53xP@S@^+t4zd6nPcpF71oXn|8!FOs4If}Ck zL^fp#6OcY<6_g!0)2E^2!h1+r17)3<@(DS_GLXAnIj^GDh_cW)%_B+*wZKJKnZFZP zCU8+-Pp(k*;yjBh4%|CTc%$bhtgP>gghN@H#=yC94E^MOWR?u~>(WdCZdp_19U>W2od#%Xm=55-g4w>4<8YJs3Jn_hL3}aD>?*3%AEpxTh z)E!g52Z4?Wpn`d$CR9p=w8^Z%-bc&&Q-!=qi81diD_L2o)ODB|A=WO2Nj+x1xu;Ba zpt3iS8=1IvMiVTp+!y11up~TQdC?YpawY_X3264Lu1o z&x$b*@lE+~t;^ntL>eUT)Wwqn)Tb~f1)xbUrK+sbQe2-urWD`XF&{_47l^9xrI=iP z<%wUD;Ae#JH3@}SJd?#jX>nCC|gK4 z{SD*ttAX9jwOQ|31EVI&fhY%}9Efrt%7G{c{(tAd_OHo)Gn3En{2@!xDo8P*f4#7y zRsKRl!o82jJg%j`b*lMaFnpbI|2(Q~e>R3S%KeMM%(5+iCce)w+zf|1ww~EazWcVL59ht;`4E{jj9D&T-ekW%ycHhOdJqp6|l; zhTZDCZ--0z9)e|hKZYgTldz=kH?Ryp3d`^=U<&!;1NMG^-jD`vyRc+Z9Q+ao;O*~D8m5!_pIm5)^j`HV*OnX%X+~*$oc`# zkqlvcahor)!&&x^=i@sCaO>f+PR)Z$oWtOz!R-K-b>+>4S-K7Eg^OWG-3ga%ZYEqJ z?F;u}xM%aS)Fp7Afy=sl4_wl@4lZZtLEr9z4+y!u(;O4*`c~y9eU~RU&A^j6w zkH`4JC7~gPd9y)6f_1$oOw>d<&{hsK6re8SJ1d@;Sly%_LPK1zX2qKB4uT(@l!xs* z#I3vk6sx!zwc4-Uoq&J-!4nVqB)Hjc-IwAu%5nF!5kAv_e**9aA9(kHi`DNRIQ_s) zk@2tIu47C`2R8l0Ehl_x{)xpW1~rF&_1N2|KE)R$R|{q58nXnZ2yM3z-wc603)=|$ z0qkkmQ?SQi55c|&yBBsB>_f2IU>jh!z}^G93HDCddf0Wae%Mv8%VBF^@x^4d0Co;+ z4lLov!;XR-2HO|*3fL~N9bgk+V`0BQIh}?*1xq8V#Y*k`2;bw_KDJeRyJL0%-Zp*= z(CkwhKf;-h+?jUJc|Yf5{bTXJ0Bs}A2z|Q$w+u&lFtxmzEK6i^p`Kf2y3pWMsA-Ggu zorX(&8j$!ug3|>qUtJS}oj#bS!Jm5L@nOO_4O;+z>a~_P3-@Br4L-#Q|01|M;TFR^ z0JjA0F}RE2Ho{#3H=$i<`kh2i4gYe44};4cGdXZEEmn)*E`^KC`>DU)0=F9OF1R&t zUxLfq4Nt+n6)yDoe$Fe?VwInB(q3?>9~=dj`oTGHzX`Vz?kc$TaCyh}Hn^+d?uC0h z+(U5va8JXngNsD~zFHsZ&1e?x(R>*n#=ihq7KHI9pO;7Q-xS85<+d}7 zfBRVQpOquXcoh8)Mesir!M`zrzhb2eGJ-!Xg1;|%P4YKIXiS??tt?&%5SN+h!cPPQDwp!tpiC)#!3g6VhtM*&rIVoN> zf{Q@9I@W*1PXqoGP-?um3DgEwaKJ zKabOTNRyrq`2FSu?zwJW^{@rM^D?h`$9mt?-K%c3-V-kOstc_25=MKm%fL08@cu*h zRh`T91}!C>8tB#Ek}x2Lu0kWX%6B=+Yqf=c7s9D)HRgbN$gfLrz`Vx5$L1*-58aXr(C$ntWasl-@9%9&apbo=-PD_ap>)Cn-|QGWonrr&$z8 z)5&6hx4o@2d9!#w+*%fiw{lmL*+MAmE zs5_G!QayO*qaPM^Zj%f}zfc3{sZWHEBH8PpJgwC!9SJ`%Iq|5uJ)C;QTEIQp#N<=y zSQFsB^O~UkiZMs4?m7KcJWdhxRtwNqH8rg_2({Y|dASRC2V#{uUx)jH@MeNzW3aP* zLQpKecyhd0VP^jGoOtQ_bcdXwkn;k;k;u1+PMn2-I8)JvcpqA*@#Ng;z_Lk`!#rmx zCmJYmvmAo?43sdB>2E6WpZn(vHb*vyYu8M&*PB z@9dDX6WovQ1BLF14twO#gyqZxzS+Qcqt3hC^GSHTN<;r}KIxg$E#cBi(`n7M(hB95 zM<@HVUPt2Y7=HbUeV~1pHt&4m&1^OYr3JIsq_5ApTUaC0KkE{DOt0 z)BlQSe5-B)JYB%u{yY&r8rXQgXbJkq3i$D?iuAjYQ#5Tc7vF)tG)!AGeR3QoA~V3- zEZv^RpxoRWEqS^$T*`*4xyjpgdym7;i&C_(Y~WZM$gcDSaZdVU5#~pGl)l`(8<*{c zQTjS?;~Y3SCnUEe8I-|%it}vK0rnRV+!GnCjY{njP^>WVkX0_kpNvUOO$8dKgmpvM z55SvP%^L|YeCvi?CVQMZxd!!{Cw*3cTRfS~?^`R@N!3v$PdJ1JzL3*kHm*?`*9RJxeIm{6F-;F1O!s6R z@6QemJnhFD2;?-HoV$~IP0VR1(j@&l`-fm$b2P5Md?j3lPxi?vJAVZl_lHjYh z#oT}q+;@ha^9rW3QsX+~&}o;IIUnZ>+#khu$8Y*D&+ZvLA9^&NCzLZ`!Us&doVF0J z?!maq_U;e)8k9}PPSoeIsLzcdd9u&u1;cmM@E?W1+h_g^4cpP{D;Mq0lp-asQW|SG|T$c{M;WSwRiHi6Id80NyoA8WC$PAr6&jU3~=ZXNt}HT z@98UZPPI}_Fvj#7T5eFL-(XJ5P#$tpuH|0Ct~(c^^(Ly1HQ&ssL4MZN|(1f_XMH&`!-6O2J_AHQg%53A&vI&sUAKB=EJ6bJ7BQ zFy$Ux&MEjNc_GU3Q@fmfQU_`g))ir&Sz#`{qts^bMar16IB#Jlx7c#nl30F}9?36b zgsz>CZ#xF)GAGrAF2k#5(F0|Gub(4r!z;t@ohYOBf%yCuVQAc&5x0-}!isC?-VRA5 zH$b=19Z>op&FoP`-Zc~(IZ*naqmYkjf^Qd1#}R#_KzOOnVKT7lh-fi^0sNNDRwL%Bi2{ z$C|qEaoaYMw|%C{`Oh=zdrsNOJlWMmIBWvUSqCNtUgU7|5)@dD8S#L<17&drx;4VO z@<{NVk@*p%61GDlm4y37kfDk$+Xl<;GS3ydJu^Mqc(mRl1>p%QCYJQ9(RVt?H`>hY zqUKI5n?4&0>pAr&oi!fz8^pugb#3F(v|OrTJb|?2o<<|-n>!3lymcKo*Udnjd8(a` zQ)hy7o!|@P7MLcrL%WgXjs%nn`(E~5?74zx)~2p+M%zeG9nikkglG(@cN>q? zz6rExzb`xRqALqm`y_uI(9ZiIfAKnhyz#@mvrc9n90g6EE3}LN?U!RWZ35z${@V1p z@tF621U*uFO(*ZMDA4k9p&_sRcAX#g10NyG3pg{kAEkc1iD08N?AJZXo~EW^Jad$l zJIKr(6p>3VC$3K8PeT8>11BxgEc}K>>J=VU-%%YkjpQWrXpHdX0OC&pUpfJXiGDs zd{F%0y7mED9bqqXV1s!T40{05OEO@68a78`wd>sn2q&)YPB?3hTU$eM)#BV%g6g4R zA!hyL; z!^}bbaA8c}vJceEM&EJ)VEkHN5W1>`3}pJ}FdIqG*Y3btN(Nv}ABe6-hjmapk$-6U ztT0cU^uN6jmV~fDL17SSVFo*4SBD83<%A6m6E@ii8xkgLjuSRCOjv;vc1@VDN+)bs zn6On&*tJ%e$@?7$yBztu&I&X9jZ+QiyKx2&VSbc=ts7weJ#jL=8~|@8gBxSQ;MfNo zvw`D6jYC$bI0F|^x!H&#A~hJHu%GLCFH%nMEKSqo)YWU$`?hD zfN45O%1V652@1ErIwBv_+>hopBfx%nuT*d>&Cw?C|uIGT0^)n*C6ktb1L|= z2GW7~v+?9OFwCnB_>AqInRS;rZ-d5%)8xW?I0KZKUa+SH5QSR1MzgdRi5|t znAAtdb5J^YP@a!p!AOPyu# zs;8O1V_E?7bIj3bC|&dGjDM9i} zC)A>shM5oCj5*gN%m?}-FLjzOwm0d|JE8YzNf%J;gh!I)gY(_se~?V8+CGCu?Eb`A`Br^aURVgyBO<= zLw;C(gj>&SohxRpSP7o=4B?5<*LQ@ru{$(1H|aKzu4k-fwqo@29Z}+!0%o3unSmK4 zSC+*Xm}$UsJz#FuF!s2~wL#uU$d<*@42{7({;dIhBn>4a z^CdItTKUZb=CfGWsn&WN@Y#`jd8VNF>iqxH4aE^cb=u5Mj*Y2+cqC(Q*rFs7@vxy&SYoPC6pD zQ->cqzO~--GVMA|dm;2ZJ(2dvAi8AykB8=OP9QywBV6qWmhaCmt-d;~Zv>@fcp&=z zNb3OyF=~=WZ7FBSPcWvO-PQ7FIfs_>KZp0GeI;qW?{)g3P^~3*-<)5sX!@X3^mm!( zxn{o*amIaxHGB3^52Kb#9~D`5&a9gC?o{+?>F5Kl*X@_>#9kFAq_n3+sKK2B?aAnL zxWh|KJ5P7rCf8zSoDNOTDBxS~gqeOM6`a_Jc90pS4c(70_C%vK9qyWznNP$+BmXdN zt&+Tjy8+qlcROI+v88@@r4!y#d+Y_;JHfJEc$Caa);alU?)bSN59=2Pzj#y!4jh2X z0BmvPE>~>9)DC{R8xwg^^#S8o8<{!%!{=1@xe=hoA6I<2&j>L7sZA=?JU2BpTF*`P zvw;sJTTl8FW&t=~1=!jT#KSTq!q)H*O7hiZqsbrXVYW0q z%vM|QpnmE2s$>0znl2kz-$+j?<1=5*L)+=8>!R@>I_RlvQjIXkm-7HFWFvFJmu$_O z%J>>#GgzhhLV6mNr^|+p8}vKq!HSiG2j};Q5RtMNn|#KT;LFOct#SCw+zVgMb*%3w z<)_Qb!Gp{>c(Ssx9Xxo_cxtk;YHR4}l$X$>I(EE}bg9%0x?1Sye0T65Uk)CfLlRO` zo0XL%cwBm#>N>7->XX4E^$>XCnUQdK0`#C+>wKxy`i{h--wmExzH4&G7@ZkipR@5= z1I*xa4O1}n8SqU_9h*>MaDkV2Y89x^^yvq9Ahu)p#Im9lW8!JI9_8iYK{|q`F+s!D zY=EP2>8Is*94|=l8{E#9b}{b;K)=`5lAk&fnvnBUi$`J><3aC}ir)C9hP;OP4fq~c zLq2|QZn&jkLBl*esdj_$GYjMNeEg2Z{2>=Jy=l-O&4)V`oiOTR|N1~c(ZDwR3&;=kDmE+Pa@|Q zD?p8VCw|-a0E-OL+794_(6e{~yTvHSQ12#tv^b~Z-g_GE9^_Z*2jKTw{E}||(r2*t z83G^fXAAxUC*ux9Ik;)eLK^ZFRfBsV0Z7f2z}D{f zVJz^OuemU9=F}9iO#l_HR>eMp;HEjz%2n_gFBe8A8`nUMtl7;aJL>qAAsJ(Hb&lOo z>T1ne^-P5EJC&rJT4m9QnNVW)sPTYdzPaa~x#mu=(9<%UwWWuA2gjqPS~(!5X#q^~ z-5QQ~bt(tGln|&+kZtw(*tVP_= zkOjZyI(146CKjYNhYow6m>UX0bRJzDHFGrE$&qN{`3)QXF=P%xcs_s{d)N0y_>#vg z4d!fa3$>0M9gqB$YFMm7Ag*~g=Yq^PmPj4(O#)2#Q)h+-f#mNdSn?{`=3L%H+g!BG znKs5Y^3QB@Y-_GYm)LJYYn=g!z8o{aar!QN+#ZfGhCb#??;NeTznI_2s?u;n85MI* z=}8LFJIJ~udllljMu*>mo`tS$cO)TNL zj4Qa!3K+7%aZ`_j_j^d3_JE)%X|N$l*BI?@*QbTxR_IA{w>~XKYNqZnwn>#T3+s)X zku{nDA}9Yi^2xmpN-c5tVc&(oGd`>jES*w>bN>$SJ#hU66MxIjBfsSl@>>z)Pnjiy zs8wY%f7!9OG{|3SkCE-Tc4N)}^R5Y+D$vMphnFKCuBnD^=!zuUis(o9OH-p|U%TYl zub7fr7ADlt?^m}*2sP*8h`$z8nDQ{SV;lptVZTGk%RN~@@8yUiz5+$LYX$sdPa?5< z)XIjbh|67$?0G!un`q&b%q4V{^Tx0`bsJzM^lF0;?(M+n%Ie`)K;1U5T1#~D1xW7o zEQCgfJvaAnn00X%n#uT;A1Rog!=4Msd2(}?LvSq9&gu|12fcSSBxIU34LQi2kuTRG zR94AKaN^EAJ2T??o=^2uev6$ zydbZ%qP%cqj}?X0J+A*oa^eVl)v>T_Vd)AV5R_Ms?6It>{JQG=MTKQ~)&0s!@~bMU zD~f9RrQ|UH0%h@1A}OSDG)#T6>6s# zhV`FaQeIF|Tit(5MOj%zdA~6guIbf-B_emsCQ1p+*VumDQ$!p&im@Y(X>yd|E|LMDQ`$SFt?+V&O@}K#@kWAR4MJFk kL_MP%h;ksxfhY%}9Efrt%7G{cq8x~FAj*ONXF2e{0JjR=6#xJL literal 311296 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Ρp{DM1AygZTn(%?}yyn_@n|V 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�w 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�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 R3an6Ig#s%S_+OR+|36NUagP81 diff --git a/Emu48.htm b/Emu48.htm index a0a4c0e..df540d5 100644 --- a/Emu48.htm +++ b/Emu48.htm @@ -83,8 +83,7 @@ h3 { color:red; font-size:1.1em; } 12.2 About Emu48...

13. DDE Server

-

14. Emu48+ Changes

-

15. License

+

14. License

1. General

@@ -96,9 +95,9 @@ h3 { color:red; font-size:1.1em; } Emu48 v1.0 under the GPL. Without this decision newer versions of the emulator wouldn't have been possible or ports to other similar calculators wouldn't have been made. Also a big thank to Jean-Yves - Avenard for his technical assistance in the beginning. And finally I - want to thank all the unnamed authors for publishing material about - these calculators.

+ Avenard for his technical assistance in the beginning. Lode Vandevenne + spend the PNG image decoder and finally I want to thank all the + unnamed authors for publishing material about these calculators.

3. ROM Images

Emu48 needs an image of a calculator ROM to be able to run. ROM images are valid in a packed (even address lower nibble, odd address @@ -590,51 +589,9 @@ h3 { color:red; font-size:1.1em; } HP object (normal HP object) -

14. Emu48+ Changes

-

Emu48+ is a modified version of Emu48 to add support for the ARM-based - calculators. It does not emulate the ARM CPU, but it enhances the - Saturn emulation to more closely match the emulation provided by the - Saturn emulator on the ARM-based calculators.

-

Emu48+ adds support for many of the Saturn+ instructions, including - some of the BUSCC instructions, and it also adds support for the 80-line - display used on the 49g+ and 50g.

-

At present, the additional calculators supported in Emu48+ are the - 49g+, 48gII (hardware revision 1), 50g, and 39g+/39gs/40gs.

-

To create KML scripts for the additional calculator models, use the - following model codes:

- - - - - - - - - - - - - - - - - - - - - -
39g+/39gs:Model "P"
- Class 39
40gs:Model "P"
- Class 40
48gII:Model "2"
49g+:Model "Q"
50g:Model "Q"
- Class 50
-

Most of the code that was changed in Emu48+ over Emu48 was provided by - Cyrille de Brebisson of Hewlett-Packard.

-

15. License

+

14. License

Emu48 - A HP38G/39G/40G/48SX/48GX/49G Emulator
- Copyright (C) 2017 Christoph Gießelink

-

Emu48+ - A 39g+/39gs/40gs/48gII/49g+/50g Emulator
- Copyright (C) 2017 Cyrille de Brebisson
- Additional changes by Bill Graves and Eric Rechlin

+ Copyright (C) 2018 Christoph Gießelink

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 of the License, or (at your option) diff --git a/PROBLEMS.TXT b/PROBLEMS.TXT index 90f7604..e7b8b24 100644 --- a/PROBLEMS.TXT +++ b/PROBLEMS.TXT @@ -1,10 +1,10 @@ -Additional known bugs and restrictions of Emu48 V1.57+ +Additional known bugs and restrictions of Emu48 V1.59+ ------------------------------------------------------ - some display issues, such as when scrolling up, that were fixed in regular Emu48 haven't yet been merged into Emu48+ -Known bugs and restrictions of Emu48 V1.59 +Known bugs and restrictions of Emu48 V1.61 ------------------------------------------ - the following I/O bits aren't emulated (incomplete) @@ -53,4 +53,4 @@ Known bugs and restrictions of Emu48 V1.59 - quitting the emulator while programming the flash isn't allowed, because the content of flash state machine isn't saved so far -08/15/17 (c) by Christoph Gießelink, c dot giesselink at gmx dot de +08/14/18 (c) by Christoph Gießelink, c dot giesselink at gmx dot de diff --git a/source/CHANGES.TXT b/source/CHANGES.TXT index a01143a..a5f89c5 100644 --- a/source/CHANGES.TXT +++ b/source/CHANGES.TXT @@ -1,4 +1,4 @@ -Service Pack 57+ based on Emu48 Service Pack 59 +Service Pack 59+ based on Emu48 Service Pack 61 See CHANGES.TXT in Emu48 for full history. Only changes specifically made to Emu48+ are shown below. diff --git a/source/DISPLAY.C b/source/DISPLAY.C index 28ea8d4..3dea432 100644 --- a/source/DISPLAY.C +++ b/source/DISPLAY.C @@ -348,7 +348,7 @@ VOID UpdateMainDisplay(VOID) EnterCriticalSection(&csGDILock); // solving NT GDI problems { // CdB for HP: add 64/80 line display for apples - StretchBlt(hWindowDC, nLcdX, nLcdY+Chipset.d0size*nLcdZoom, 131*nLcdZoom, MAINSCREENHEIGHT*nLcdZoom, + StretchBlt(hWindowDC, nLcdX, nLcdY+Chipset.d0size*nLcdZoom, 131*nLcdZoom*nGdiXZoom, MAINSCREENHEIGHT*nLcdZoom*nGdiYZoom, hLcdDC, Chipset.boffset, Chipset.d0size, 131, MAINSCREENHEIGHT, SRCCOPY); GdiFlush(); } @@ -392,8 +392,8 @@ VOID UpdateMenuDisplay(VOID) { // CdB for HP: add 64/80 line display for apples StretchBlt(hWindowDC, - nLcdX, nLcdY+(MAINSCREENHEIGHT+Chipset.d0size)*nLcdZoom, - 131*nLcdZoom, MENUHEIGHT*nLcdZoom, + nLcdX, nLcdY+(MAINSCREENHEIGHT+Chipset.d0size)*nLcdZoom*nGdiYZoom, + 131*nLcdZoom*nGdiXZoom, MENUHEIGHT*nLcdZoom*nGdiYZoom, hLcdDC, 0, (MAINSCREENHEIGHT+Chipset.d0size), 131, MENUHEIGHT, @@ -497,8 +497,8 @@ VOID WriteToMainDisplay(LPBYTE a, DWORD d, UINT s) if (y==y0) y++; EnterCriticalSection(&csGDILock); // solving NT GDI problems { - StretchBlt(hWindowDC, nLcdX, nLcdY+y0*nLcdZoom, - 131*nLcdZoom, (y-y0)*nLcdZoom, + StretchBlt(hWindowDC, nLcdX, nLcdY+y0*nLcdZoom*nGdiYZoom, + 131*nLcdZoom*nGdiXZoom, (y-y0)*nLcdZoom*nGdiYZoom, hLcdDC, Chipset.boffset, y0, 131, y-y0, SRCCOPY); // CdB for HP: add 64/80 line display for apples GdiFlush(); } @@ -554,8 +554,8 @@ VOID WriteToMenuDisplay(LPBYTE a, DWORD d, UINT s) if (y==y0) y++; EnterCriticalSection(&csGDILock); // solving NT GDI problems { - StretchBlt(hWindowDC, nLcdX, nLcdY+y0*nLcdZoom, - 131*nLcdZoom, (y-y0)*nLcdZoom, + StretchBlt(hWindowDC, nLcdX, nLcdY+y0*nLcdZoom*nGdiYZoom, + (131*nLcdZoom)*nGdiXZoom, (y-y0)*nLcdZoom*nGdiYZoom, hLcdDC, 0, y0, 131, y-y0, SRCCOPY); // CdB for HP: add 64/80 line display for apples GdiFlush(); } diff --git a/source/DISRPL.C b/source/DISRPL.C index 0d51e82..3120b53 100644 --- a/source/DISRPL.C +++ b/source/DISRPL.C @@ -266,7 +266,11 @@ static BOOL DoHexStream(DWORD *pdwAddr,String *str,UINT *pnLevel) } dwLength -= 5; // no. of DOCODE nibbles - PutFS(str,_T("%X "),dwLength); // write length information + PutFS(str,_T("%X"),dwLength); // write length information + if (dwLength > 0) // have data + { + PutC(str,_T(' ')); + } for (;dwLength > 0; --dwLength) { @@ -328,9 +332,9 @@ static BOOL DoIntStream(DWORD *pdwAddr,String *str,UINT *pnLevel) for (i = 0; i < dwLength; ++i) // read data pbyData[i] = RplReadNibble(pdwAddr); - if (dwLength == 1) // special implementation for zero + if (dwLength <= 1) // special implementation for zero { - _ASSERT(pbyData[0] == 0); + _ASSERT(dwLength == 0 || (dwLength == 1 && pbyData[0] == 0)); PutC(str,_T('0')); } else @@ -674,7 +678,11 @@ static BOOL DoHxs(DWORD *pdwAddr,String *str,UINT *pnLevel) PutS(str,_T("HXS ")); dwLength -= 5; // no. of HXS - PutFS(str,_T("%X "),dwLength); // write length information + PutFS(str,_T("%X"),dwLength); // write length information + if (dwLength > 0) // have data + { + PutC(str,_T(' ')); + } bRemove = TRUE; // remove leading zeros diff --git a/source/EMU48.C b/source/EMU48.C index c8e46e2..d192f67 100644 --- a/source/EMU48.C +++ b/source/EMU48.C @@ -13,7 +13,7 @@ #include "kml.h" #include "debugger.h" -#define VERSION "1.57+" +#define VERSION "1.59+" #ifdef _DEBUG LPCTSTR szNoTitle = _T("Emu48 ")_T(VERSION)_T(" Debug"); @@ -888,17 +888,17 @@ static LRESULT OnPaint(HWND hWindow) // redraw header display area StretchBlt(hPaintDC, nLcdX, nLcdY, 131*nLcdZoom*nGdiXZoom, Chipset.d0size*nLcdZoom*nGdiYZoom, - hLcdDC, Chipset.d0offset, 0, 131, Chipset.d0size, SRCCOPY); - + hLcdDC, Chipset.d0offset, 0, + 131, Chipset.d0size, SRCCOPY); // redraw main display area StretchBlt(hPaintDC, nLcdX, nLcdY+Chipset.d0size*nLcdZoom*nGdiYZoom, 131*nLcdZoom*nGdiXZoom, nLines*nLcdZoom*nGdiYZoom, hLcdDC, Chipset.boffset, Chipset.d0size, - 131, MAINSCREENHEIGHT, SRCCOPY); + 131, nLines, SRCCOPY); // redraw menu display area - StretchBlt(hPaintDC, nLcdX, nLcdY+(MAINSCREENHEIGHT+Chipset.d0size)*nLcdZoom*nGdiYZoom, + StretchBlt(hPaintDC, nLcdX, nLcdY+(nLines+Chipset.d0size)*nLcdZoom*nGdiYZoom, 131*nLcdZoom*nGdiXZoom, MENUHEIGHT*nLcdZoom*nGdiYZoom, - hLcdDC, 0, (MAINSCREENHEIGHT+Chipset.d0size), + hLcdDC, 0, (nLines+Chipset.d0size), 131, MENUHEIGHT, SRCCOPY); GdiFlush(); } @@ -1172,11 +1172,32 @@ static LRESULT OnViewCopy(VOID) WORD wBits; DWORD dwLen, dwSizeImage; - _ASSERT(nLcdZoom == 1 || nLcdZoom == 2 || nLcdZoom == 4); - hBmp = CreateCompatibleBitmap(hLcdDC,131*nLcdZoom,SCREENHEIGHT*nLcdZoom); // CdB for HP: add apples display stuff + _ASSERT(nLcdZoom >= 1 && nLcdZoom <= 4); + hBmp = CreateCompatibleBitmap(hLcdDC,131*nLcdZoom*nGdiXZoom,SCREENHEIGHT*nLcdZoom*nGdiYZoom); // CdB for HP: add apples display stuff hBmpDC = CreateCompatibleDC(hLcdDC); hBmp = (HBITMAP) SelectObject(hBmpDC,hBmp); - StretchBlt(hBmpDC,0,0,131*nLcdZoom,SCREENHEIGHT*nLcdZoom,hLcdDC,0,0, 131, SCREENHEIGHT, SRCCOPY); // CdB for HP: add apples display stuff + EnterCriticalSection(&csGDILock); // solving NT GDI problems + { + UINT nLines = MAINSCREENHEIGHT; + + // copy header display area + StretchBlt(hBmpDC, 0, 0, + 131*nLcdZoom*nGdiXZoom, Chipset.d0size*nLcdZoom*nGdiYZoom, + hLcdDC, Chipset.d0offset, 0, + 131, Chipset.d0size, SRCCOPY); + // copy main display area + StretchBlt(hBmpDC, 0, Chipset.d0size*nLcdZoom*nGdiYZoom, + 131*nLcdZoom*nGdiXZoom, nLines*nLcdZoom*nGdiYZoom, + hLcdDC, Chipset.boffset, Chipset.d0size, + 131, nLines, SRCCOPY); + // copy menu display area + StretchBlt(hBmpDC, 0, (nLines+Chipset.d0size)*nLcdZoom*nGdiYZoom, + 131*nLcdZoom*nGdiXZoom, MENUHEIGHT*nLcdZoom*nGdiYZoom, + hLcdDC, 0, (nLines+Chipset.d0size), + 131, MENUHEIGHT, SRCCOPY); + GdiFlush(); + } + LeaveCriticalSection(&csGDILock); hBmp = (HBITMAP) SelectObject(hBmpDC,hBmp); // fill BITMAP structure for size information diff --git a/source/EMU48.DSP b/source/EMU48.DSP index 5c6354e..11fe4bb 100644 --- a/source/EMU48.DSP +++ b/source/EMU48.DSP @@ -281,6 +281,12 @@ SOURCE=.\kml.c # End Source File # Begin Source File +SOURCE=.\lodepng.c +# ADD CPP /D "LODEPNG_NO_COMPILE_ENCODER" /D "LODEPNG_NO_COMPILE_DISK" /D "LODEPNG_NO_COMPILE_ERROR_TEXT" /D "LODEPNG_NO_COMPILE_CPP" +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + SOURCE=.\lowbat.c # End Source File # Begin Source File @@ -378,6 +384,10 @@ SOURCE=.\kml.h # End Source File # Begin Source File +SOURCE=.\lodepng.h +# End Source File +# Begin Source File + SOURCE=.\opcodes.h # End Source File # Begin Source File diff --git a/source/EMU48.RC b/source/EMU48.RC index aee5e04..4c779e5 100644 --- a/source/EMU48.RC +++ b/source/EMU48.RC @@ -295,7 +295,7 @@ FONT 8, "MS Sans Serif" BEGIN ICON IDI_EMU48,IDC_STATIC,7,6,20,20,SS_REALSIZEIMAGE LTEXT "",IDC_VERSION,29,6,151,8,NOT WS_GROUP - LTEXT "Copyright © 2017 Christoph Gießelink && Sébastien Carlier", + LTEXT "Copyright © 2018 Christoph Gießelink && Sébastien Carlier", IDC_STATIC,29,18,181,8 DEFPUSHBUTTON "OK",IDOK,215,12,39,14 EDITTEXT IDC_LICENSE,7,33,247,112,ES_MULTILINE | ES_AUTOHSCROLL | @@ -691,8 +691,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,5,7,0 - PRODUCTVERSION 1,5,7,0 + FILEVERSION 1,5,9,0 + PRODUCTVERSION 1,5,9,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -709,12 +709,12 @@ BEGIN BEGIN VALUE "CompanyName", "Christoph Gießelink & Sebastien Carlier\0" VALUE "FileDescription", "HP38/39/40/48/49/50 Emulator\0" - VALUE "FileVersion", "1, 5, 7, 0\0" + VALUE "FileVersion", "1, 5, 9, 0\0" VALUE "InternalName", "Emu48\0" - VALUE "LegalCopyright", "Copyright © 2017\0" + VALUE "LegalCopyright", "Copyright © 2018\0" VALUE "OriginalFilename", "Emu48.exe\0" VALUE "ProductName", "Emu48\0" - VALUE "ProductVersion", "1, 5, 7, 0\0" + VALUE "ProductVersion", "1, 5, 9, 0\0" END END BLOCK "VarFileInfo" diff --git a/source/EMU48DLL.DSP b/source/EMU48DLL.DSP index 0e4911d..a5d2eb3 100644 --- a/source/EMU48DLL.DSP +++ b/source/EMU48DLL.DSP @@ -168,6 +168,12 @@ SOURCE=.\kml.c # End Source File # Begin Source File +SOURCE=.\lodepng.c +# ADD CPP /D "LODEPNG_NO_COMPILE_ENCODER" /D "LODEPNG_NO_COMPILE_DISK" /D "LODEPNG_NO_COMPILE_ERROR_TEXT" /D "LODEPNG_NO_COMPILE_CPP" +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + SOURCE=.\lowbat.c # End Source File # Begin Source File @@ -265,6 +271,10 @@ SOURCE=.\kml.h # End Source File # Begin Source File +SOURCE=.\lodepng.h +# End Source File +# Begin Source File + SOURCE=.\opcodes.h # End Source File # Begin Source File diff --git a/source/FILES.C b/source/FILES.C index b79fa09..b235e72 100644 --- a/source/FILES.C +++ b/source/FILES.C @@ -13,6 +13,7 @@ #include "kml.h" #include "i28f160.h" // flash support #include "debugger.h" +#include "lodepng.h" #pragma intrinsic(abs,labs) @@ -101,7 +102,7 @@ VOID SetWindowLocation(HWND hWnd,INT nPosX,INT nPosY) DWORD GetCutPathName(LPCTSTR szFileName, LPTSTR szBuffer, DWORD dwBufferLength, INT nCutLength) { - TCHAR cPath[_MAX_PATH]; // full filename + TCHAR cPath[_MAX_PATH]; // full filename TCHAR cDrive[_MAX_DRIVE]; TCHAR cDir[_MAX_DIR]; TCHAR cFname[_MAX_FNAME]; @@ -112,9 +113,9 @@ DWORD GetCutPathName(LPCTSTR szFileName, LPTSTR szBuffer, DWORD dwBufferLength, // split original filename into parts _tsplitpath(szFileName,cDrive,cDir,cFname,cExt); - if (*cDir != 0) // contain directory part + if (*cDir != 0) // contain directory part { - LPTSTR lpFilePart; // address of file name in path + LPTSTR lpFilePart; // address of file name in path INT nNameLen,nPathLen,nMaxPathLen; GetFullPathName(szFileName,ARRAYSIZEOF(cPath),cPath,&lpFilePart); @@ -1480,8 +1481,8 @@ BOOL GetSaveObjectFilename(LPCTSTR lpstrFilter,LPCTSTR lpstrDefExt) WORD WriteStack(UINT nStkLevel,LPBYTE lpBuf,DWORD dwSize) // separated from LoadObject() { - BOOL bBinary; - DWORD dwAddress, i; + BOOL bBinary; + DWORD dwAddress, i; bBinary = ((lpBuf[dwSize+0]=='H') && (lpBuf[dwSize+1]=='P') @@ -1568,11 +1569,11 @@ BOOL LoadObject(LPCTSTR szFilename) // separated stack writing part BOOL SaveObject(LPCTSTR szFilename) // separated stack reading part { - HANDLE hFile; - LPBYTE pbyHeader; - DWORD lBytesWritten; - DWORD dwAddress; - DWORD dwLength; + HANDLE hFile; + LPBYTE pbyHeader; + DWORD lBytesWritten; + DWORD dwAddress; + DWORD dwLength; dwAddress = RPL_Pick(1); if (dwAddress == 0) @@ -1935,7 +1936,7 @@ static HBITMAP DecodeGif(LPBMPFILE pBmp,DWORD *pdwTransparentColor) // allocate buffer for pixels VERIFY(hBitmap = CreateDIBSection(hWindowDC, - (LPBITMAPINFO)&bmi, + &bmi, DIB_RGB_COLORS, (VOID **)&pbyPixels, NULL, @@ -2331,6 +2332,91 @@ quit: return hBitmap; } +static HBITMAP DecodePng(LPBMPFILE pBmp) +{ + // this implementation use the PNG image file decoder + // engine of Copyright (c) 2005-2018 Lode Vandevenne + + HBITMAP hBitmap; + + UINT uError,uWidth,uHeight; + INT nWidth,nHeight; + LONG lBytesPerLine; + + LPBYTE pbyImage; // PNG RGB image data + LPBYTE pbySrc; // source buffer pointer + LPBYTE pbyPixels; // BMP buffer + + BITMAPINFO bmi; + + hBitmap = NULL; + pbyImage = NULL; + + // decode PNG image + uError = lodepng_decode_memory(&pbyImage,&uWidth,&uHeight,pBmp->pbyFile,pBmp->dwFileSize,LCT_RGB,8); + if (uError) goto quit; + + ZeroMemory(&bmi,sizeof(bmi)); // init bitmap info + bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader); + bmi.bmiHeader.biWidth = (LONG) uWidth; + bmi.bmiHeader.biHeight = (LONG) uHeight; + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biBitCount = 24; // create a true color DIB + bmi.bmiHeader.biCompression = BI_RGB; + + // bitmap dimensions + lBytesPerLine = WIDTHBYTES(bmi.bmiHeader.biWidth * bmi.bmiHeader.biBitCount); + bmi.bmiHeader.biSizeImage = lBytesPerLine * bmi.bmiHeader.biHeight; + + // allocate buffer for pixels + VERIFY(hBitmap = CreateDIBSection(hWindowDC, + &bmi, + DIB_RGB_COLORS, + (VOID **)&pbyPixels, + NULL, + 0)); + if (hBitmap == NULL) goto quit; + + pbySrc = pbyImage; // init source loop pointer + + // fill bottom up DIB pixel buffer with color information + for (nHeight = bmi.bmiHeader.biHeight - 1; nHeight >= 0; --nHeight) + { + LPBYTE pbyLine = pbyPixels + nHeight * lBytesPerLine; + + for (nWidth = 0; nWidth < bmi.bmiHeader.biWidth; ++nWidth) + { + *pbyLine++ = pbySrc[2]; // blue + *pbyLine++ = pbySrc[1]; // green + *pbyLine++ = pbySrc[0]; // red + pbySrc += 3; + } + + _ASSERT((DWORD) (pbyLine - pbyPixels) <= bmi.bmiHeader.biSizeImage); + } + + if (hPalette == NULL) + { + hPalette = CreateBIPalette((PBITMAPINFOHEADER) &bmi); + // save old palette + hOldPalette = SelectPalette(hWindowDC, hPalette, FALSE); + RealizePalette(hWindowDC); + } + +quit: + if (pbyImage != NULL) // buffer for PNG image allocated + { + free(pbyImage); // free PNG image data + } + + if (hBitmap != NULL && uError != 0) // creation failed + { + DeleteObject(hBitmap); // delete bitmap + hBitmap = NULL; + } + return hBitmap; +} + HBITMAP LoadBitmapFile(LPCTSTR szFilename) { HANDLE hFile; @@ -2374,6 +2460,13 @@ HBITMAP LoadBitmapFile(LPCTSTR szFilename) break; } + // check for PNG file header + if (Bmp.dwFileSize >= 8 && memcmp(Bmp.pbyFile,"\x89PNG\r\n\x1a\n",8) == 0) + { + hBitmap = DecodePng(&Bmp); + break; + } + // unknown file type hBitmap = NULL; } @@ -2420,15 +2513,41 @@ static BOOL LabColorCmp(DWORD dwColor1,DWORD dwColor2,DWORD dwTol) return dwDiff > dwTol; // FALSE = colors match } +static DWORD EncodeColorBits(DWORD dwColorVal,DWORD dwMask) +{ + #define MAXBIT 32 + UINT uLshift = MAXBIT; + UINT uRshift = 8; + DWORD dwBitMask = dwMask; + + dwColorVal &= 0xFF; // the color component using the lowest 8 bit + + // position of highest bit + while ((dwBitMask & (1<<(MAXBIT-1))) == 0 && uLshift > 0) + { + dwBitMask <<= 1; // next bit + --uLshift; // next position + } + + if (uLshift > 24) // avoid overflow on 32bit mask + { + uLshift -= uRshift; // normalize left shift + uRshift = 0; + } + + return ((dwColorVal << uLshift) >> uRshift) & dwMask; + #undef MAXBIT +} + HRGN CreateRgnFromBitmap(HBITMAP hBmp,COLORREF color,DWORD dwTol) { #define ADD_RECTS_COUNT 256 BOOL (*fnColorCmp)(DWORD dwColor1,DWORD dwColor2,DWORD dwTol); + DWORD dwRed,dwGreen,dwBlue; HRGN hRgn; LPRGNDATA pRgnData; - BITMAP bm; LPBITMAPINFO bi; LPBYTE pbyBits; LPBYTE pbyColor; @@ -2438,7 +2557,6 @@ HRGN CreateRgnFromBitmap(HBITMAP hBmp,COLORREF color,DWORD dwTol) LONG x,y,xleft; BOOL bFoundLeft; BOOL bIsMask; - HDC hDC; if (dwTol >= 1000) // use CIE L*a*b compare { @@ -2450,16 +2568,13 @@ HRGN CreateRgnFromBitmap(HBITMAP hBmp,COLORREF color,DWORD dwTol) fnColorCmp = AbsColorCmp; } - // get image properties - GetObject(hBmp,sizeof(bm),&bm); - // allocate memory for extended image information incl. RGBQUAD color table bi = (LPBITMAPINFO) calloc(1,sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)); bi->bmiHeader.biSize = sizeof(bi->bmiHeader); + _ASSERT(bi->bmiHeader.biBitCount == 0); // for query without color table // get information about image - hDC = CreateCompatibleDC(hWindowDC); - GetDIBits(hDC,hBmp,0,bm.bmHeight,NULL,bi,DIB_RGB_COLORS); + GetDIBits(hWindowDC,hBmp,0,0,NULL,bi,DIB_RGB_COLORS); // DWORD aligned bitmap width in BYTES dwAlignedWidthBytes = WIDTHBYTES( bi->bmiHeader.biWidth @@ -2476,24 +2591,36 @@ HRGN CreateRgnFromBitmap(HBITMAP hBmp,COLORREF color,DWORD dwTol) pbyBits = (LPBYTE) malloc(bi->bmiHeader.biSizeImage); // fill bits buffer - GetDIBits(hDC,hBmp,0,bi->bmiHeader.biHeight,pbyBits,bi,DIB_RGB_COLORS); - DeleteDC(hDC); + GetDIBits(hWindowDC,hBmp,0,bi->bmiHeader.biHeight,pbyBits,bi,DIB_RGB_COLORS); - // convert color if current DC is 16-bit RGB coded - if (bi->bmiHeader.biBitCount == 16) + // convert color if current DC is 16-bit/32-bit bitfield coded + if (bi->bmiHeader.biCompression == BI_BITFIELDS) { - // for 15 bit (5:5:5) - color = ((color & 0xF80000) >> 19) - | ((color & 0x00F800) >> 6) - | ((color & 0x0000F8) << 7); + dwRed = *(LPDWORD) &bi->bmiColors[0]; + dwGreen = *(LPDWORD) &bi->bmiColors[1]; + dwBlue = *(LPDWORD) &bi->bmiColors[2]; } - else + else // RGB coded { - // convert COLORREF to RGBQUAD color - color = ((color & 0xFF0000) >> 16) - | ((color & 0x00FF00) >> 0) - | ((color & 0x0000FF) << 16); + // convert color if current DC is 16-bit RGB coded + if (bi->bmiHeader.biBitCount == 16) + { + // for 15 bit (5:5:5) + dwRed = 0x00007C00; + dwGreen = 0x000003E0; + dwBlue = 0x0000001F; + } + else + { + // convert COLORREF to RGBQUAD color + dwRed = 0x00FF0000; + dwGreen = 0x0000FF00; + dwBlue = 0x000000FF; + } } + color = EncodeColorBits((color >> 16), dwBlue) + | EncodeColorBits((color >> 8), dwGreen) + | EncodeColorBits((color >> 0), dwRed); dwBpp = bi->bmiHeader.biBitCount >> 3; // bytes per pixel @@ -2537,7 +2664,7 @@ HRGN CreateRgnFromBitmap(HBITMAP hBmp,COLORREF color,DWORD dwTol) } pbyColor += dwBpp; // shift pointer to next color - if (!bFoundLeft && bIsMask) // non transparent color found + if (!bFoundLeft && bIsMask) // non transparent color found { xleft = x; bFoundLeft = TRUE; diff --git a/source/KML.C b/source/KML.C index 5297d9e..a0fbdb3 100644 --- a/source/KML.C +++ b/source/KML.C @@ -1813,39 +1813,59 @@ static UINT iSqrt(UINT nNumber) // integer y=sqrt(x) function return b; } -static VOID AdjustPixel(UINT x, UINT y, BYTE byOffset) +static VOID AdjustPixel(LPBYTE pbyPixel, BYTE byOffset) { - COLORREF rgb; - WORD wB, wG, wR; + INT i = 3; // BGR colors - rgb = GetPixel(hWindowDC, x, y); - - // adjust color red - wR = (((WORD) rgb) & 0x00FF) + byOffset; - if (wR > 0xFF) wR = 0xFF; - rgb >>= 8; - // adjust color green - wG = (((WORD) rgb) & 0x00FF) + byOffset; - if (wG > 0xFF) wG = 0xFF; - rgb >>= 8; - // adjust color blue - wB = (((WORD) rgb) & 0x00FF) + byOffset; - if (wB > 0xFF) wB = 0xFF; - - SetPixel(hWindowDC, x, y, RGB(wR,wG,wB)); + while (--i >= 0) + { + WORD wColor = (WORD) *pbyPixel + byOffset; + // jumpless saturation to 0xFF + wColor = -(wColor >> 8) | (BYTE) wColor; + *pbyPixel++ = (BYTE) wColor; + } return; } -// draw transparent circle with center coordinates and radius in pixel -static __inline VOID TransparentCircle(UINT cx, UINT cy, UINT r) +// draw transparent circle button type +static __inline VOID TransparentCircle(UINT nOx, UINT nOy, UINT nCx, UINT nCy) { #define HIGHADJ 0x80 // color incr. at center #define LOWADJ 0x10 // color incr. at border - UINT x, y, rr, rrc; + BITMAPINFO bmi; + HDC hMemDC; + HBITMAP hMemBitMap; + LPBYTE pbyPixels; // BMP data + UINT x, y, cx, cy, r, rr, rrc; + + r = min(nCx,nCy) / 2; // radius if (r < 2) return; // radius 2 pixel minimum + // create memory copy of button rectangle + ZeroMemory(&bmi,sizeof(bmi)); + bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader); + bmi.bmiHeader.biWidth = (LONG) nCx; + bmi.bmiHeader.biHeight = (LONG) nCy; + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biBitCount = 32; // use 32 bit bitmap for easier buffer calculation + bmi.bmiHeader.biCompression = BI_RGB; + VERIFY(hMemBitMap = CreateDIBSection(hWindowDC, + &bmi, + DIB_RGB_COLORS, + (VOID **)&pbyPixels, + NULL, + 0)); + if (hMemBitMap == NULL) return; + + hMemDC = CreateCompatibleDC(hWindowDC); + hMemBitMap = (HBITMAP) SelectObject(hMemDC,hMemBitMap); + BitBlt(hMemDC, 0, 0, nCx, nCy, hWindowDC, nOx, nOy, SRCCOPY); + + cx = nCx / 2; // x-center coordinate + cy = nCy / 2; // y-center coordinate + rr = r * r; // calculate r^2 rrc = (r-1) * (r-1); // calculate (r-1)^2 for color steps @@ -1862,12 +1882,31 @@ static __inline VOID TransparentCircle(UINT cx, UINT cy, UINT r) // color offset, sqrt(x*x+y*y) < r !!! BYTE byOff = HIGHADJ - (BYTE) (iSqrt((x*x+yy) * (HIGHADJ-LOWADJ)*(HIGHADJ-LOWADJ) / rrc)); - AdjustPixel(cx+x, cy+y, byOff); - if (x != 0) AdjustPixel(cx-x, cy+y, byOff); - if (y != 0) AdjustPixel(cx+x, cy-y, byOff); - if (x != 0 && y != 0) AdjustPixel(cx-x, cy-y, byOff); + AdjustPixel(pbyPixels + (((cy+y) * bmi.bmiHeader.biWidth + (cx+x)) << 2), byOff); + + if (x != 0) + { + AdjustPixel(pbyPixels + (((cy+y) * bmi.bmiHeader.biWidth + (cx-x)) << 2), byOff); + } + + if (y != 0) + { + AdjustPixel(pbyPixels + (((cy-y) * bmi.bmiHeader.biWidth + (cx+x)) << 2), byOff); + } + + if (x != 0 && y != 0) + { + AdjustPixel(pbyPixels + (((cy-y) * bmi.bmiHeader.biWidth + (cx-x)) << 2), byOff); + } } } + + // update button area with modified data + BitBlt(hWindowDC, nOx, nOy, nCx, nCy, hMemDC, 0, 0, SRCCOPY); + + // delete memory bitmap + VERIFY(DeleteObject(SelectObject(hMemDC,hMemBitMap))); + DeleteDC(hMemDC); return; #undef HIGHADJ @@ -1948,9 +1987,7 @@ static VOID DrawButton(UINT nId) case 5: // transparent circle if (pButton[nId].bDown) { - TransparentCircle(x0 + pButton[nId].nCx / 2, // x-center coordinate - y0 + pButton[nId].nCy / 2, // y-center coordinate - min(pButton[nId].nCx,pButton[nId].nCy) / 2); // radius + TransparentCircle(x0, y0, pButton[nId].nCx, pButton[nId].nCy); } else { diff --git a/source/LODEPNG.C b/source/LODEPNG.C new file mode 100644 index 0000000..d67b3eb --- /dev/null +++ b/source/LODEPNG.C @@ -0,0 +1,6300 @@ +/* +LodePNG version 20180611 + +Copyright (c) 2005-2018 Lode Vandevenne + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +/* +The manual and changelog are in the header file "lodepng.h" +Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C. +*/ + +#include "lodepng.h" + +#include +#include +#include + +#if defined(_MSC_VER) && (_MSC_VER >= 1310) /*Visual Studio: A few warning types are not desired here.*/ +#pragma warning( disable : 4244 ) /*implicit conversions: not warned by gcc -Wall -Wextra and requires too much casts*/ +#pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/ +#endif /*_MSC_VER */ + +const char* LODEPNG_VERSION_STRING = "20180611"; + +/* +This source file is built up in the following large parts. The code sections +with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way. +-Tools for C and common code for PNG and Zlib +-C Code for Zlib (huffman, deflate, ...) +-C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...) +-The C++ wrapper around all of the above +*/ + +/*The malloc, realloc and free functions defined here with "lodepng_" in front +of the name, so that you can easily change them to others related to your +platform if needed. Everything else in the code calls these. Pass +-DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out +#define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and +define them in your own project's source files without needing to change +lodepng source code. Don't forget to remove "static" if you copypaste them +from here.*/ + +#ifdef LODEPNG_COMPILE_ALLOCATORS +static void* lodepng_malloc(size_t size) +{ +#ifdef LODEPNG_MAX_ALLOC + if(size > LODEPNG_MAX_ALLOC) return 0; +#endif + return malloc(size); +} + +static void* lodepng_realloc(void* ptr, size_t new_size) +{ +#ifdef LODEPNG_MAX_ALLOC + if(new_size > LODEPNG_MAX_ALLOC) return 0; +#endif + return realloc(ptr, new_size); +} + +static void lodepng_free(void* ptr) +{ + free(ptr); +} +#else /*LODEPNG_COMPILE_ALLOCATORS*/ +void* lodepng_malloc(size_t size); +void* lodepng_realloc(void* ptr, size_t new_size); +void lodepng_free(void* ptr); +#endif /*LODEPNG_COMPILE_ALLOCATORS*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // Tools for C, and common code for PNG and Zlib. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#define LODEPNG_MAX(a, b) (((a) > (b)) ? (a) : (b)) + +/* +Often in case of an error a value is assigned to a variable and then it breaks +out of a loop (to go to the cleanup phase of a function). This macro does that. +It makes the error handling code shorter and more readable. + +Example: if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83); +*/ +#define CERROR_BREAK(errorvar, code)\ +{\ + errorvar = code;\ + break;\ +} + +/*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/ +#define ERROR_BREAK(code) CERROR_BREAK(error, code) + +/*Set error var to the error code, and return it.*/ +#define CERROR_RETURN_ERROR(errorvar, code)\ +{\ + errorvar = code;\ + return code;\ +} + +/*Try the code, if it returns error, also return the error.*/ +#define CERROR_TRY_RETURN(call)\ +{\ + unsigned error = call;\ + if(error) return error;\ +} + +/*Set error var to the error code, and return from the void function.*/ +#define CERROR_RETURN(errorvar, code)\ +{\ + errorvar = code;\ + return;\ +} + +/* +About uivector, ucvector and string: +-All of them wrap dynamic arrays or text strings in a similar way. +-LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version. +-The string tools are made to avoid problems with compilers that declare things like strncat as deprecated. +-They're not used in the interface, only internally in this file as static functions. +-As with many other structs in this file, the init and cleanup functions serve as ctor and dtor. +*/ + +#ifdef LODEPNG_COMPILE_ZLIB +/*dynamic vector of unsigned ints*/ +typedef struct uivector +{ + unsigned* data; + size_t size; /*size in number of unsigned longs*/ + size_t allocsize; /*allocated size in bytes*/ +} uivector; + +static void uivector_cleanup(void* p) +{ + ((uivector*)p)->size = ((uivector*)p)->allocsize = 0; + lodepng_free(((uivector*)p)->data); + ((uivector*)p)->data = NULL; +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_reserve(uivector* p, size_t allocsize) +{ + if(allocsize > p->allocsize) + { + size_t newsize = (allocsize > p->allocsize * 2) ? allocsize : (allocsize * 3 / 2); + void* data = lodepng_realloc(p->data, newsize); + if(data) + { + p->allocsize = newsize; + p->data = (unsigned*)data; + } + else return 0; /*error: not enough memory*/ + } + return 1; +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_resize(uivector* p, size_t size) +{ + if(!uivector_reserve(p, size * sizeof(unsigned))) return 0; + p->size = size; + return 1; /*success*/ +} + +/*resize and give all new elements the value*/ +static unsigned uivector_resizev(uivector* p, size_t size, unsigned value) +{ + size_t oldsize = p->size, i; + if(!uivector_resize(p, size)) return 0; + for(i = oldsize; i < size; ++i) p->data[i] = value; + return 1; +} + +static void uivector_init(uivector* p) +{ + p->data = NULL; + p->size = p->allocsize = 0; +} + +#ifdef LODEPNG_COMPILE_ENCODER +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_push_back(uivector* p, unsigned c) +{ + if(!uivector_resize(p, p->size + 1)) return 0; + p->data[p->size - 1] = c; + return 1; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_ZLIB*/ + +/* /////////////////////////////////////////////////////////////////////////// */ + +/*dynamic vector of unsigned chars*/ +typedef struct ucvector +{ + unsigned char* data; + size_t size; /*used size*/ + size_t allocsize; /*allocated size*/ +} ucvector; + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned ucvector_reserve(ucvector* p, size_t allocsize) +{ + if(allocsize > p->allocsize) + { + size_t newsize = (allocsize > p->allocsize * 2) ? allocsize : (allocsize * 3 / 2); + void* data = lodepng_realloc(p->data, newsize); + if(data) + { + p->allocsize = newsize; + p->data = (unsigned char*)data; + } + else return 0; /*error: not enough memory*/ + } + return 1; +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned ucvector_resize(ucvector* p, size_t size) +{ + if(!ucvector_reserve(p, size * sizeof(unsigned char))) return 0; + p->size = size; + return 1; /*success*/ +} + +#ifdef LODEPNG_COMPILE_PNG + +static void ucvector_cleanup(void* p) +{ + ((ucvector*)p)->size = ((ucvector*)p)->allocsize = 0; + lodepng_free(((ucvector*)p)->data); + ((ucvector*)p)->data = NULL; +} + +static void ucvector_init(ucvector* p) +{ + p->data = NULL; + p->size = p->allocsize = 0; +} +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ZLIB +/*you can both convert from vector to buffer&size and vica versa. If you use +init_buffer to take over a buffer and size, it is not needed to use cleanup*/ +static void ucvector_init_buffer(ucvector* p, unsigned char* buffer, size_t size) +{ + p->data = buffer; + p->allocsize = p->size = size; +} +#endif /*LODEPNG_COMPILE_ZLIB*/ + +#if (defined(LODEPNG_COMPILE_PNG) && defined(LODEPNG_COMPILE_ANCILLARY_CHUNKS)) || defined(LODEPNG_COMPILE_ENCODER) +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned ucvector_push_back(ucvector* p, unsigned char c) +{ + if(!ucvector_resize(p, p->size + 1)) return 0; + p->data[p->size - 1] = c; + return 1; +} +#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ + + +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_PNG +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned string_resize(char** out, size_t size) +{ + char* data = (char*)lodepng_realloc(*out, size + 1); + if(data) + { + data[size] = 0; /*null termination char*/ + *out = data; + } + return data != 0; +} + +/*init a {char*, size_t} pair for use as string*/ +static void string_init(char** out) +{ + *out = NULL; + string_resize(out, 0); +} + +/*free the above pair again*/ +static void string_cleanup(char** out) +{ + lodepng_free(*out); + *out = NULL; +} + +static void string_set(char** out, const char* in) +{ + size_t insize = strlen(in), i; + if(string_resize(out, insize)) + { + for(i = 0; i != insize; ++i) + { + (*out)[i] = in[i]; + } + } +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +/* ////////////////////////////////////////////////////////////////////////// */ + +unsigned lodepng_read32bitInt(const unsigned char* buffer) +{ + return (unsigned)((buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]); +} + +#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER) +/*buffer must have at least 4 allocated bytes available*/ +static void lodepng_set32bitInt(unsigned char* buffer, unsigned value) +{ + buffer[0] = (unsigned char)((value >> 24) & 0xff); + buffer[1] = (unsigned char)((value >> 16) & 0xff); + buffer[2] = (unsigned char)((value >> 8) & 0xff); + buffer[3] = (unsigned char)((value ) & 0xff); +} +#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ + +#ifdef LODEPNG_COMPILE_ENCODER +static void lodepng_add32bitInt(ucvector* buffer, unsigned value) +{ + ucvector_resize(buffer, buffer->size + 4); /*todo: give error if resize failed*/ + lodepng_set32bitInt(&buffer->data[buffer->size - 4], value); +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / File IO / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_DISK + +/* returns negative value on error. This should be pure C compatible, so no fstat. */ +static long lodepng_filesize(const char* filename) +{ + FILE* file; + long size; + file = fopen(filename, "rb"); + if(!file) return -1; + + if(fseek(file, 0, SEEK_END) != 0) + { + fclose(file); + return -1; + } + + size = ftell(file); + /* It may give LONG_MAX as directory size, this is invalid for us. */ + if(size == LONG_MAX) size = -1; + + fclose(file); + return size; +} + +/* load file into buffer that already has the correct allocated size. Returns error code.*/ +static unsigned lodepng_buffer_file(unsigned char* out, size_t size, const char* filename) +{ + FILE* file; + size_t readsize; + file = fopen(filename, "rb"); + if(!file) return 78; + + readsize = fread(out, 1, size, file); + fclose(file); + + if (readsize != size) return 78; + return 0; +} + +unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename) +{ + long size = lodepng_filesize(filename); + if (size < 0) return 78; + *outsize = (size_t)size; + + *out = (unsigned char*)lodepng_malloc((size_t)size); + if(!(*out) && size > 0) return 83; /*the above malloc failed*/ + + return lodepng_buffer_file(*out, (size_t)size, filename); +} + +/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ +unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename) +{ + FILE* file; + file = fopen(filename, "wb" ); + if(!file) return 79; + fwrite((char*)buffer , 1 , buffersize, file); + fclose(file); + return 0; +} + +#endif /*LODEPNG_COMPILE_DISK*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // End of common code and tools. Begin of Zlib related code. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_ENCODER +/*TODO: this ignores potential out of memory errors*/ +#define addBitToStream(/*size_t**/ bitpointer, /*ucvector**/ bitstream, /*unsigned char*/ bit)\ +{\ + /*add a new byte at the end*/\ + if(((*bitpointer) & 7) == 0) ucvector_push_back(bitstream, (unsigned char)0);\ + /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/\ + (bitstream->data[bitstream->size - 1]) |= (bit << ((*bitpointer) & 0x7));\ + ++(*bitpointer);\ +} + +static void addBitsToStream(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) +{ + size_t i; + for(i = 0; i != nbits; ++i) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> i) & 1)); +} + +static void addBitsToStreamReversed(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) +{ + size_t i; + for(i = 0; i != nbits; ++i) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> (nbits - 1 - i)) & 1)); +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +#define READBIT(bitpointer, bitstream) ((bitstream[bitpointer >> 3] >> (bitpointer & 0x7)) & (unsigned char)1) + +static unsigned char readBitFromStream(size_t* bitpointer, const unsigned char* bitstream) +{ + unsigned char result = (unsigned char)(READBIT(*bitpointer, bitstream)); + ++(*bitpointer); + return result; +} + +static unsigned readBitsFromStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) +{ + unsigned result = 0, i; + for(i = 0; i != nbits; ++i) + { + result += ((unsigned)READBIT(*bitpointer, bitstream)) << i; + ++(*bitpointer); + } + return result; +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Deflate - Huffman / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#define FIRST_LENGTH_CODE_INDEX 257 +#define LAST_LENGTH_CODE_INDEX 285 +/*256 literals, the end code, some length codes, and 2 unused codes*/ +#define NUM_DEFLATE_CODE_SYMBOLS 288 +/*the distance codes have their own symbols, 30 used, 2 unused*/ +#define NUM_DISTANCE_SYMBOLS 32 +/*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/ +#define NUM_CODE_LENGTH_CODES 19 + +/*the base lengths represented by codes 257-285*/ +static const unsigned LENGTHBASE[29] + = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, + 67, 83, 99, 115, 131, 163, 195, 227, 258}; + +/*the extra bits used by codes 257-285 (added to base length)*/ +static const unsigned LENGTHEXTRA[29] + = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, 5, 5, 5, 5, 0}; + +/*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/ +static const unsigned DISTANCEBASE[30] + = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, + 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; + +/*the extra bits of backwards distances (added to base)*/ +static const unsigned DISTANCEEXTRA[30] + = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, + 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; + +/*the order in which "code length alphabet code lengths" are stored, out of this +the huffman tree of the dynamic huffman tree lengths is generated*/ +static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES] + = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + +/* ////////////////////////////////////////////////////////////////////////// */ + +/* +Huffman tree struct, containing multiple representations of the tree +*/ +typedef struct HuffmanTree +{ + unsigned* tree2d; + unsigned* tree1d; + unsigned* lengths; /*the lengths of the codes of the 1d-tree*/ + unsigned maxbitlen; /*maximum number of bits a single code can get*/ + unsigned numcodes; /*number of symbols in the alphabet = number of codes*/ +} HuffmanTree; + +/*function used for debug purposes to draw the tree in ascii art with C++*/ +/* +static void HuffmanTree_draw(HuffmanTree* tree) +{ + std::cout << "tree. length: " << tree->numcodes << " maxbitlen: " << tree->maxbitlen << std::endl; + for(size_t i = 0; i != tree->tree1d.size; ++i) + { + if(tree->lengths.data[i]) + std::cout << i << " " << tree->tree1d.data[i] << " " << tree->lengths.data[i] << std::endl; + } + std::cout << std::endl; +}*/ + +static void HuffmanTree_init(HuffmanTree* tree) +{ + tree->tree2d = 0; + tree->tree1d = 0; + tree->lengths = 0; +} + +static void HuffmanTree_cleanup(HuffmanTree* tree) +{ + lodepng_free(tree->tree2d); + lodepng_free(tree->tree1d); + lodepng_free(tree->lengths); +} + +/*the tree representation used by the decoder. return value is error*/ +static unsigned HuffmanTree_make2DTree(HuffmanTree* tree) +{ + unsigned nodefilled = 0; /*up to which node it is filled*/ + unsigned treepos = 0; /*position in the tree (1 of the numcodes columns)*/ + unsigned n, i; + + tree->tree2d = (unsigned*)lodepng_malloc(tree->numcodes * 2 * sizeof(unsigned)); + if(!tree->tree2d) return 83; /*alloc fail*/ + + /* + convert tree1d[] to tree2d[][]. In the 2D array, a value of 32767 means + uninited, a value >= numcodes is an address to another bit, a value < numcodes + is a code. The 2 rows are the 2 possible bit values (0 or 1), there are as + many columns as codes - 1. + A good huffman tree has N * 2 - 1 nodes, of which N - 1 are internal nodes. + Here, the internal nodes are stored (what their 0 and 1 option point to). + There is only memory for such good tree currently, if there are more nodes + (due to too long length codes), error 55 will happen + */ + for(n = 0; n < tree->numcodes * 2; ++n) + { + tree->tree2d[n] = 32767; /*32767 here means the tree2d isn't filled there yet*/ + } + + for(n = 0; n < tree->numcodes; ++n) /*the codes*/ + { + for(i = 0; i != tree->lengths[n]; ++i) /*the bits for this code*/ + { + unsigned char bit = (unsigned char)((tree->tree1d[n] >> (tree->lengths[n] - i - 1)) & 1); + /*oversubscribed, see comment in lodepng_error_text*/ + if(treepos > 2147483647 || treepos + 2 > tree->numcodes) return 55; + if(tree->tree2d[2 * treepos + bit] == 32767) /*not yet filled in*/ + { + if(i + 1 == tree->lengths[n]) /*last bit*/ + { + tree->tree2d[2 * treepos + bit] = n; /*put the current code in it*/ + treepos = 0; + } + else + { + /*put address of the next step in here, first that address has to be found of course + (it's just nodefilled + 1)...*/ + ++nodefilled; + /*addresses encoded with numcodes added to it*/ + tree->tree2d[2 * treepos + bit] = nodefilled + tree->numcodes; + treepos = nodefilled; + } + } + else treepos = tree->tree2d[2 * treepos + bit] - tree->numcodes; + } + } + + for(n = 0; n < tree->numcodes * 2; ++n) + { + if(tree->tree2d[n] == 32767) tree->tree2d[n] = 0; /*remove possible remaining 32767's*/ + } + + return 0; +} + +/* +Second step for the ...makeFromLengths and ...makeFromFrequencies functions. +numcodes, lengths and maxbitlen must already be filled in correctly. return +value is error. +*/ +static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) +{ + uivector blcount; + uivector nextcode; + unsigned error = 0; + unsigned bits, n; + + uivector_init(&blcount); + uivector_init(&nextcode); + + tree->tree1d = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned)); + if(!tree->tree1d) error = 83; /*alloc fail*/ + + if(!uivector_resizev(&blcount, tree->maxbitlen + 1, 0) + || !uivector_resizev(&nextcode, tree->maxbitlen + 1, 0)) + error = 83; /*alloc fail*/ + + if(!error) + { + /*step 1: count number of instances of each code length*/ + for(bits = 0; bits != tree->numcodes; ++bits) ++blcount.data[tree->lengths[bits]]; + /*step 2: generate the nextcode values*/ + for(bits = 1; bits <= tree->maxbitlen; ++bits) + { + nextcode.data[bits] = (nextcode.data[bits - 1] + blcount.data[bits - 1]) << 1; + } + /*step 3: generate all the codes*/ + for(n = 0; n != tree->numcodes; ++n) + { + if(tree->lengths[n] != 0) tree->tree1d[n] = nextcode.data[tree->lengths[n]]++; + } + } + + uivector_cleanup(&blcount); + uivector_cleanup(&nextcode); + + if(!error) return HuffmanTree_make2DTree(tree); + else return error; +} + +/* +given the code lengths (as stored in the PNG file), generate the tree as defined +by Deflate. maxbitlen is the maximum bits that a code in the tree can have. +return value is error. +*/ +static unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* bitlen, + size_t numcodes, unsigned maxbitlen) +{ + unsigned i; + tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned)); + if(!tree->lengths) return 83; /*alloc fail*/ + for(i = 0; i != numcodes; ++i) tree->lengths[i] = bitlen[i]; + tree->numcodes = (unsigned)numcodes; /*number of symbols*/ + tree->maxbitlen = maxbitlen; + return HuffmanTree_makeFromLengths2(tree); +} + +#ifdef LODEPNG_COMPILE_ENCODER + +/*BPM: Boundary Package Merge, see "A Fast and Space-Economical Algorithm for Length-Limited Coding", +Jyrki Katajainen, Alistair Moffat, Andrew Turpin, 1995.*/ + +/*chain node for boundary package merge*/ +typedef struct BPMNode +{ + int weight; /*the sum of all weights in this chain*/ + unsigned index; /*index of this leaf node (called "count" in the paper)*/ + struct BPMNode* tail; /*the next nodes in this chain (null if last)*/ + int in_use; +} BPMNode; + +/*lists of chains*/ +typedef struct BPMLists +{ + /*memory pool*/ + unsigned memsize; + BPMNode* memory; + unsigned numfree; + unsigned nextfree; + BPMNode** freelist; + /*two heads of lookahead chains per list*/ + unsigned listsize; + BPMNode** chains0; + BPMNode** chains1; +} BPMLists; + +/*creates a new chain node with the given parameters, from the memory in the lists */ +static BPMNode* bpmnode_create(BPMLists* lists, int weight, unsigned index, BPMNode* tail) +{ + unsigned i; + BPMNode* result; + + /*memory full, so garbage collect*/ + if(lists->nextfree >= lists->numfree) + { + /*mark only those that are in use*/ + for(i = 0; i != lists->memsize; ++i) lists->memory[i].in_use = 0; + for(i = 0; i != lists->listsize; ++i) + { + BPMNode* node; + for(node = lists->chains0[i]; node != 0; node = node->tail) node->in_use = 1; + for(node = lists->chains1[i]; node != 0; node = node->tail) node->in_use = 1; + } + /*collect those that are free*/ + lists->numfree = 0; + for(i = 0; i != lists->memsize; ++i) + { + if(!lists->memory[i].in_use) lists->freelist[lists->numfree++] = &lists->memory[i]; + } + lists->nextfree = 0; + } + + result = lists->freelist[lists->nextfree++]; + result->weight = weight; + result->index = index; + result->tail = tail; + return result; +} + +/*sort the leaves with stable mergesort*/ +static void bpmnode_sort(BPMNode* leaves, size_t num) +{ + BPMNode* mem = (BPMNode*)lodepng_malloc(sizeof(*leaves) * num); + size_t width, counter = 0; + for(width = 1; width < num; width *= 2) + { + BPMNode* a = (counter & 1) ? mem : leaves; + BPMNode* b = (counter & 1) ? leaves : mem; + size_t p; + for(p = 0; p < num; p += 2 * width) + { + size_t q = (p + width > num) ? num : (p + width); + size_t r = (p + 2 * width > num) ? num : (p + 2 * width); + size_t i = p, j = q, k; + for(k = p; k < r; k++) + { + if(i < q && (j >= r || a[i].weight <= a[j].weight)) b[k] = a[i++]; + else b[k] = a[j++]; + } + } + counter++; + } + if(counter & 1) memcpy(leaves, mem, sizeof(*leaves) * num); + lodepng_free(mem); +} + +/*Boundary Package Merge step, numpresent is the amount of leaves, and c is the current chain.*/ +static void boundaryPM(BPMLists* lists, BPMNode* leaves, size_t numpresent, int c, int num) +{ + unsigned lastindex = lists->chains1[c]->index; + + if(c == 0) + { + if(lastindex >= numpresent) return; + lists->chains0[c] = lists->chains1[c]; + lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, 0); + } + else + { + /*sum of the weights of the head nodes of the previous lookahead chains.*/ + int sum = lists->chains0[c - 1]->weight + lists->chains1[c - 1]->weight; + lists->chains0[c] = lists->chains1[c]; + if(lastindex < numpresent && sum > leaves[lastindex].weight) + { + lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, lists->chains1[c]->tail); + return; + } + lists->chains1[c] = bpmnode_create(lists, sum, lastindex, lists->chains1[c - 1]); + /*in the end we are only interested in the chain of the last list, so no + need to recurse if we're at the last one (this gives measurable speedup)*/ + if(num + 1 < (int)(2 * numpresent - 2)) + { + boundaryPM(lists, leaves, numpresent, c - 1, num); + boundaryPM(lists, leaves, numpresent, c - 1, num); + } + } +} + +unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, + size_t numcodes, unsigned maxbitlen) +{ + unsigned error = 0; + unsigned i; + size_t numpresent = 0; /*number of symbols with non-zero frequency*/ + BPMNode* leaves; /*the symbols, only those with > 0 frequency*/ + + if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/ + if((1u << maxbitlen) < (unsigned)numcodes) return 80; /*error: represent all symbols*/ + + leaves = (BPMNode*)lodepng_malloc(numcodes * sizeof(*leaves)); + if(!leaves) return 83; /*alloc fail*/ + + for(i = 0; i != numcodes; ++i) + { + if(frequencies[i] > 0) + { + leaves[numpresent].weight = (int)frequencies[i]; + leaves[numpresent].index = i; + ++numpresent; + } + } + + for(i = 0; i != numcodes; ++i) lengths[i] = 0; + + /*ensure at least two present symbols. There should be at least one symbol + according to RFC 1951 section 3.2.7. Some decoders incorrectly require two. To + make these work as well ensure there are at least two symbols. The + Package-Merge code below also doesn't work correctly if there's only one + symbol, it'd give it the theoritical 0 bits but in practice zlib wants 1 bit*/ + if(numpresent == 0) + { + lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/ + } + else if(numpresent == 1) + { + lengths[leaves[0].index] = 1; + lengths[leaves[0].index == 0 ? 1 : 0] = 1; + } + else + { + BPMLists lists; + BPMNode* node; + + bpmnode_sort(leaves, numpresent); + + lists.listsize = maxbitlen; + lists.memsize = 2 * maxbitlen * (maxbitlen + 1); + lists.nextfree = 0; + lists.numfree = lists.memsize; + lists.memory = (BPMNode*)lodepng_malloc(lists.memsize * sizeof(*lists.memory)); + lists.freelist = (BPMNode**)lodepng_malloc(lists.memsize * sizeof(BPMNode*)); + lists.chains0 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*)); + lists.chains1 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*)); + if(!lists.memory || !lists.freelist || !lists.chains0 || !lists.chains1) error = 83; /*alloc fail*/ + + if(!error) + { + for(i = 0; i != lists.memsize; ++i) lists.freelist[i] = &lists.memory[i]; + + bpmnode_create(&lists, leaves[0].weight, 1, 0); + bpmnode_create(&lists, leaves[1].weight, 2, 0); + + for(i = 0; i != lists.listsize; ++i) + { + lists.chains0[i] = &lists.memory[0]; + lists.chains1[i] = &lists.memory[1]; + } + + /*each boundaryPM call adds one chain to the last list, and we need 2 * numpresent - 2 chains.*/ + for(i = 2; i != 2 * numpresent - 2; ++i) boundaryPM(&lists, leaves, numpresent, (int)maxbitlen - 1, (int)i); + + for(node = lists.chains1[maxbitlen - 1]; node; node = node->tail) + { + for(i = 0; i != node->index; ++i) ++lengths[leaves[i].index]; + } + } + + lodepng_free(lists.memory); + lodepng_free(lists.freelist); + lodepng_free(lists.chains0); + lodepng_free(lists.chains1); + } + + lodepng_free(leaves); + return error; +} + +/*Create the Huffman tree given the symbol frequencies*/ +static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigned* frequencies, + size_t mincodes, size_t numcodes, unsigned maxbitlen) +{ + unsigned error = 0; + while(!frequencies[numcodes - 1] && numcodes > mincodes) --numcodes; /*trim zeroes*/ + tree->maxbitlen = maxbitlen; + tree->numcodes = (unsigned)numcodes; /*number of symbols*/ + tree->lengths = (unsigned*)lodepng_realloc(tree->lengths, numcodes * sizeof(unsigned)); + if(!tree->lengths) return 83; /*alloc fail*/ + /*initialize all lengths to 0*/ + memset(tree->lengths, 0, numcodes * sizeof(unsigned)); + + error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen); + if(!error) error = HuffmanTree_makeFromLengths2(tree); + return error; +} + +static unsigned HuffmanTree_getCode(const HuffmanTree* tree, unsigned index) +{ + return tree->tree1d[index]; +} + +static unsigned HuffmanTree_getLength(const HuffmanTree* tree, unsigned index) +{ + return tree->lengths[index]; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/ +static unsigned generateFixedLitLenTree(HuffmanTree* tree) +{ + unsigned i, error = 0; + unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); + if(!bitlen) return 83; /*alloc fail*/ + + /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/ + for(i = 0; i <= 143; ++i) bitlen[i] = 8; + for(i = 144; i <= 255; ++i) bitlen[i] = 9; + for(i = 256; i <= 279; ++i) bitlen[i] = 7; + for(i = 280; i <= 287; ++i) bitlen[i] = 8; + + error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15); + + lodepng_free(bitlen); + return error; +} + +/*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/ +static unsigned generateFixedDistanceTree(HuffmanTree* tree) +{ + unsigned i, error = 0; + unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); + if(!bitlen) return 83; /*alloc fail*/ + + /*there are 32 distance codes, but 30-31 are unused*/ + for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen[i] = 5; + error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15); + + lodepng_free(bitlen); + return error; +} + +#ifdef LODEPNG_COMPILE_DECODER + +/* +returns the code, or (unsigned)(-1) if error happened +inbitlength is the length of the complete buffer, in bits (so its byte length times 8) +*/ +static unsigned huffmanDecodeSymbol(const unsigned char* in, size_t* bp, + const HuffmanTree* codetree, size_t inbitlength) +{ + unsigned treepos = 0, ct; + for(;;) + { + if(*bp >= inbitlength) return (unsigned)(-1); /*error: end of input memory reached without endcode*/ + /* + decode the symbol from the tree. The "readBitFromStream" code is inlined in + the expression below because this is the biggest bottleneck while decoding + */ + ct = codetree->tree2d[(treepos << 1) + READBIT(*bp, in)]; + ++(*bp); + if(ct < codetree->numcodes) return ct; /*the symbol is decoded, return it*/ + else treepos = ct - codetree->numcodes; /*symbol not yet decoded, instead move tree position*/ + + if(treepos >= codetree->numcodes) return (unsigned)(-1); /*error: it appeared outside the codetree*/ + } +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Inflator (Decompressor) / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*get the tree of a deflated block with fixed tree, as specified in the deflate specification*/ +static void getTreeInflateFixed(HuffmanTree* tree_ll, HuffmanTree* tree_d) +{ + /*TODO: check for out of memory errors*/ + generateFixedLitLenTree(tree_ll); + generateFixedDistanceTree(tree_d); +} + +/*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/ +static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d, + const unsigned char* in, size_t* bp, size_t inlength) +{ + /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/ + unsigned error = 0; + unsigned n, HLIT, HDIST, HCLEN, i; + size_t inbitlength = inlength * 8; + + /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/ + unsigned* bitlen_ll = 0; /*lit,len code lengths*/ + unsigned* bitlen_d = 0; /*dist code lengths*/ + /*code length code lengths ("clcl"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/ + unsigned* bitlen_cl = 0; + HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/ + + if((*bp) + 14 > (inlength << 3)) return 49; /*error: the bit pointer is or will go past the memory*/ + + /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/ + HLIT = readBitsFromStream(bp, in, 5) + 257; + /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/ + HDIST = readBitsFromStream(bp, in, 5) + 1; + /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/ + HCLEN = readBitsFromStream(bp, in, 4) + 4; + + if((*bp) + HCLEN * 3 > (inlength << 3)) return 50; /*error: the bit pointer is or will go past the memory*/ + + HuffmanTree_init(&tree_cl); + + while(!error) + { + /*read the code length codes out of 3 * (amount of code length codes) bits*/ + + bitlen_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned)); + if(!bitlen_cl) ERROR_BREAK(83 /*alloc fail*/); + + for(i = 0; i != NUM_CODE_LENGTH_CODES; ++i) + { + if(i < HCLEN) bitlen_cl[CLCL_ORDER[i]] = readBitsFromStream(bp, in, 3); + else bitlen_cl[CLCL_ORDER[i]] = 0; /*if not, it must stay 0*/ + } + + error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7); + if(error) break; + + /*now we can use this tree to read the lengths for the tree that this function will return*/ + bitlen_ll = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); + bitlen_d = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); + if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/); + for(i = 0; i != NUM_DEFLATE_CODE_SYMBOLS; ++i) bitlen_ll[i] = 0; + for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen_d[i] = 0; + + /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/ + i = 0; + while(i < HLIT + HDIST) + { + unsigned code = huffmanDecodeSymbol(in, bp, &tree_cl, inbitlength); + if(code <= 15) /*a length code*/ + { + if(i < HLIT) bitlen_ll[i] = code; + else bitlen_d[i - HLIT] = code; + ++i; + } + else if(code == 16) /*repeat previous*/ + { + unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/ + unsigned value; /*set value to the previous code*/ + + if(i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/ + + if((*bp + 2) > inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ + replength += readBitsFromStream(bp, in, 2); + + if(i < HLIT + 1) value = bitlen_ll[i - 1]; + else value = bitlen_d[i - HLIT - 1]; + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; ++n) + { + if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/ + if(i < HLIT) bitlen_ll[i] = value; + else bitlen_d[i - HLIT] = value; + ++i; + } + } + else if(code == 17) /*repeat "0" 3-10 times*/ + { + unsigned replength = 3; /*read in the bits that indicate repeat length*/ + if((*bp + 3) > inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ + replength += readBitsFromStream(bp, in, 3); + + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; ++n) + { + if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/ + + if(i < HLIT) bitlen_ll[i] = 0; + else bitlen_d[i - HLIT] = 0; + ++i; + } + } + else if(code == 18) /*repeat "0" 11-138 times*/ + { + unsigned replength = 11; /*read in the bits that indicate repeat length*/ + if((*bp + 7) > inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ + replength += readBitsFromStream(bp, in, 7); + + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; ++n) + { + if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/ + + if(i < HLIT) bitlen_ll[i] = 0; + else bitlen_d[i - HLIT] = 0; + ++i; + } + } + else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ + { + if(code == (unsigned)(-1)) + { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + error = (*bp) > inbitlength ? 10 : 11; + } + else error = 16; /*unexisting code, this can never happen*/ + break; + } + } + if(error) break; + + if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/ + + /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/ + error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15); + if(error) break; + error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15); + + break; /*end of error-while*/ + } + + lodepng_free(bitlen_cl); + lodepng_free(bitlen_ll); + lodepng_free(bitlen_d); + HuffmanTree_cleanup(&tree_cl); + + return error; +} + +/*inflate a block with dynamic of fixed Huffman tree*/ +static unsigned inflateHuffmanBlock(ucvector* out, const unsigned char* in, size_t* bp, + size_t* pos, size_t inlength, unsigned btype) +{ + unsigned error = 0; + HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/ + HuffmanTree tree_d; /*the huffman tree for distance codes*/ + size_t inbitlength = inlength * 8; + + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + + if(btype == 1) getTreeInflateFixed(&tree_ll, &tree_d); + else if(btype == 2) error = getTreeInflateDynamic(&tree_ll, &tree_d, in, bp, inlength); + + while(!error) /*decode all symbols until end reached, breaks at end code*/ + { + /*code_ll is literal, length or end code*/ + unsigned code_ll = huffmanDecodeSymbol(in, bp, &tree_ll, inbitlength); + if(code_ll <= 255) /*literal symbol*/ + { + /*ucvector_push_back would do the same, but for some reason the two lines below run 10% faster*/ + if(!ucvector_resize(out, (*pos) + 1)) ERROR_BREAK(83 /*alloc fail*/); + out->data[*pos] = (unsigned char)code_ll; + ++(*pos); + } + else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) /*length code*/ + { + unsigned code_d, distance; + unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/ + size_t start, forward, backward, length; + + /*part 1: get length base*/ + length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX]; + + /*part 2: get extra bits and add the value of that to length*/ + numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX]; + if((*bp + numextrabits_l) > inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ + length += readBitsFromStream(bp, in, numextrabits_l); + + /*part 3: get distance code*/ + code_d = huffmanDecodeSymbol(in, bp, &tree_d, inbitlength); + if(code_d > 29) + { + if(code_d == (unsigned)(-1)) /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ + { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + error = (*bp) > inlength * 8 ? 10 : 11; + } + else error = 18; /*error: invalid distance code (30-31 are never used)*/ + break; + } + distance = DISTANCEBASE[code_d]; + + /*part 4: get extra bits from distance*/ + numextrabits_d = DISTANCEEXTRA[code_d]; + if((*bp + numextrabits_d) > inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ + distance += readBitsFromStream(bp, in, numextrabits_d); + + /*part 5: fill in all the out[n] values based on the length and dist*/ + start = (*pos); + if(distance > start) ERROR_BREAK(52); /*too long backward distance*/ + backward = start - distance; + + if(!ucvector_resize(out, (*pos) + length)) ERROR_BREAK(83 /*alloc fail*/); + if (distance < length) { + for(forward = 0; forward < length; ++forward) + { + out->data[(*pos)++] = out->data[backward++]; + } + } else { + memcpy(out->data + *pos, out->data + backward, length); + *pos += length; + } + } + else if(code_ll == 256) + { + break; /*end code, break the loop*/ + } + else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ + { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + error = ((*bp) > inlength * 8) ? 10 : 11; + break; + } + } + + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + + return error; +} + +static unsigned inflateNoCompression(ucvector* out, const unsigned char* in, size_t* bp, size_t* pos, size_t inlength) +{ + size_t p; + unsigned LEN, NLEN, n, error = 0; + + /*go to first boundary of byte*/ + while(((*bp) & 0x7) != 0) ++(*bp); + p = (*bp) / 8; /*byte position*/ + + /*read LEN (2 bytes) and NLEN (2 bytes)*/ + if(p + 4 >= inlength) return 52; /*error, bit pointer will jump past memory*/ + LEN = in[p] + 256u * in[p + 1]; p += 2; + NLEN = in[p] + 256u * in[p + 1]; p += 2; + + /*check if 16-bit NLEN is really the one's complement of LEN*/ + if(LEN + NLEN != 65535) return 21; /*error: NLEN is not one's complement of LEN*/ + + if(!ucvector_resize(out, (*pos) + LEN)) return 83; /*alloc fail*/ + + /*read the literal data: LEN bytes are now stored in the out buffer*/ + if(p + LEN > inlength) return 23; /*error: reading outside of in buffer*/ + for(n = 0; n < LEN; ++n) out->data[(*pos)++] = in[p++]; + + (*bp) = p * 8; + + return error; +} + +static unsigned lodepng_inflatev(ucvector* out, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings) +{ + /*bit pointer in the "in" data, current byte is bp >> 3, current bit is bp & 0x7 (from lsb to msb of the byte)*/ + size_t bp = 0; + unsigned BFINAL = 0; + size_t pos = 0; /*byte position in the out buffer*/ + unsigned error = 0; + + (void)settings; + + while(!BFINAL) + { + unsigned BTYPE; + if(bp + 2 >= insize * 8) return 52; /*error, bit pointer will jump past memory*/ + BFINAL = readBitFromStream(&bp, in); + BTYPE = 1u * readBitFromStream(&bp, in); + BTYPE += 2u * readBitFromStream(&bp, in); + + if(BTYPE == 3) return 20; /*error: invalid BTYPE*/ + else if(BTYPE == 0) error = inflateNoCompression(out, in, &bp, &pos, insize); /*no compression*/ + else error = inflateHuffmanBlock(out, in, &bp, &pos, insize, BTYPE); /*compression, BTYPE 01 or 10*/ + + if(error) return error; + } + + return error; +} + +unsigned lodepng_inflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings) +{ + unsigned error; + ucvector v; + ucvector_init_buffer(&v, *out, *outsize); + error = lodepng_inflatev(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +static unsigned inflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings) +{ + if(settings->custom_inflate) + { + return settings->custom_inflate(out, outsize, in, insize, settings); + } + else + { + return lodepng_inflate(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Deflator (Compressor) / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static const size_t MAX_SUPPORTED_DEFLATE_LENGTH = 258; + +/*bitlen is the size in bits of the code*/ +static void addHuffmanSymbol(size_t* bp, ucvector* compressed, unsigned code, unsigned bitlen) +{ + addBitsToStreamReversed(bp, compressed, code, bitlen); +} + +/*search the index in the array, that has the largest value smaller than or equal to the given value, +given array must be sorted (if no value is smaller, it returns the size of the given array)*/ +static size_t searchCodeIndex(const unsigned* array, size_t array_size, size_t value) +{ + /*binary search (only small gain over linear). TODO: use CPU log2 instruction for getting symbols instead*/ + size_t left = 1; + size_t right = array_size - 1; + + while(left <= right) { + size_t mid = (left + right) >> 1; + if (array[mid] >= value) right = mid - 1; + else left = mid + 1; + } + if(left >= array_size || array[left] > value) left--; + return left; +} + +static void addLengthDistance(uivector* values, size_t length, size_t distance) +{ + /*values in encoded vector are those used by deflate: + 0-255: literal bytes + 256: end + 257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits) + 286-287: invalid*/ + + unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length); + unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]); + unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance); + unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]); + + uivector_push_back(values, length_code + FIRST_LENGTH_CODE_INDEX); + uivector_push_back(values, extra_length); + uivector_push_back(values, dist_code); + uivector_push_back(values, extra_distance); +} + +/*3 bytes of data get encoded into two bytes. The hash cannot use more than 3 +bytes as input because 3 is the minimum match length for deflate*/ +static const unsigned HASH_NUM_VALUES = 65536; +static const unsigned HASH_BIT_MASK = 65535; /*HASH_NUM_VALUES - 1, but C90 does not like that as initializer*/ + +typedef struct Hash +{ + int* head; /*hash value to head circular pos - can be outdated if went around window*/ + /*circular pos to prev circular pos*/ + unsigned short* chain; + int* val; /*circular pos to hash value*/ + + /*TODO: do this not only for zeros but for any repeated byte. However for PNG + it's always going to be the zeros that dominate, so not important for PNG*/ + int* headz; /*similar to head, but for chainz*/ + unsigned short* chainz; /*those with same amount of zeros*/ + unsigned short* zeros; /*length of zeros streak, used as a second hash chain*/ +} Hash; + +static unsigned hash_init(Hash* hash, unsigned windowsize) +{ + unsigned i; + hash->head = (int*)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES); + hash->val = (int*)lodepng_malloc(sizeof(int) * windowsize); + hash->chain = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); + + hash->zeros = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); + hash->headz = (int*)lodepng_malloc(sizeof(int) * (MAX_SUPPORTED_DEFLATE_LENGTH + 1)); + hash->chainz = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); + + if(!hash->head || !hash->chain || !hash->val || !hash->headz|| !hash->chainz || !hash->zeros) + { + return 83; /*alloc fail*/ + } + + /*initialize hash table*/ + for(i = 0; i != HASH_NUM_VALUES; ++i) hash->head[i] = -1; + for(i = 0; i != windowsize; ++i) hash->val[i] = -1; + for(i = 0; i != windowsize; ++i) hash->chain[i] = i; /*same value as index indicates uninitialized*/ + + for(i = 0; i <= MAX_SUPPORTED_DEFLATE_LENGTH; ++i) hash->headz[i] = -1; + for(i = 0; i != windowsize; ++i) hash->chainz[i] = i; /*same value as index indicates uninitialized*/ + + return 0; +} + +static void hash_cleanup(Hash* hash) +{ + lodepng_free(hash->head); + lodepng_free(hash->val); + lodepng_free(hash->chain); + + lodepng_free(hash->zeros); + lodepng_free(hash->headz); + lodepng_free(hash->chainz); +} + + + +static unsigned getHash(const unsigned char* data, size_t size, size_t pos) +{ + unsigned result = 0; + if(pos + 2 < size) + { + /*A simple shift and xor hash is used. Since the data of PNGs is dominated + by zeroes due to the filters, a better hash does not have a significant + effect on speed in traversing the chain, and causes more time spend on + calculating the hash.*/ + result ^= (unsigned)(data[pos + 0] << 0u); + result ^= (unsigned)(data[pos + 1] << 4u); + result ^= (unsigned)(data[pos + 2] << 8u); + } else { + size_t amount, i; + if(pos >= size) return 0; + amount = size - pos; + for(i = 0; i != amount; ++i) result ^= (unsigned)(data[pos + i] << (i * 8u)); + } + return result & HASH_BIT_MASK; +} + +static unsigned countZeros(const unsigned char* data, size_t size, size_t pos) +{ + const unsigned char* start = data + pos; + const unsigned char* end = start + MAX_SUPPORTED_DEFLATE_LENGTH; + if(end > data + size) end = data + size; + data = start; + while(data != end && *data == 0) ++data; + /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/ + return (unsigned)(data - start); +} + +/*wpos = pos & (windowsize - 1)*/ +static void updateHashChain(Hash* hash, size_t wpos, unsigned hashval, unsigned short numzeros) +{ + hash->val[wpos] = (int)hashval; + if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval]; + hash->head[hashval] = (int)wpos; + + hash->zeros[wpos] = numzeros; + if(hash->headz[numzeros] != -1) hash->chainz[wpos] = hash->headz[numzeros]; + hash->headz[numzeros] = (int)wpos; +} + +/* +LZ77-encode the data. Return value is error code. The input are raw bytes, the output +is in the form of unsigned integers with codes representing for example literal bytes, or +length/distance pairs. +It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a +sliding window (of windowsize) is used, and all past bytes in that window can be used as +the "dictionary". A brute force search through all possible distances would be slow, and +this hash technique is one out of several ways to speed this up. +*/ +static unsigned encodeLZ77(uivector* out, Hash* hash, + const unsigned char* in, size_t inpos, size_t insize, unsigned windowsize, + unsigned minmatch, unsigned nicematch, unsigned lazymatching) +{ + size_t pos; + unsigned i, error = 0; + /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/ + unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8; + unsigned maxlazymatch = windowsize >= 8192 ? (unsigned)MAX_SUPPORTED_DEFLATE_LENGTH : 64; + + unsigned usezeros = 1; /*not sure if setting it to false for windowsize < 8192 is better or worse*/ + unsigned numzeros = 0; + + unsigned offset; /*the offset represents the distance in LZ77 terminology*/ + unsigned length; + unsigned lazy = 0; + unsigned lazylength = 0, lazyoffset = 0; + unsigned hashval; + unsigned current_offset, current_length; + unsigned prev_offset; + const unsigned char *lastptr, *foreptr, *backptr; + unsigned hashpos; + + if(windowsize == 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/ + if((windowsize & (windowsize - 1)) != 0) return 90; /*error: must be power of two*/ + + if(nicematch > MAX_SUPPORTED_DEFLATE_LENGTH) nicematch = (unsigned)MAX_SUPPORTED_DEFLATE_LENGTH; + + for(pos = inpos; pos < insize; ++pos) + { + size_t wpos = pos & (windowsize - 1); /*position for in 'circular' hash buffers*/ + unsigned chainlength = 0; + + hashval = getHash(in, insize, pos); + + if(usezeros && hashval == 0) + { + if(numzeros == 0) numzeros = countZeros(in, insize, pos); + else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; + } + else + { + numzeros = 0; + } + + updateHashChain(hash, wpos, hashval, numzeros); + + /*the length and offset found for the current position*/ + length = 0; + offset = 0; + + hashpos = hash->chain[wpos]; + + lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH]; + + /*search for the longest string*/ + prev_offset = 0; + for(;;) + { + if(chainlength++ >= maxchainlength) break; + current_offset = (unsigned)(hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize); + + if(current_offset < prev_offset) break; /*stop when went completely around the circular buffer*/ + prev_offset = current_offset; + if(current_offset > 0) + { + /*test the next characters*/ + foreptr = &in[pos]; + backptr = &in[pos - current_offset]; + + /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/ + if(numzeros >= 3) + { + unsigned skip = hash->zeros[hashpos]; + if(skip > numzeros) skip = numzeros; + backptr += skip; + foreptr += skip; + } + + while(foreptr != lastptr && *backptr == *foreptr) /*maximum supported length by deflate is max length*/ + { + ++backptr; + ++foreptr; + } + current_length = (unsigned)(foreptr - &in[pos]); + + if(current_length > length) + { + length = current_length; /*the longest length*/ + offset = current_offset; /*the offset that is related to this longest length*/ + /*jump out once a length of max length is found (speed gain). This also jumps + out if length is MAX_SUPPORTED_DEFLATE_LENGTH*/ + if(current_length >= nicematch) break; + } + } + + if(hashpos == hash->chain[hashpos]) break; + + if(numzeros >= 3 && length > numzeros) + { + hashpos = hash->chainz[hashpos]; + if(hash->zeros[hashpos] != numzeros) break; + } + else + { + hashpos = hash->chain[hashpos]; + /*outdated hash value, happens if particular value was not encountered in whole last window*/ + if(hash->val[hashpos] != (int)hashval) break; + } + } + + if(lazymatching) + { + if(!lazy && length >= 3 && length <= maxlazymatch && length < MAX_SUPPORTED_DEFLATE_LENGTH) + { + lazy = 1; + lazylength = length; + lazyoffset = offset; + continue; /*try the next byte*/ + } + if(lazy) + { + lazy = 0; + if(pos == 0) ERROR_BREAK(81); + if(length > lazylength + 1) + { + /*push the previous character as literal*/ + if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/); + } + else + { + length = lazylength; + offset = lazyoffset; + hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/ + hash->headz[numzeros] = -1; /*idem*/ + --pos; + } + } + } + if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/); + + /*encode it as length/distance pair or literal value*/ + if(length < 3) /*only lengths of 3 or higher are supported as length/distance pair*/ + { + if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); + } + else if(length < minmatch || (length == 3 && offset > 4096)) + { + /*compensate for the fact that longer offsets have more extra bits, a + length of only 3 may be not worth it then*/ + if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); + } + else + { + addLengthDistance(out, length, offset); + for(i = 1; i < length; ++i) + { + ++pos; + wpos = pos & (windowsize - 1); + hashval = getHash(in, insize, pos); + if(usezeros && hashval == 0) + { + if(numzeros == 0) numzeros = countZeros(in, insize, pos); + else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; + } + else + { + numzeros = 0; + } + updateHashChain(hash, wpos, hashval, numzeros); + } + } + } /*end of the loop through each character of input*/ + + return error; +} + +/* /////////////////////////////////////////////////////////////////////////// */ + +static unsigned deflateNoCompression(ucvector* out, const unsigned char* data, size_t datasize) +{ + /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte, + 2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/ + + size_t i, j, numdeflateblocks = (datasize + 65534) / 65535; + unsigned datapos = 0; + for(i = 0; i != numdeflateblocks; ++i) + { + unsigned BFINAL, BTYPE, LEN, NLEN; + unsigned char firstbyte; + + BFINAL = (i == numdeflateblocks - 1); + BTYPE = 0; + + firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1) << 1) + ((BTYPE & 2) << 1)); + ucvector_push_back(out, firstbyte); + + LEN = 65535; + if(datasize - datapos < 65535) LEN = (unsigned)datasize - datapos; + NLEN = 65535 - LEN; + + ucvector_push_back(out, (unsigned char)(LEN & 255)); + ucvector_push_back(out, (unsigned char)(LEN >> 8)); + ucvector_push_back(out, (unsigned char)(NLEN & 255)); + ucvector_push_back(out, (unsigned char)(NLEN >> 8)); + + /*Decompressed data*/ + for(j = 0; j < 65535 && datapos < datasize; ++j) + { + ucvector_push_back(out, data[datapos++]); + } + } + + return 0; +} + +/* +write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees. +tree_ll: the tree for lit and len codes. +tree_d: the tree for distance codes. +*/ +static void writeLZ77data(size_t* bp, ucvector* out, const uivector* lz77_encoded, + const HuffmanTree* tree_ll, const HuffmanTree* tree_d) +{ + size_t i = 0; + for(i = 0; i != lz77_encoded->size; ++i) + { + unsigned val = lz77_encoded->data[i]; + addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_ll, val), HuffmanTree_getLength(tree_ll, val)); + if(val > 256) /*for a length code, 3 more things have to be added*/ + { + unsigned length_index = val - FIRST_LENGTH_CODE_INDEX; + unsigned n_length_extra_bits = LENGTHEXTRA[length_index]; + unsigned length_extra_bits = lz77_encoded->data[++i]; + + unsigned distance_code = lz77_encoded->data[++i]; + + unsigned distance_index = distance_code; + unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index]; + unsigned distance_extra_bits = lz77_encoded->data[++i]; + + addBitsToStream(bp, out, length_extra_bits, n_length_extra_bits); + addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_d, distance_code), + HuffmanTree_getLength(tree_d, distance_code)); + addBitsToStream(bp, out, distance_extra_bits, n_distance_extra_bits); + } + } +} + +/*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/ +static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash, + const unsigned char* data, size_t datapos, size_t dataend, + const LodePNGCompressSettings* settings, unsigned final) +{ + unsigned error = 0; + + /* + A block is compressed as follows: The PNG data is lz77 encoded, resulting in + literal bytes and length/distance pairs. This is then huffman compressed with + two huffman trees. One huffman tree is used for the lit and len values ("ll"), + another huffman tree is used for the dist values ("d"). These two trees are + stored using their code lengths, and to compress even more these code lengths + are also run-length encoded and huffman compressed. This gives a huffman tree + of code lengths "cl". The code lenghts used to describe this third tree are + the code length code lengths ("clcl"). + */ + + /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/ + uivector lz77_encoded; + HuffmanTree tree_ll; /*tree for lit,len values*/ + HuffmanTree tree_d; /*tree for distance codes*/ + HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/ + uivector frequencies_ll; /*frequency of lit,len codes*/ + uivector frequencies_d; /*frequency of dist codes*/ + uivector frequencies_cl; /*frequency of code length codes*/ + uivector bitlen_lld; /*lit,len,dist code lenghts (int bits), literally (without repeat codes).*/ + uivector bitlen_lld_e; /*bitlen_lld encoded with repeat codes (this is a rudemtary run length compression)*/ + /*bitlen_cl is the code length code lengths ("clcl"). The bit lengths of codes to represent tree_cl + (these are written as is in the file, it would be crazy to compress these using yet another huffman + tree that needs to be represented by yet another set of code lengths)*/ + uivector bitlen_cl; + size_t datasize = dataend - datapos; + + /* + Due to the huffman compression of huffman tree representations ("two levels"), there are some anologies: + bitlen_lld is to tree_cl what data is to tree_ll and tree_d. + bitlen_lld_e is to bitlen_lld what lz77_encoded is to data. + bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded. + */ + + unsigned BFINAL = final; + size_t numcodes_ll, numcodes_d, i; + unsigned HLIT, HDIST, HCLEN; + + uivector_init(&lz77_encoded); + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + HuffmanTree_init(&tree_cl); + uivector_init(&frequencies_ll); + uivector_init(&frequencies_d); + uivector_init(&frequencies_cl); + uivector_init(&bitlen_lld); + uivector_init(&bitlen_lld_e); + uivector_init(&bitlen_cl); + + /*This while loop never loops due to a break at the end, it is here to + allow breaking out of it to the cleanup phase on error conditions.*/ + while(!error) + { + if(settings->use_lz77) + { + error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, + settings->minmatch, settings->nicematch, settings->lazymatching); + if(error) break; + } + else + { + if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/); + for(i = datapos; i < dataend; ++i) lz77_encoded.data[i - datapos] = data[i]; /*no LZ77, but still will be Huffman compressed*/ + } + + if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83 /*alloc fail*/); + if(!uivector_resizev(&frequencies_d, 30, 0)) ERROR_BREAK(83 /*alloc fail*/); + + /*Count the frequencies of lit, len and dist codes*/ + for(i = 0; i != lz77_encoded.size; ++i) + { + unsigned symbol = lz77_encoded.data[i]; + ++frequencies_ll.data[symbol]; + if(symbol > 256) + { + unsigned dist = lz77_encoded.data[i + 2]; + ++frequencies_d.data[dist]; + i += 3; + } + } + frequencies_ll.data[256] = 1; /*there will be exactly 1 end code, at the end of the block*/ + + /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/ + error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll.data, 257, frequencies_ll.size, 15); + if(error) break; + /*2, not 1, is chosen for mincodes: some buggy PNG decoders require at least 2 symbols in the dist tree*/ + error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d.data, 2, frequencies_d.size, 15); + if(error) break; + + numcodes_ll = tree_ll.numcodes; if(numcodes_ll > 286) numcodes_ll = 286; + numcodes_d = tree_d.numcodes; if(numcodes_d > 30) numcodes_d = 30; + /*store the code lengths of both generated trees in bitlen_lld*/ + for(i = 0; i != numcodes_ll; ++i) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_ll, (unsigned)i)); + for(i = 0; i != numcodes_d; ++i) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_d, (unsigned)i)); + + /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times), + 17 (3-10 zeroes), 18 (11-138 zeroes)*/ + for(i = 0; i != (unsigned)bitlen_lld.size; ++i) + { + unsigned j = 0; /*amount of repititions*/ + while(i + j + 1 < (unsigned)bitlen_lld.size && bitlen_lld.data[i + j + 1] == bitlen_lld.data[i]) ++j; + + if(bitlen_lld.data[i] == 0 && j >= 2) /*repeat code for zeroes*/ + { + ++j; /*include the first zero*/ + if(j <= 10) /*repeat code 17 supports max 10 zeroes*/ + { + uivector_push_back(&bitlen_lld_e, 17); + uivector_push_back(&bitlen_lld_e, j - 3); + } + else /*repeat code 18 supports max 138 zeroes*/ + { + if(j > 138) j = 138; + uivector_push_back(&bitlen_lld_e, 18); + uivector_push_back(&bitlen_lld_e, j - 11); + } + i += (j - 1); + } + else if(j >= 3) /*repeat code for value other than zero*/ + { + size_t k; + unsigned num = j / 6, rest = j % 6; + uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]); + for(k = 0; k < num; ++k) + { + uivector_push_back(&bitlen_lld_e, 16); + uivector_push_back(&bitlen_lld_e, 6 - 3); + } + if(rest >= 3) + { + uivector_push_back(&bitlen_lld_e, 16); + uivector_push_back(&bitlen_lld_e, rest - 3); + } + else j -= rest; + i += j; + } + else /*too short to benefit from repeat code*/ + { + uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]); + } + } + + /*generate tree_cl, the huffmantree of huffmantrees*/ + + if(!uivector_resizev(&frequencies_cl, NUM_CODE_LENGTH_CODES, 0)) ERROR_BREAK(83 /*alloc fail*/); + for(i = 0; i != bitlen_lld_e.size; ++i) + { + ++frequencies_cl.data[bitlen_lld_e.data[i]]; + /*after a repeat code come the bits that specify the number of repetitions, + those don't need to be in the frequencies_cl calculation*/ + if(bitlen_lld_e.data[i] >= 16) ++i; + } + + error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl.data, + frequencies_cl.size, frequencies_cl.size, 7); + if(error) break; + + if(!uivector_resize(&bitlen_cl, tree_cl.numcodes)) ERROR_BREAK(83 /*alloc fail*/); + for(i = 0; i != tree_cl.numcodes; ++i) + { + /*lenghts of code length tree is in the order as specified by deflate*/ + bitlen_cl.data[i] = HuffmanTree_getLength(&tree_cl, CLCL_ORDER[i]); + } + while(bitlen_cl.data[bitlen_cl.size - 1] == 0 && bitlen_cl.size > 4) + { + /*remove zeros at the end, but minimum size must be 4*/ + if(!uivector_resize(&bitlen_cl, bitlen_cl.size - 1)) ERROR_BREAK(83 /*alloc fail*/); + } + if(error) break; + + /* + Write everything into the output + + After the BFINAL and BTYPE, the dynamic block consists out of the following: + - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN + - (HCLEN+4)*3 bits code lengths of code length alphabet + - HLIT + 257 code lenghts of lit/length alphabet (encoded using the code length + alphabet, + possible repetition codes 16, 17, 18) + - HDIST + 1 code lengths of distance alphabet (encoded using the code length + alphabet, + possible repetition codes 16, 17, 18) + - compressed data + - 256 (end code) + */ + + /*Write block type*/ + addBitToStream(bp, out, BFINAL); + addBitToStream(bp, out, 0); /*first bit of BTYPE "dynamic"*/ + addBitToStream(bp, out, 1); /*second bit of BTYPE "dynamic"*/ + + /*write the HLIT, HDIST and HCLEN values*/ + HLIT = (unsigned)(numcodes_ll - 257); + HDIST = (unsigned)(numcodes_d - 1); + HCLEN = (unsigned)bitlen_cl.size - 4; + /*trim zeroes for HCLEN. HLIT and HDIST were already trimmed at tree creation*/ + while(!bitlen_cl.data[HCLEN + 4 - 1] && HCLEN > 0) --HCLEN; + addBitsToStream(bp, out, HLIT, 5); + addBitsToStream(bp, out, HDIST, 5); + addBitsToStream(bp, out, HCLEN, 4); + + /*write the code lenghts of the code length alphabet*/ + for(i = 0; i != HCLEN + 4; ++i) addBitsToStream(bp, out, bitlen_cl.data[i], 3); + + /*write the lenghts of the lit/len AND the dist alphabet*/ + for(i = 0; i != bitlen_lld_e.size; ++i) + { + addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_cl, bitlen_lld_e.data[i]), + HuffmanTree_getLength(&tree_cl, bitlen_lld_e.data[i])); + /*extra bits of repeat codes*/ + if(bitlen_lld_e.data[i] == 16) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 2); + else if(bitlen_lld_e.data[i] == 17) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 3); + else if(bitlen_lld_e.data[i] == 18) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 7); + } + + /*write the compressed data symbols*/ + writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d); + /*error: the length of the end code 256 must be larger than 0*/ + if(HuffmanTree_getLength(&tree_ll, 256) == 0) ERROR_BREAK(64); + + /*write the end code*/ + addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256)); + + break; /*end of error-while*/ + } + + /*cleanup*/ + uivector_cleanup(&lz77_encoded); + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + HuffmanTree_cleanup(&tree_cl); + uivector_cleanup(&frequencies_ll); + uivector_cleanup(&frequencies_d); + uivector_cleanup(&frequencies_cl); + uivector_cleanup(&bitlen_lld_e); + uivector_cleanup(&bitlen_lld); + uivector_cleanup(&bitlen_cl); + + return error; +} + +static unsigned deflateFixed(ucvector* out, size_t* bp, Hash* hash, + const unsigned char* data, + size_t datapos, size_t dataend, + const LodePNGCompressSettings* settings, unsigned final) +{ + HuffmanTree tree_ll; /*tree for literal values and length codes*/ + HuffmanTree tree_d; /*tree for distance codes*/ + + unsigned BFINAL = final; + unsigned error = 0; + size_t i; + + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + + generateFixedLitLenTree(&tree_ll); + generateFixedDistanceTree(&tree_d); + + addBitToStream(bp, out, BFINAL); + addBitToStream(bp, out, 1); /*first bit of BTYPE*/ + addBitToStream(bp, out, 0); /*second bit of BTYPE*/ + + if(settings->use_lz77) /*LZ77 encoded*/ + { + uivector lz77_encoded; + uivector_init(&lz77_encoded); + error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, + settings->minmatch, settings->nicematch, settings->lazymatching); + if(!error) writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d); + uivector_cleanup(&lz77_encoded); + } + else /*no LZ77, but still will be Huffman compressed*/ + { + for(i = datapos; i < dataend; ++i) + { + addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, data[i]), HuffmanTree_getLength(&tree_ll, data[i])); + } + } + /*add END code*/ + if(!error) addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256)); + + /*cleanup*/ + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + + return error; +} + +static unsigned lodepng_deflatev(ucvector* out, const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings) +{ + unsigned error = 0; + size_t i, blocksize, numdeflateblocks; + size_t bp = 0; /*the bit pointer*/ + Hash hash; + + if(settings->btype > 2) return 61; + else if(settings->btype == 0) return deflateNoCompression(out, in, insize); + else if(settings->btype == 1) blocksize = insize; + else /*if(settings->btype == 2)*/ + { + /*on PNGs, deflate blocks of 65-262k seem to give most dense encoding*/ + blocksize = insize / 8 + 8; + if(blocksize < 65536) blocksize = 65536; + if(blocksize > 262144) blocksize = 262144; + } + + numdeflateblocks = (insize + blocksize - 1) / blocksize; + if(numdeflateblocks == 0) numdeflateblocks = 1; + + error = hash_init(&hash, settings->windowsize); + if(error) return error; + + for(i = 0; i != numdeflateblocks && !error; ++i) + { + unsigned final = (i == numdeflateblocks - 1); + size_t start = i * blocksize; + size_t end = start + blocksize; + if(end > insize) end = insize; + + if(settings->btype == 1) error = deflateFixed(out, &bp, &hash, in, start, end, settings, final); + else if(settings->btype == 2) error = deflateDynamic(out, &bp, &hash, in, start, end, settings, final); + } + + hash_cleanup(&hash); + + return error; +} + +unsigned lodepng_deflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings) +{ + unsigned error; + ucvector v; + ucvector_init_buffer(&v, *out, *outsize); + error = lodepng_deflatev(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +static unsigned deflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings) +{ + if(settings->custom_deflate) + { + return settings->custom_deflate(out, outsize, in, insize, settings); + } + else + { + return lodepng_deflate(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Adler32 */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static unsigned update_adler32(unsigned adler, const unsigned char* data, unsigned len) +{ + unsigned s1 = adler & 0xffff; + unsigned s2 = (adler >> 16) & 0xffff; + + while(len > 0) + { + /*at least 5552 sums can be done before the sums overflow, saving a lot of module divisions*/ + unsigned amount = len > 5552 ? 5552 : len; + len -= amount; + while(amount > 0) + { + s1 += (*data++); + s2 += s1; + --amount; + } + s1 %= 65521; + s2 %= 65521; + } + + return (s2 << 16) | s1; +} + +/*Return the adler32 of the bytes data[0..len-1]*/ +static unsigned adler32(const unsigned char* data, unsigned len) +{ + return update_adler32(1L, data, len); +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Zlib / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_DECODER + +unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGDecompressSettings* settings) +{ + unsigned error = 0; + unsigned CM, CINFO, FDICT; + + if(insize < 2) return 53; /*error, size of zlib data too small*/ + /*read information from zlib header*/ + if((in[0] * 256 + in[1]) % 31 != 0) + { + /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/ + return 24; + } + + CM = in[0] & 15; + CINFO = (in[0] >> 4) & 15; + /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/ + FDICT = (in[1] >> 5) & 1; + /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/ + + if(CM != 8 || CINFO > 7) + { + /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/ + return 25; + } + if(FDICT != 0) + { + /*error: the specification of PNG says about the zlib stream: + "The additional flags shall not specify a preset dictionary."*/ + return 26; + } + + error = inflate(out, outsize, in + 2, insize - 2, settings); + if(error) return error; + + if(!settings->ignore_adler32) + { + unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]); + unsigned checksum = adler32(*out, (unsigned)(*outsize)); + if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/ + } + + return 0; /*no error*/ +} + +static unsigned zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGDecompressSettings* settings) +{ + if(settings->custom_zlib) + { + return settings->custom_zlib(out, outsize, in, insize, settings); + } + else + { + return lodepng_zlib_decompress(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER + +unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGCompressSettings* settings) +{ + /*initially, *out must be NULL and outsize 0, if you just give some random *out + that's pointing to a non allocated buffer, this'll crash*/ + ucvector outv; + size_t i; + unsigned error; + unsigned char* deflatedata = 0; + size_t deflatesize = 0; + + /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/ + unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/ + unsigned FLEVEL = 0; + unsigned FDICT = 0; + unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64; + unsigned FCHECK = 31 - CMFFLG % 31; + CMFFLG += FCHECK; + + /*ucvector-controlled version of the output buffer, for dynamic array*/ + ucvector_init_buffer(&outv, *out, *outsize); + + ucvector_push_back(&outv, (unsigned char)(CMFFLG >> 8)); + ucvector_push_back(&outv, (unsigned char)(CMFFLG & 255)); + + error = deflate(&deflatedata, &deflatesize, in, insize, settings); + + if(!error) + { + unsigned ADLER32 = adler32(in, (unsigned)insize); + for(i = 0; i != deflatesize; ++i) ucvector_push_back(&outv, deflatedata[i]); + lodepng_free(deflatedata); + lodepng_add32bitInt(&outv, ADLER32); + } + + *out = outv.data; + *outsize = outv.size; + + return error; +} + +/* compress using the default or custom zlib function */ +static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGCompressSettings* settings) +{ + if(settings->custom_zlib) + { + return settings->custom_zlib(out, outsize, in, insize, settings); + } + else + { + return lodepng_zlib_compress(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#else /*no LODEPNG_COMPILE_ZLIB*/ + +#ifdef LODEPNG_COMPILE_DECODER +static unsigned zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGDecompressSettings* settings) +{ + if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ + return settings->custom_zlib(out, outsize, in, insize, settings); +} +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER +static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGCompressSettings* settings) +{ + if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ + return settings->custom_zlib(out, outsize, in, insize, settings); +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#endif /*LODEPNG_COMPILE_ZLIB*/ + +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_ENCODER + +/*this is a good tradeoff between speed and compression ratio*/ +#define DEFAULT_WINDOWSIZE 2048 + +void lodepng_compress_settings_init(LodePNGCompressSettings* settings) +{ + /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/ + settings->btype = 2; + settings->use_lz77 = 1; + settings->windowsize = DEFAULT_WINDOWSIZE; + settings->minmatch = 3; + settings->nicematch = 128; + settings->lazymatching = 1; + + settings->custom_zlib = 0; + settings->custom_deflate = 0; + settings->custom_context = 0; +} + +const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 3, 128, 1, 0, 0, 0}; + + +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings) +{ + settings->ignore_adler32 = 0; + + settings->custom_zlib = 0; + settings->custom_inflate = 0; + settings->custom_context = 0; +} + +const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, 0}; + +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // End of Zlib related code. Begin of PNG related code. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_PNG + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / CRC32 / */ +/* ////////////////////////////////////////////////////////////////////////// */ + + +#ifndef LODEPNG_NO_COMPILE_CRC +/* CRC polynomial: 0xedb88320 */ +static unsigned lodepng_crc32_table[256] = { + 0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u, + 249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u, + 498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u, + 325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u, + 997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u, + 901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u, + 651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u, + 671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u, + 1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u, + 2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u, + 1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u, + 1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u, + 1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u, + 1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u, + 1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u, + 1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u, + 3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u, + 3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u, + 4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u, + 4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u, + 3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u, + 3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u, + 3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u, + 3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u, + 2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u, + 2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u, + 2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u, + 2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u, + 2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u, + 2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u, + 3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u, + 3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u +}; + +/*Return the CRC of the bytes buf[0..len-1].*/ +unsigned lodepng_crc32(const unsigned char* data, size_t length) +{ + unsigned r = 0xffffffffu; + size_t i; + for(i = 0; i < length; ++i) + { + r = lodepng_crc32_table[(r ^ data[i]) & 0xff] ^ (r >> 8); + } + return r ^ 0xffffffffu; +} +#else /* !LODEPNG_NO_COMPILE_CRC */ +unsigned lodepng_crc32(const unsigned char* data, size_t length); +#endif /* !LODEPNG_NO_COMPILE_CRC */ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Reading and writing single bits and bytes from/to stream for LodePNG / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream) +{ + unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1); + ++(*bitpointer); + return result; +} + +static unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) +{ + unsigned result = 0; + size_t i; + for(i = 0 ; i < nbits; ++i) + { + result <<= 1; + result |= (unsigned)readBitFromReversedStream(bitpointer, bitstream); + } + return result; +} + +#ifdef LODEPNG_COMPILE_DECODER +static void setBitOfReversedStream0(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) +{ + /*the current bit in bitstream must be 0 for this to work*/ + if(bit) + { + /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/ + bitstream[(*bitpointer) >> 3] |= (bit << (7 - ((*bitpointer) & 0x7))); + } + ++(*bitpointer); +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) +{ + /*the current bit in bitstream may be 0 or 1 for this to work*/ + if(bit == 0) bitstream[(*bitpointer) >> 3] &= (unsigned char)(~(1 << (7 - ((*bitpointer) & 0x7)))); + else bitstream[(*bitpointer) >> 3] |= (1 << (7 - ((*bitpointer) & 0x7))); + ++(*bitpointer); +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG chunks / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +unsigned lodepng_chunk_length(const unsigned char* chunk) +{ + return lodepng_read32bitInt(&chunk[0]); +} + +void lodepng_chunk_type(char type[5], const unsigned char* chunk) +{ + unsigned i; + for(i = 0; i != 4; ++i) type[i] = (char)chunk[4 + i]; + type[4] = 0; /*null termination char*/ +} + +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type) +{ + if(strlen(type) != 4) return 0; + return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]); +} + +unsigned char lodepng_chunk_ancillary(const unsigned char* chunk) +{ + return((chunk[4] & 32) != 0); +} + +unsigned char lodepng_chunk_private(const unsigned char* chunk) +{ + return((chunk[6] & 32) != 0); +} + +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk) +{ + return((chunk[7] & 32) != 0); +} + +unsigned char* lodepng_chunk_data(unsigned char* chunk) +{ + return &chunk[8]; +} + +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk) +{ + return &chunk[8]; +} + +unsigned lodepng_chunk_check_crc(const unsigned char* chunk) +{ + unsigned length = lodepng_chunk_length(chunk); + unsigned CRC = lodepng_read32bitInt(&chunk[length + 8]); + /*the CRC is taken of the data and the 4 chunk type letters, not the length*/ + unsigned checksum = lodepng_crc32(&chunk[4], length + 4); + if(CRC != checksum) return 1; + else return 0; +} + +void lodepng_chunk_generate_crc(unsigned char* chunk) +{ + unsigned length = lodepng_chunk_length(chunk); + unsigned CRC = lodepng_crc32(&chunk[4], length + 4); + lodepng_set32bitInt(chunk + 8 + length, CRC); +} + +unsigned char* lodepng_chunk_next(unsigned char* chunk) +{ + unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; + return &chunk[total_chunk_length]; +} + +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk) +{ + unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; + return &chunk[total_chunk_length]; +} + +unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk) +{ + unsigned i; + unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; + unsigned char *chunk_start, *new_buffer; + size_t new_length = (*outlength) + total_chunk_length; + if(new_length < total_chunk_length || new_length < (*outlength)) return 77; /*integer overflow happened*/ + + new_buffer = (unsigned char*)lodepng_realloc(*out, new_length); + if(!new_buffer) return 83; /*alloc fail*/ + (*out) = new_buffer; + (*outlength) = new_length; + chunk_start = &(*out)[new_length - total_chunk_length]; + + for(i = 0; i != total_chunk_length; ++i) chunk_start[i] = chunk[i]; + + return 0; +} + +unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, + const char* type, const unsigned char* data) +{ + unsigned i; + unsigned char *chunk, *new_buffer; + size_t new_length = (*outlength) + length + 12; + if(new_length < length + 12 || new_length < (*outlength)) return 77; /*integer overflow happened*/ + new_buffer = (unsigned char*)lodepng_realloc(*out, new_length); + if(!new_buffer) return 83; /*alloc fail*/ + (*out) = new_buffer; + (*outlength) = new_length; + chunk = &(*out)[(*outlength) - length - 12]; + + /*1: length*/ + lodepng_set32bitInt(chunk, (unsigned)length); + + /*2: chunk name (4 letters)*/ + chunk[4] = (unsigned char)type[0]; + chunk[5] = (unsigned char)type[1]; + chunk[6] = (unsigned char)type[2]; + chunk[7] = (unsigned char)type[3]; + + /*3: the data*/ + for(i = 0; i != length; ++i) chunk[8 + i] = data[i]; + + /*4: CRC (of the chunkname characters and the data)*/ + lodepng_chunk_generate_crc(chunk); + + return 0; +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Color types and such / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*return type is a LodePNG error code*/ +static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) /*bd = bitdepth*/ +{ + switch(colortype) + { + case 0: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; break; /*grey*/ + case 2: if(!( bd == 8 || bd == 16)) return 37; break; /*RGB*/ + case 3: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 )) return 37; break; /*palette*/ + case 4: if(!( bd == 8 || bd == 16)) return 37; break; /*grey + alpha*/ + case 6: if(!( bd == 8 || bd == 16)) return 37; break; /*RGBA*/ + default: return 31; + } + return 0; /*allowed color type / bits combination*/ +} + +static unsigned getNumColorChannels(LodePNGColorType colortype) +{ + switch(colortype) + { + case 0: return 1; /*grey*/ + case 2: return 3; /*RGB*/ + case 3: return 1; /*palette*/ + case 4: return 2; /*grey + alpha*/ + case 6: return 4; /*RGBA*/ + } + return 0; /*unexisting color type*/ +} + +static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) +{ + /*bits per pixel is amount of channels * bits per channel*/ + return getNumColorChannels(colortype) * bitdepth; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +void lodepng_color_mode_init(LodePNGColorMode* info) +{ + info->key_defined = 0; + info->key_r = info->key_g = info->key_b = 0; + info->colortype = LCT_RGBA; + info->bitdepth = 8; + info->palette = 0; + info->palettesize = 0; +} + +void lodepng_color_mode_cleanup(LodePNGColorMode* info) +{ + lodepng_palette_clear(info); +} + +unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source) +{ + size_t i; + lodepng_color_mode_cleanup(dest); + *dest = *source; + if(source->palette) + { + dest->palette = (unsigned char*)lodepng_malloc(1024); + if(!dest->palette && source->palettesize) return 83; /*alloc fail*/ + for(i = 0; i != source->palettesize * 4; ++i) dest->palette[i] = source->palette[i]; + } + return 0; +} + +static int lodepng_color_mode_equal(const LodePNGColorMode* a, const LodePNGColorMode* b) +{ + size_t i; + if(a->colortype != b->colortype) return 0; + if(a->bitdepth != b->bitdepth) return 0; + if(a->key_defined != b->key_defined) return 0; + if(a->key_defined) + { + if(a->key_r != b->key_r) return 0; + if(a->key_g != b->key_g) return 0; + if(a->key_b != b->key_b) return 0; + } + if(a->palettesize != b->palettesize) return 0; + for(i = 0; i != a->palettesize * 4; ++i) + { + if(a->palette[i] != b->palette[i]) return 0; + } + return 1; +} + +void lodepng_palette_clear(LodePNGColorMode* info) +{ + if(info->palette) lodepng_free(info->palette); + info->palette = 0; + info->palettesize = 0; +} + +unsigned lodepng_palette_add(LodePNGColorMode* info, + unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + unsigned char* data; + /*the same resize technique as C++ std::vectors is used, and here it's made so that for a palette with + the max of 256 colors, it'll have the exact alloc size*/ + if(!info->palette) /*allocate palette if empty*/ + { + /*room for 256 colors with 4 bytes each*/ + data = (unsigned char*)lodepng_realloc(info->palette, 1024); + if(!data) return 83; /*alloc fail*/ + else info->palette = data; + } + info->palette[4 * info->palettesize + 0] = r; + info->palette[4 * info->palettesize + 1] = g; + info->palette[4 * info->palettesize + 2] = b; + info->palette[4 * info->palettesize + 3] = a; + ++info->palettesize; + return 0; +} + +unsigned lodepng_get_bpp(const LodePNGColorMode* info) +{ + /*calculate bits per pixel out of colortype and bitdepth*/ + return lodepng_get_bpp_lct(info->colortype, info->bitdepth); +} + +unsigned lodepng_get_channels(const LodePNGColorMode* info) +{ + return getNumColorChannels(info->colortype); +} + +unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info) +{ + return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA; +} + +unsigned lodepng_is_alpha_type(const LodePNGColorMode* info) +{ + return (info->colortype & 4) != 0; /*4 or 6*/ +} + +unsigned lodepng_is_palette_type(const LodePNGColorMode* info) +{ + return info->colortype == LCT_PALETTE; +} + +unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info) +{ + size_t i; + for(i = 0; i != info->palettesize; ++i) + { + if(info->palette[i * 4 + 3] < 255) return 1; + } + return 0; +} + +unsigned lodepng_can_have_alpha(const LodePNGColorMode* info) +{ + return info->key_defined + || lodepng_is_alpha_type(info) + || lodepng_has_palette_alpha(info); +} + +size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) +{ + size_t bpp = lodepng_get_bpp_lct(colortype, bitdepth); + size_t n = (size_t)w * (size_t)h; + return ((n / 8) * bpp) + ((n & 7) * bpp + 7) / 8; +} + +size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color) +{ + return lodepng_get_raw_size_lct(w, h, color->colortype, color->bitdepth); +} + + +#ifdef LODEPNG_COMPILE_PNG +#ifdef LODEPNG_COMPILE_DECODER + +/*in an idat chunk, each scanline is a multiple of 8 bits, unlike the lodepng output buffer, +and in addition has one extra byte per line: the filter byte. So this gives a larger +result than lodepng_get_raw_size. */ +static size_t lodepng_get_raw_size_idat(unsigned w, unsigned h, const LodePNGColorMode* color) +{ + size_t bpp = lodepng_get_bpp(color); + /* + 1 for the filter byte, and possibly plus padding bits per line */ + size_t line = ((size_t)(w / 8) * bpp) + 1 + ((w & 7) * bpp + 7) / 8; + return (size_t)h * line; +} + +/* Safely check if multiplying two integers will overflow (no undefined +behavior, compiler removing the code, etc...) and output result. */ +static int lodepng_mulofl(size_t a, size_t b, size_t* result) +{ + *result = a * b; /* Unsigned multiplication is well defined and safe in C90 */ + return (a != 0 && *result / a != b); +} + +/* Safely check if adding two integers will overflow (no undefined +behavior, compiler removing the code, etc...) and output result. */ +static int lodepng_addofl(size_t a, size_t b, size_t* result) +{ + *result = a + b; /* Unsigned addition is well defined and safe in C90 */ + return *result < a; +} + +/*Safely checks whether size_t overflow can be caused due to amount of pixels. +This check is overcautious rather than precise. If this check indicates no overflow, +you can safely compute in a size_t (but not an unsigned): +-(size_t)w * (size_t)h * 8 +-amount of bytes in IDAT (including filter, padding and Adam7 bytes) +-amount of bytes in raw color model +Returns 1 if overflow possible, 0 if not. +*/ +static int lodepng_pixel_overflow(unsigned w, unsigned h, + const LodePNGColorMode* pngcolor, const LodePNGColorMode* rawcolor) +{ + size_t bpp = LODEPNG_MAX(lodepng_get_bpp(pngcolor), lodepng_get_bpp(rawcolor)); + size_t numpixels, total; + size_t line; /* bytes per line in worst case */ + + if(lodepng_mulofl((size_t)w, (size_t)h, &numpixels)) return 1; + if(lodepng_mulofl(numpixels, 8, &total)) return 1; /* bit pointer with 8-bit color, or 8 bytes per channel color */ + + /* Bytes per scanline with the expression "(w / 8) * bpp) + ((w & 7) * bpp + 7) / 8" */ + if(lodepng_mulofl((size_t)(w / 8), bpp, &line)) return 1; + if(lodepng_addofl(line, ((w & 7) * bpp + 7) / 8, &line)) return 1; + + if(lodepng_addofl(line, 5, &line)) return 1; /* 5 bytes overhead per line: 1 filterbyte, 4 for Adam7 worst case */ + if(lodepng_mulofl(line, h, &total)) return 1; /* Total bytes in worst case */ + + return 0; /* no overflow */ +} +#endif /*LODEPNG_COMPILE_DECODER*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +static void LodePNGUnknownChunks_init(LodePNGInfo* info) +{ + unsigned i; + for(i = 0; i != 3; ++i) info->unknown_chunks_data[i] = 0; + for(i = 0; i != 3; ++i) info->unknown_chunks_size[i] = 0; +} + +static void LodePNGUnknownChunks_cleanup(LodePNGInfo* info) +{ + unsigned i; + for(i = 0; i != 3; ++i) lodepng_free(info->unknown_chunks_data[i]); +} + +static unsigned LodePNGUnknownChunks_copy(LodePNGInfo* dest, const LodePNGInfo* src) +{ + unsigned i; + + LodePNGUnknownChunks_cleanup(dest); + + for(i = 0; i != 3; ++i) + { + size_t j; + dest->unknown_chunks_size[i] = src->unknown_chunks_size[i]; + dest->unknown_chunks_data[i] = (unsigned char*)lodepng_malloc(src->unknown_chunks_size[i]); + if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/ + for(j = 0; j < src->unknown_chunks_size[i]; ++j) + { + dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j]; + } + } + + return 0; +} + +/******************************************************************************/ + +static void LodePNGText_init(LodePNGInfo* info) +{ + info->text_num = 0; + info->text_keys = NULL; + info->text_strings = NULL; +} + +static void LodePNGText_cleanup(LodePNGInfo* info) +{ + size_t i; + for(i = 0; i != info->text_num; ++i) + { + string_cleanup(&info->text_keys[i]); + string_cleanup(&info->text_strings[i]); + } + lodepng_free(info->text_keys); + lodepng_free(info->text_strings); +} + +static unsigned LodePNGText_copy(LodePNGInfo* dest, const LodePNGInfo* source) +{ + size_t i = 0; + dest->text_keys = 0; + dest->text_strings = 0; + dest->text_num = 0; + for(i = 0; i != source->text_num; ++i) + { + CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i])); + } + return 0; +} + +void lodepng_clear_text(LodePNGInfo* info) +{ + LodePNGText_cleanup(info); +} + +unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str) +{ + char** new_keys = (char**)(lodepng_realloc(info->text_keys, sizeof(char*) * (info->text_num + 1))); + char** new_strings = (char**)(lodepng_realloc(info->text_strings, sizeof(char*) * (info->text_num + 1))); + if(!new_keys || !new_strings) + { + lodepng_free(new_keys); + lodepng_free(new_strings); + return 83; /*alloc fail*/ + } + + ++info->text_num; + info->text_keys = new_keys; + info->text_strings = new_strings; + + string_init(&info->text_keys[info->text_num - 1]); + string_set(&info->text_keys[info->text_num - 1], key); + + string_init(&info->text_strings[info->text_num - 1]); + string_set(&info->text_strings[info->text_num - 1], str); + + return 0; +} + +/******************************************************************************/ + +static void LodePNGIText_init(LodePNGInfo* info) +{ + info->itext_num = 0; + info->itext_keys = NULL; + info->itext_langtags = NULL; + info->itext_transkeys = NULL; + info->itext_strings = NULL; +} + +static void LodePNGIText_cleanup(LodePNGInfo* info) +{ + size_t i; + for(i = 0; i != info->itext_num; ++i) + { + string_cleanup(&info->itext_keys[i]); + string_cleanup(&info->itext_langtags[i]); + string_cleanup(&info->itext_transkeys[i]); + string_cleanup(&info->itext_strings[i]); + } + lodepng_free(info->itext_keys); + lodepng_free(info->itext_langtags); + lodepng_free(info->itext_transkeys); + lodepng_free(info->itext_strings); +} + +static unsigned LodePNGIText_copy(LodePNGInfo* dest, const LodePNGInfo* source) +{ + size_t i = 0; + dest->itext_keys = 0; + dest->itext_langtags = 0; + dest->itext_transkeys = 0; + dest->itext_strings = 0; + dest->itext_num = 0; + for(i = 0; i != source->itext_num; ++i) + { + CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i], + source->itext_transkeys[i], source->itext_strings[i])); + } + return 0; +} + +void lodepng_clear_itext(LodePNGInfo* info) +{ + LodePNGIText_cleanup(info); +} + +unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, + const char* transkey, const char* str) +{ + char** new_keys = (char**)(lodepng_realloc(info->itext_keys, sizeof(char*) * (info->itext_num + 1))); + char** new_langtags = (char**)(lodepng_realloc(info->itext_langtags, sizeof(char*) * (info->itext_num + 1))); + char** new_transkeys = (char**)(lodepng_realloc(info->itext_transkeys, sizeof(char*) * (info->itext_num + 1))); + char** new_strings = (char**)(lodepng_realloc(info->itext_strings, sizeof(char*) * (info->itext_num + 1))); + if(!new_keys || !new_langtags || !new_transkeys || !new_strings) + { + lodepng_free(new_keys); + lodepng_free(new_langtags); + lodepng_free(new_transkeys); + lodepng_free(new_strings); + return 83; /*alloc fail*/ + } + + ++info->itext_num; + info->itext_keys = new_keys; + info->itext_langtags = new_langtags; + info->itext_transkeys = new_transkeys; + info->itext_strings = new_strings; + + string_init(&info->itext_keys[info->itext_num - 1]); + string_set(&info->itext_keys[info->itext_num - 1], key); + + string_init(&info->itext_langtags[info->itext_num - 1]); + string_set(&info->itext_langtags[info->itext_num - 1], langtag); + + string_init(&info->itext_transkeys[info->itext_num - 1]); + string_set(&info->itext_transkeys[info->itext_num - 1], transkey); + + string_init(&info->itext_strings[info->itext_num - 1]); + string_set(&info->itext_strings[info->itext_num - 1], str); + + return 0; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +void lodepng_info_init(LodePNGInfo* info) +{ + lodepng_color_mode_init(&info->color); + info->interlace_method = 0; + info->compression_method = 0; + info->filter_method = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + info->background_defined = 0; + info->background_r = info->background_g = info->background_b = 0; + + LodePNGText_init(info); + LodePNGIText_init(info); + + info->time_defined = 0; + info->phys_defined = 0; + + LodePNGUnknownChunks_init(info); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +void lodepng_info_cleanup(LodePNGInfo* info) +{ + lodepng_color_mode_cleanup(&info->color); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + LodePNGText_cleanup(info); + LodePNGIText_cleanup(info); + + LodePNGUnknownChunks_cleanup(info); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source) +{ + lodepng_info_cleanup(dest); + *dest = *source; + lodepng_color_mode_init(&dest->color); + CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color)); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + CERROR_TRY_RETURN(LodePNGText_copy(dest, source)); + CERROR_TRY_RETURN(LodePNGIText_copy(dest, source)); + + LodePNGUnknownChunks_init(dest); + CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source)); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + return 0; +} + +void lodepng_info_swap(LodePNGInfo* a, LodePNGInfo* b) +{ + LodePNGInfo temp = *a; + *a = *b; + *b = temp; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +/*index: bitgroup index, bits: bitgroup size(1, 2 or 4), in: bitgroup value, out: octet array to add bits to*/ +static void addColorBits(unsigned char* out, size_t index, unsigned bits, unsigned in) +{ + unsigned m = bits == 1 ? 7 : bits == 2 ? 3 : 1; /*8 / bits - 1*/ + /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/ + unsigned p = (unsigned)index & m; + in &= (1u << bits) - 1u; /*filter out any other bits of the input value*/ + in = in << (bits * (m - p)); + if(p == 0) out[index * bits / 8] = in; + else out[index * bits / 8] |= in; +} + +typedef struct ColorTree ColorTree; + +/* +One node of a color tree +This is the data structure used to count the number of unique colors and to get a palette +index for a color. It's like an octree, but because the alpha channel is used too, each +node has 16 instead of 8 children. +*/ +struct ColorTree +{ + ColorTree* children[16]; /*up to 16 pointers to ColorTree of next level*/ + int index; /*the payload. Only has a meaningful value if this is in the last level*/ +}; + +static void color_tree_init(ColorTree* tree) +{ + int i; + for(i = 0; i != 16; ++i) tree->children[i] = 0; + tree->index = -1; +} + +static void color_tree_cleanup(ColorTree* tree) +{ + int i; + for(i = 0; i != 16; ++i) + { + if(tree->children[i]) + { + color_tree_cleanup(tree->children[i]); + lodepng_free(tree->children[i]); + } + } +} + +/*returns -1 if color not present, its index otherwise*/ +static int color_tree_get(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + int bit = 0; + for(bit = 0; bit < 8; ++bit) + { + int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); + if(!tree->children[i]) return -1; + else tree = tree->children[i]; + } + return tree ? tree->index : -1; +} + +#ifdef LODEPNG_COMPILE_ENCODER +static int color_tree_has(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + return color_tree_get(tree, r, g, b, a) >= 0; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/*color is not allowed to already exist. +Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist")*/ +static void color_tree_add(ColorTree* tree, + unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned index) +{ + int bit; + for(bit = 0; bit < 8; ++bit) + { + int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); + if(!tree->children[i]) + { + tree->children[i] = (ColorTree*)lodepng_malloc(sizeof(ColorTree)); + color_tree_init(tree->children[i]); + } + tree = tree->children[i]; + } + tree->index = (int)index; +} + +/*put a pixel, given its RGBA color, into image of any color type*/ +static unsigned rgba8ToPixel(unsigned char* out, size_t i, + const LodePNGColorMode* mode, ColorTree* tree /*for palette*/, + unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + if(mode->colortype == LCT_GREY) + { + unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/; + if(mode->bitdepth == 8) out[i] = grey; + else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = grey; + else + { + /*take the most significant bits of grey*/ + grey = (grey >> (8 - mode->bitdepth)) & ((1 << mode->bitdepth) - 1); + addColorBits(out, i, mode->bitdepth, grey); + } + } + else if(mode->colortype == LCT_RGB) + { + if(mode->bitdepth == 8) + { + out[i * 3 + 0] = r; + out[i * 3 + 1] = g; + out[i * 3 + 2] = b; + } + else + { + out[i * 6 + 0] = out[i * 6 + 1] = r; + out[i * 6 + 2] = out[i * 6 + 3] = g; + out[i * 6 + 4] = out[i * 6 + 5] = b; + } + } + else if(mode->colortype == LCT_PALETTE) + { + int index = color_tree_get(tree, r, g, b, a); + if(index < 0) return 82; /*color not in palette*/ + if(mode->bitdepth == 8) out[i] = index; + else addColorBits(out, i, mode->bitdepth, (unsigned)index); + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/; + if(mode->bitdepth == 8) + { + out[i * 2 + 0] = grey; + out[i * 2 + 1] = a; + } + else if(mode->bitdepth == 16) + { + out[i * 4 + 0] = out[i * 4 + 1] = grey; + out[i * 4 + 2] = out[i * 4 + 3] = a; + } + } + else if(mode->colortype == LCT_RGBA) + { + if(mode->bitdepth == 8) + { + out[i * 4 + 0] = r; + out[i * 4 + 1] = g; + out[i * 4 + 2] = b; + out[i * 4 + 3] = a; + } + else + { + out[i * 8 + 0] = out[i * 8 + 1] = r; + out[i * 8 + 2] = out[i * 8 + 3] = g; + out[i * 8 + 4] = out[i * 8 + 5] = b; + out[i * 8 + 6] = out[i * 8 + 7] = a; + } + } + + return 0; /*no error*/ +} + +/*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/ +static void rgba16ToPixel(unsigned char* out, size_t i, + const LodePNGColorMode* mode, + unsigned short r, unsigned short g, unsigned short b, unsigned short a) +{ + if(mode->colortype == LCT_GREY) + { + unsigned short grey = r; /*((unsigned)r + g + b) / 3*/; + out[i * 2 + 0] = (grey >> 8) & 255; + out[i * 2 + 1] = grey & 255; + } + else if(mode->colortype == LCT_RGB) + { + out[i * 6 + 0] = (r >> 8) & 255; + out[i * 6 + 1] = r & 255; + out[i * 6 + 2] = (g >> 8) & 255; + out[i * 6 + 3] = g & 255; + out[i * 6 + 4] = (b >> 8) & 255; + out[i * 6 + 5] = b & 255; + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + unsigned short grey = r; /*((unsigned)r + g + b) / 3*/; + out[i * 4 + 0] = (grey >> 8) & 255; + out[i * 4 + 1] = grey & 255; + out[i * 4 + 2] = (a >> 8) & 255; + out[i * 4 + 3] = a & 255; + } + else if(mode->colortype == LCT_RGBA) + { + out[i * 8 + 0] = (r >> 8) & 255; + out[i * 8 + 1] = r & 255; + out[i * 8 + 2] = (g >> 8) & 255; + out[i * 8 + 3] = g & 255; + out[i * 8 + 4] = (b >> 8) & 255; + out[i * 8 + 5] = b & 255; + out[i * 8 + 6] = (a >> 8) & 255; + out[i * 8 + 7] = a & 255; + } +} + +/*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/ +static void getPixelColorRGBA8(unsigned char* r, unsigned char* g, + unsigned char* b, unsigned char* a, + const unsigned char* in, size_t i, + const LodePNGColorMode* mode) +{ + if(mode->colortype == LCT_GREY) + { + if(mode->bitdepth == 8) + { + *r = *g = *b = in[i]; + if(mode->key_defined && *r == mode->key_r) *a = 0; + else *a = 255; + } + else if(mode->bitdepth == 16) + { + *r = *g = *b = in[i * 2 + 0]; + if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; + else *a = 255; + } + else + { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = i * mode->bitdepth; + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + *r = *g = *b = (value * 255) / highest; + if(mode->key_defined && value == mode->key_r) *a = 0; + else *a = 255; + } + } + else if(mode->colortype == LCT_RGB) + { + if(mode->bitdepth == 8) + { + *r = in[i * 3 + 0]; *g = in[i * 3 + 1]; *b = in[i * 3 + 2]; + if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0; + else *a = 255; + } + else + { + *r = in[i * 6 + 0]; + *g = in[i * 6 + 2]; + *b = in[i * 6 + 4]; + if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; + else *a = 255; + } + } + else if(mode->colortype == LCT_PALETTE) + { + unsigned index; + if(mode->bitdepth == 8) index = in[i]; + else + { + size_t j = i * mode->bitdepth; + index = readBitsFromReversedStream(&j, in, mode->bitdepth); + } + + if(index >= mode->palettesize) + { + /*This is an error according to the PNG spec, but common PNG decoders make it black instead. + Done here too, slightly faster due to no error handling needed.*/ + *r = *g = *b = 0; + *a = 255; + } + else + { + *r = mode->palette[index * 4 + 0]; + *g = mode->palette[index * 4 + 1]; + *b = mode->palette[index * 4 + 2]; + *a = mode->palette[index * 4 + 3]; + } + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + if(mode->bitdepth == 8) + { + *r = *g = *b = in[i * 2 + 0]; + *a = in[i * 2 + 1]; + } + else + { + *r = *g = *b = in[i * 4 + 0]; + *a = in[i * 4 + 2]; + } + } + else if(mode->colortype == LCT_RGBA) + { + if(mode->bitdepth == 8) + { + *r = in[i * 4 + 0]; + *g = in[i * 4 + 1]; + *b = in[i * 4 + 2]; + *a = in[i * 4 + 3]; + } + else + { + *r = in[i * 8 + 0]; + *g = in[i * 8 + 2]; + *b = in[i * 8 + 4]; + *a = in[i * 8 + 6]; + } + } +} + +/*Similar to getPixelColorRGBA8, but with all the for loops inside of the color +mode test cases, optimized to convert the colors much faster, when converting +to RGBA or RGB with 8 bit per cannel. buffer must be RGBA or RGB output with +enough memory, if has_alpha is true the output is RGBA. mode has the color mode +of the input buffer.*/ +static void getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, + unsigned has_alpha, const unsigned char* in, + const LodePNGColorMode* mode) +{ + unsigned num_channels = has_alpha ? 4 : 3; + size_t i; + if(mode->colortype == LCT_GREY) + { + if(mode->bitdepth == 8) + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = buffer[1] = buffer[2] = in[i]; + if(has_alpha) buffer[3] = mode->key_defined && in[i] == mode->key_r ? 0 : 255; + } + } + else if(mode->bitdepth == 16) + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = buffer[1] = buffer[2] = in[i * 2]; + if(has_alpha) buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255; + } + } + else + { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; + if(has_alpha) buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255; + } + } + } + else if(mode->colortype == LCT_RGB) + { + if(mode->bitdepth == 8) + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = in[i * 3 + 0]; + buffer[1] = in[i * 3 + 1]; + buffer[2] = in[i * 3 + 2]; + if(has_alpha) buffer[3] = mode->key_defined && buffer[0] == mode->key_r + && buffer[1]== mode->key_g && buffer[2] == mode->key_b ? 0 : 255; + } + } + else + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = in[i * 6 + 0]; + buffer[1] = in[i * 6 + 2]; + buffer[2] = in[i * 6 + 4]; + if(has_alpha) buffer[3] = mode->key_defined + && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255; + } + } + } + else if(mode->colortype == LCT_PALETTE) + { + unsigned index; + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + if(mode->bitdepth == 8) index = in[i]; + else index = readBitsFromReversedStream(&j, in, mode->bitdepth); + + if(index >= mode->palettesize) + { + /*This is an error according to the PNG spec, but most PNG decoders make it black instead. + Done here too, slightly faster due to no error handling needed.*/ + buffer[0] = buffer[1] = buffer[2] = 0; + if(has_alpha) buffer[3] = 255; + } + else + { + buffer[0] = mode->palette[index * 4 + 0]; + buffer[1] = mode->palette[index * 4 + 1]; + buffer[2] = mode->palette[index * 4 + 2]; + if(has_alpha) buffer[3] = mode->palette[index * 4 + 3]; + } + } + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + if(mode->bitdepth == 8) + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; + if(has_alpha) buffer[3] = in[i * 2 + 1]; + } + } + else + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; + if(has_alpha) buffer[3] = in[i * 4 + 2]; + } + } + } + else if(mode->colortype == LCT_RGBA) + { + if(mode->bitdepth == 8) + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = in[i * 4 + 0]; + buffer[1] = in[i * 4 + 1]; + buffer[2] = in[i * 4 + 2]; + if(has_alpha) buffer[3] = in[i * 4 + 3]; + } + } + else + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = in[i * 8 + 0]; + buffer[1] = in[i * 8 + 2]; + buffer[2] = in[i * 8 + 4]; + if(has_alpha) buffer[3] = in[i * 8 + 6]; + } + } + } +} + +/*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with +given color type, but the given color type must be 16-bit itself.*/ +static void getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsigned short* b, unsigned short* a, + const unsigned char* in, size_t i, const LodePNGColorMode* mode) +{ + if(mode->colortype == LCT_GREY) + { + *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1]; + if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; + else *a = 65535; + } + else if(mode->colortype == LCT_RGB) + { + *r = 256u * in[i * 6 + 0] + in[i * 6 + 1]; + *g = 256u * in[i * 6 + 2] + in[i * 6 + 3]; + *b = 256u * in[i * 6 + 4] + in[i * 6 + 5]; + if(mode->key_defined + && 256u * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256u * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256u * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; + else *a = 65535; + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + *r = *g = *b = 256u * in[i * 4 + 0] + in[i * 4 + 1]; + *a = 256u * in[i * 4 + 2] + in[i * 4 + 3]; + } + else if(mode->colortype == LCT_RGBA) + { + *r = 256u * in[i * 8 + 0] + in[i * 8 + 1]; + *g = 256u * in[i * 8 + 2] + in[i * 8 + 3]; + *b = 256u * in[i * 8 + 4] + in[i * 8 + 5]; + *a = 256u * in[i * 8 + 6] + in[i * 8 + 7]; + } +} + +unsigned lodepng_convert(unsigned char* out, const unsigned char* in, + const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, + unsigned w, unsigned h) +{ + size_t i; + ColorTree tree; + size_t numpixels = (size_t)w * (size_t)h; + unsigned error = 0; + + if(lodepng_color_mode_equal(mode_out, mode_in)) + { + size_t numbytes = lodepng_get_raw_size(w, h, mode_in); + for(i = 0; i != numbytes; ++i) out[i] = in[i]; + return 0; + } + + if(mode_out->colortype == LCT_PALETTE) + { + size_t palettesize = mode_out->palettesize; + const unsigned char* palette = mode_out->palette; + size_t palsize = (size_t)1u << mode_out->bitdepth; + /*if the user specified output palette but did not give the values, assume + they want the values of the input color type (assuming that one is palette). + Note that we never create a new palette ourselves.*/ + if(palettesize == 0) + { + palettesize = mode_in->palettesize; + palette = mode_in->palette; + /*if the input was also palette with same bitdepth, then the color types are also + equal, so copy literally. This to preserve the exact indices that were in the PNG + even in case there are duplicate colors in the palette.*/ + if (mode_in->colortype == LCT_PALETTE && mode_in->bitdepth == mode_out->bitdepth) + { + size_t numbytes = lodepng_get_raw_size(w, h, mode_in); + for(i = 0; i != numbytes; ++i) out[i] = in[i]; + return 0; + } + } + if(palettesize < palsize) palsize = palettesize; + color_tree_init(&tree); + for(i = 0; i != palsize; ++i) + { + const unsigned char* p = &palette[i * 4]; + color_tree_add(&tree, p[0], p[1], p[2], p[3], (unsigned)i); + } + } + + if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) + { + for(i = 0; i != numpixels; ++i) + { + unsigned short r = 0, g = 0, b = 0, a = 0; + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + rgba16ToPixel(out, i, mode_out, r, g, b, a); + } + } + else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) + { + getPixelColorsRGBA8(out, numpixels, 1, in, mode_in); + } + else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) + { + getPixelColorsRGBA8(out, numpixels, 0, in, mode_in); + } + else + { + unsigned char r = 0, g = 0, b = 0, a = 0; + for(i = 0; i != numpixels; ++i) + { + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); + error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a); + if (error) break; + } + } + + if(mode_out->colortype == LCT_PALETTE) + { + color_tree_cleanup(&tree); + } + + return error; +} + +#ifdef LODEPNG_COMPILE_ENCODER + +void lodepng_color_profile_init(LodePNGColorProfile* profile) +{ + profile->colored = 0; + profile->key = 0; + profile->key_r = profile->key_g = profile->key_b = 0; + profile->alpha = 0; + profile->numcolors = 0; + profile->bits = 1; +} + +/*function used for debug purposes with C++*/ +/*void printColorProfile(LodePNGColorProfile* p) +{ + std::cout << "colored: " << (int)p->colored << ", "; + std::cout << "key: " << (int)p->key << ", "; + std::cout << "key_r: " << (int)p->key_r << ", "; + std::cout << "key_g: " << (int)p->key_g << ", "; + std::cout << "key_b: " << (int)p->key_b << ", "; + std::cout << "alpha: " << (int)p->alpha << ", "; + std::cout << "numcolors: " << (int)p->numcolors << ", "; + std::cout << "bits: " << (int)p->bits << std::endl; +}*/ + +/*Returns how many bits needed to represent given value (max 8 bit)*/ +static unsigned getValueRequiredBits(unsigned char value) +{ + if(value == 0 || value == 255) return 1; + /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/ + if(value % 17 == 0) return value % 85 == 0 ? 2 : 4; + return 8; +} + +/*profile must already have been inited with mode. +It's ok to set some parameters of profile to done already.*/ +unsigned lodepng_get_color_profile(LodePNGColorProfile* profile, + const unsigned char* in, unsigned w, unsigned h, + const LodePNGColorMode* mode) +{ + unsigned error = 0; + size_t i; + ColorTree tree; + size_t numpixels = (size_t)w * (size_t)h; + + unsigned colored_done = lodepng_is_greyscale_type(mode) ? 1 : 0; + unsigned alpha_done = lodepng_can_have_alpha(mode) ? 0 : 1; + unsigned numcolors_done = 0; + unsigned bpp = lodepng_get_bpp(mode); + unsigned bits_done = bpp == 1 ? 1 : 0; + unsigned maxnumcolors = 257; + unsigned sixteen = 0; + if(bpp <= 8) maxnumcolors = bpp == 1 ? 2 : (bpp == 2 ? 4 : (bpp == 4 ? 16 : 256)); + + color_tree_init(&tree); + + /*Check if the 16-bit input is truly 16-bit*/ + if(mode->bitdepth == 16) + { + unsigned short r, g, b, a; + for(i = 0; i != numpixels; ++i) + { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode); + if((r & 255) != ((r >> 8) & 255) || (g & 255) != ((g >> 8) & 255) || + (b & 255) != ((b >> 8) & 255) || (a & 255) != ((a >> 8) & 255)) /*first and second byte differ*/ + { + sixteen = 1; + break; + } + } + } + + if(sixteen) + { + unsigned short r = 0, g = 0, b = 0, a = 0; + profile->bits = 16; + bits_done = numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/ + + for(i = 0; i != numpixels; ++i) + { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode); + + if(!colored_done && (r != g || r != b)) + { + profile->colored = 1; + colored_done = 1; + } + + if(!alpha_done) + { + unsigned matchkey = (r == profile->key_r && g == profile->key_g && b == profile->key_b); + if(a != 65535 && (a != 0 || (profile->key && !matchkey))) + { + profile->alpha = 1; + profile->key = 0; + alpha_done = 1; + } + else if(a == 0 && !profile->alpha && !profile->key) + { + profile->key = 1; + profile->key_r = r; + profile->key_g = g; + profile->key_b = b; + } + else if(a == 65535 && profile->key && matchkey) + { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + profile->alpha = 1; + profile->key = 0; + alpha_done = 1; + } + } + if(alpha_done && numcolors_done && colored_done && bits_done) break; + } + + if(profile->key && !profile->alpha) + { + for(i = 0; i != numpixels; ++i) + { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode); + if(a != 0 && r == profile->key_r && g == profile->key_g && b == profile->key_b) + { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + profile->alpha = 1; + profile->key = 0; + alpha_done = 1; + } + } + } + } + else /* < 16-bit */ + { + unsigned char r = 0, g = 0, b = 0, a = 0; + for(i = 0; i != numpixels; ++i) + { + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode); + + if(!bits_done && profile->bits < 8) + { + /*only r is checked, < 8 bits is only relevant for greyscale*/ + unsigned bits = getValueRequiredBits(r); + if(bits > profile->bits) profile->bits = bits; + } + bits_done = (profile->bits >= bpp); + + if(!colored_done && (r != g || r != b)) + { + profile->colored = 1; + colored_done = 1; + if(profile->bits < 8) profile->bits = 8; /*PNG has no colored modes with less than 8-bit per channel*/ + } + + if(!alpha_done) + { + unsigned matchkey = (r == profile->key_r && g == profile->key_g && b == profile->key_b); + if(a != 255 && (a != 0 || (profile->key && !matchkey))) + { + profile->alpha = 1; + profile->key = 0; + alpha_done = 1; + if(profile->bits < 8) profile->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + else if(a == 0 && !profile->alpha && !profile->key) + { + profile->key = 1; + profile->key_r = r; + profile->key_g = g; + profile->key_b = b; + } + else if(a == 255 && profile->key && matchkey) + { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + profile->alpha = 1; + profile->key = 0; + alpha_done = 1; + if(profile->bits < 8) profile->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + } + + if(!numcolors_done) + { + if(!color_tree_has(&tree, r, g, b, a)) + { + color_tree_add(&tree, r, g, b, a, profile->numcolors); + if(profile->numcolors < 256) + { + unsigned char* p = profile->palette; + unsigned n = profile->numcolors; + p[n * 4 + 0] = r; + p[n * 4 + 1] = g; + p[n * 4 + 2] = b; + p[n * 4 + 3] = a; + } + ++profile->numcolors; + numcolors_done = profile->numcolors >= maxnumcolors; + } + } + + if(alpha_done && numcolors_done && colored_done && bits_done) break; + } + + if(profile->key && !profile->alpha) + { + for(i = 0; i != numpixels; ++i) + { + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode); + if(a != 0 && r == profile->key_r && g == profile->key_g && b == profile->key_b) + { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + profile->alpha = 1; + profile->key = 0; + alpha_done = 1; + if(profile->bits < 8) profile->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + } + } + + /*make the profile's key always 16-bit for consistency - repeat each byte twice*/ + profile->key_r += (profile->key_r << 8); + profile->key_g += (profile->key_g << 8); + profile->key_b += (profile->key_b << 8); + } + + color_tree_cleanup(&tree); + return error; +} + +/*Automatically chooses color type that gives smallest amount of bits in the +output image, e.g. grey if there are only greyscale pixels, palette if there +are less than 256 colors, ... +Updates values of mode with a potentially smaller color model. mode_out should +contain the user chosen color model, but will be overwritten with the new chosen one.*/ +unsigned lodepng_auto_choose_color(LodePNGColorMode* mode_out, + const unsigned char* image, unsigned w, unsigned h, + const LodePNGColorMode* mode_in) +{ + LodePNGColorProfile prof; + unsigned error = 0; + unsigned palettebits, palette_ok; + size_t i, n; + size_t numpixels = (size_t)w * (size_t)h; + + lodepng_color_profile_init(&prof); + error = lodepng_get_color_profile(&prof, image, w, h, mode_in); + if(error) return error; + mode_out->key_defined = 0; + + if(prof.key && numpixels <= 16) + { + prof.alpha = 1; /*too few pixels to justify tRNS chunk overhead*/ + prof.key = 0; + if(prof.bits < 8) prof.bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + n = prof.numcolors; + palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8)); + palette_ok = n <= 256 && prof.bits <= 8; + if(numpixels < n * 2) palette_ok = 0; /*don't add palette overhead if image has only a few pixels*/ + if(!prof.colored && prof.bits <= palettebits) palette_ok = 0; /*grey is less overhead*/ + + if(palette_ok) + { + unsigned char* p = prof.palette; + lodepng_palette_clear(mode_out); /*remove potential earlier palette*/ + for(i = 0; i != prof.numcolors; ++i) + { + error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]); + if(error) break; + } + + mode_out->colortype = LCT_PALETTE; + mode_out->bitdepth = palettebits; + + if(mode_in->colortype == LCT_PALETTE && mode_in->palettesize >= mode_out->palettesize + && mode_in->bitdepth == mode_out->bitdepth) + { + /*If input should have same palette colors, keep original to preserve its order and prevent conversion*/ + lodepng_color_mode_cleanup(mode_out); + lodepng_color_mode_copy(mode_out, mode_in); + } + } + else /*8-bit or 16-bit per channel*/ + { + mode_out->bitdepth = prof.bits; + mode_out->colortype = prof.alpha ? (prof.colored ? LCT_RGBA : LCT_GREY_ALPHA) + : (prof.colored ? LCT_RGB : LCT_GREY); + + if(prof.key) + { + unsigned mask = (1u << mode_out->bitdepth) - 1u; /*profile always uses 16-bit, mask converts it*/ + mode_out->key_r = prof.key_r & mask; + mode_out->key_g = prof.key_g & mask; + mode_out->key_b = prof.key_b & mask; + mode_out->key_defined = 1; + } + } + + return error; +} + +#endif /* #ifdef LODEPNG_COMPILE_ENCODER */ + +/* +Paeth predicter, used by PNG filter type 4 +The parameters are of type short, but should come from unsigned chars, the shorts +are only needed to make the paeth calculation correct. +*/ +static unsigned char paethPredictor(short a, short b, short c) +{ + short pa = abs(b - c); + short pb = abs(a - c); + short pc = abs(a + b - c - c); + + if(pc < pa && pc < pb) return (unsigned char)c; + else if(pb < pa) return (unsigned char)b; + else return (unsigned char)a; +} + +/*shared values used by multiple Adam7 related functions*/ + +static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/ +static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/ +static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/ +static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/ + +/* +Outputs various dimensions and positions in the image related to the Adam7 reduced images. +passw: output containing the width of the 7 passes +passh: output containing the height of the 7 passes +filter_passstart: output containing the index of the start and end of each + reduced image with filter bytes +padded_passstart output containing the index of the start and end of each + reduced image when without filter bytes but with padded scanlines +passstart: output containing the index of the start and end of each reduced + image without padding between scanlines, but still padding between the images +w, h: width and height of non-interlaced image +bpp: bits per pixel +"padded" is only relevant if bpp is less than 8 and a scanline or image does not + end at a full byte +*/ +static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8], + size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp) +{ + /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/ + unsigned i; + + /*calculate width and height in pixels of each pass*/ + for(i = 0; i != 7; ++i) + { + passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i]; + passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i]; + if(passw[i] == 0) passh[i] = 0; + if(passh[i] == 0) passw[i] = 0; + } + + filter_passstart[0] = padded_passstart[0] = passstart[0] = 0; + for(i = 0; i != 7; ++i) + { + /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/ + filter_passstart[i + 1] = filter_passstart[i] + + ((passw[i] && passh[i]) ? passh[i] * (1 + (passw[i] * bpp + 7) / 8) : 0); + /*bits padded if needed to fill full byte at end of each scanline*/ + padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7) / 8); + /*only padded at end of reduced image*/ + passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7) / 8; + } +} + +#ifdef LODEPNG_COMPILE_DECODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG Decoder / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*read the information from the header and store it in the LodePNGInfo. return value is error*/ +unsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state, + const unsigned char* in, size_t insize) +{ + LodePNGInfo* info = &state->info_png; + if(insize == 0 || in == 0) + { + CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/ + } + if(insize < 33) + { + CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/ + } + + /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/ + lodepng_info_cleanup(info); + lodepng_info_init(info); + + if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71 + || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) + { + CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/ + } + if(lodepng_chunk_length(in + 8) != 13) + { + CERROR_RETURN_ERROR(state->error, 94); /*error: header size must be 13 bytes*/ + } + if(!lodepng_chunk_type_equals(in + 8, "IHDR")) + { + CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/ + } + + /*read the values given in the header*/ + *w = lodepng_read32bitInt(&in[16]); + *h = lodepng_read32bitInt(&in[20]); + info->color.bitdepth = in[24]; + info->color.colortype = (LodePNGColorType)in[25]; + info->compression_method = in[26]; + info->filter_method = in[27]; + info->interlace_method = in[28]; + + if(*w == 0 || *h == 0) + { + CERROR_RETURN_ERROR(state->error, 93); + } + + if(!state->decoder.ignore_crc) + { + unsigned CRC = lodepng_read32bitInt(&in[29]); + unsigned checksum = lodepng_crc32(&in[12], 17); + if(CRC != checksum) + { + CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/ + } + } + + /*error: only compression method 0 is allowed in the specification*/ + if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32); + /*error: only filter method 0 is allowed in the specification*/ + if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33); + /*error: only interlace methods 0 and 1 exist in the specification*/ + if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34); + + state->error = checkColorValidity(info->color.colortype, info->color.bitdepth); + return state->error; +} + +static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scanline, const unsigned char* precon, + size_t bytewidth, unsigned char filterType, size_t length) +{ + /* + For PNG filter method 0 + unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte, + the filter works byte per byte (bytewidth = 1) + precon is the previous unfiltered scanline, recon the result, scanline the current one + the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead + recon and scanline MAY be the same memory address! precon must be disjoint. + */ + + size_t i; + switch(filterType) + { + case 0: + for(i = 0; i != length; ++i) recon[i] = scanline[i]; + break; + case 1: + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + recon[i - bytewidth]; + break; + case 2: + if(precon) + { + for(i = 0; i != length; ++i) recon[i] = scanline[i] + precon[i]; + } + else + { + for(i = 0; i != length; ++i) recon[i] = scanline[i]; + } + break; + case 3: + if(precon) + { + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + (precon[i] >> 1); + for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) >> 1); + } + else + { + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + (recon[i - bytewidth] >> 1); + } + break; + case 4: + if(precon) + { + for(i = 0; i != bytewidth; ++i) + { + recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/ + } + for(i = bytewidth; i < length; ++i) + { + recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth])); + } + } + else + { + for(i = 0; i != bytewidth; ++i) + { + recon[i] = scanline[i]; + } + for(i = bytewidth; i < length; ++i) + { + /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/ + recon[i] = (scanline[i] + recon[i - bytewidth]); + } + } + break; + default: return 36; /*error: unexisting filter type given*/ + } + return 0; +} + +static unsigned unfilter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) +{ + /* + For PNG filter method 0 + this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times) + out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline + w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel + in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes) + */ + + unsigned y; + unsigned char* prevline = 0; + + /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ + size_t bytewidth = (bpp + 7) / 8; + size_t linebytes = (w * bpp + 7) / 8; + + for(y = 0; y < h; ++y) + { + size_t outindex = linebytes * y; + size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + unsigned char filterType = in[inindex]; + + CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes)); + + prevline = &out[outindex]; + } + + return 0; +} + +/* +in: Adam7 interlaced image, with no padding bits between scanlines, but between + reduced images so that each reduced image starts at a byte. +out: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h +bpp: bits per pixel +out has the following size in bits: w * h * bpp. +in is possibly bigger due to padding bits between reduced images. +out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation +(because that's likely a little bit faster) +NOTE: comments about padding bits are only relevant if bpp < 8 +*/ +static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) +{ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + if(bpp >= 8) + { + for(i = 0; i != 7; ++i) + { + unsigned x, y, b; + size_t bytewidth = bpp / 8; + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) + { + size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth; + size_t pixeloutstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; + for(b = 0; b < bytewidth; ++b) + { + out[pixeloutstart + b] = in[pixelinstart + b]; + } + } + } + } + else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ + { + for(i = 0; i != 7; ++i) + { + unsigned x, y, b; + unsigned ilinebits = bpp * passw[i]; + unsigned olinebits = bpp * w; + size_t obp, ibp; /*bit pointers (for out and in buffer)*/ + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) + { + ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp); + obp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; + for(b = 0; b < bpp; ++b) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + /*note that this function assumes the out buffer is completely 0, use setBitOfReversedStream otherwise*/ + setBitOfReversedStream0(&obp, out, bit); + } + } + } + } +} + +static void removePaddingBits(unsigned char* out, const unsigned char* in, + size_t olinebits, size_t ilinebits, unsigned h) +{ + /* + After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need + to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers + for the Adam7 code, the color convert code and the output to the user. + in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must + have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits + also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7 + only useful if (ilinebits - olinebits) is a value in the range 1..7 + */ + unsigned y; + size_t diff = ilinebits - olinebits; + size_t ibp = 0, obp = 0; /*input and output bit pointers*/ + for(y = 0; y < h; ++y) + { + size_t x; + for(x = 0; x < olinebits; ++x) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + ibp += diff; + } +} + +/*out must be buffer big enough to contain full image, and in must contain the full decompressed data from +the IDAT chunks (with filter index bytes and possible padding bits) +return value is error*/ +static unsigned postProcessScanlines(unsigned char* out, unsigned char* in, + unsigned w, unsigned h, const LodePNGInfo* info_png) +{ + /* + This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype. + Steps: + *) if no Adam7: 1) unfilter 2) remove padding bits (= posible extra bits per scanline if bpp < 8) + *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace + NOTE: the in buffer will be overwritten with intermediate data! + */ + unsigned bpp = lodepng_get_bpp(&info_png->color); + if(bpp == 0) return 31; /*error: invalid colortype*/ + + if(info_png->interlace_method == 0) + { + if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8) + { + CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp)); + removePaddingBits(out, in, w * bpp, ((w * bpp + 7) / 8) * 8, h); + } + /*we can immediately filter into the out buffer, no other steps needed*/ + else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp)); + } + else /*interlace_method is 1 (Adam7)*/ + { + unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + for(i = 0; i != 7; ++i) + { + CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp)); + /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline, + move bytes instead of bits or move not at all*/ + if(bpp < 8) + { + /*remove padding bits in scanlines; after this there still may be padding + bits between the different reduced images: each reduced image still starts nicely at a byte*/ + removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp, + ((passw[i] * bpp + 7) / 8) * 8, passh[i]); + } + } + + Adam7_deinterlace(out, in, w, h, bpp); + } + + return 0; +} + +static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) +{ + unsigned pos = 0, i; + if(color->palette) lodepng_free(color->palette); + color->palettesize = chunkLength / 3; + color->palette = (unsigned char*)lodepng_malloc(4 * color->palettesize); + if(!color->palette && color->palettesize) + { + color->palettesize = 0; + return 83; /*alloc fail*/ + } + if(color->palettesize > 256) return 38; /*error: palette too big*/ + + for(i = 0; i != color->palettesize; ++i) + { + color->palette[4 * i + 0] = data[pos++]; /*R*/ + color->palette[4 * i + 1] = data[pos++]; /*G*/ + color->palette[4 * i + 2] = data[pos++]; /*B*/ + color->palette[4 * i + 3] = 255; /*alpha*/ + } + + return 0; /* OK */ +} + +static unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) +{ + unsigned i; + if(color->colortype == LCT_PALETTE) + { + /*error: more alpha values given than there are palette entries*/ + if(chunkLength > color->palettesize) return 38; + + for(i = 0; i != chunkLength; ++i) color->palette[4 * i + 3] = data[i]; + } + else if(color->colortype == LCT_GREY) + { + /*error: this chunk must be 2 bytes for greyscale image*/ + if(chunkLength != 2) return 30; + + color->key_defined = 1; + color->key_r = color->key_g = color->key_b = 256u * data[0] + data[1]; + } + else if(color->colortype == LCT_RGB) + { + /*error: this chunk must be 6 bytes for RGB image*/ + if(chunkLength != 6) return 41; + + color->key_defined = 1; + color->key_r = 256u * data[0] + data[1]; + color->key_g = 256u * data[2] + data[3]; + color->key_b = 256u * data[4] + data[5]; + } + else return 42; /*error: tRNS chunk not allowed for other color models*/ + + return 0; /* OK */ +} + + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*background color chunk (bKGD)*/ +static unsigned readChunk_bKGD(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) +{ + if(info->color.colortype == LCT_PALETTE) + { + /*error: this chunk must be 1 byte for indexed color image*/ + if(chunkLength != 1) return 43; + + info->background_defined = 1; + info->background_r = info->background_g = info->background_b = data[0]; + } + else if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) + { + /*error: this chunk must be 2 bytes for greyscale image*/ + if(chunkLength != 2) return 44; + + info->background_defined = 1; + info->background_r = info->background_g = info->background_b = 256u * data[0] + data[1]; + } + else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) + { + /*error: this chunk must be 6 bytes for greyscale image*/ + if(chunkLength != 6) return 45; + + info->background_defined = 1; + info->background_r = 256u * data[0] + data[1]; + info->background_g = 256u * data[2] + data[3]; + info->background_b = 256u * data[4] + data[5]; + } + + return 0; /* OK */ +} + +/*text chunk (tEXt)*/ +static unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) +{ + unsigned error = 0; + char *key = 0, *str = 0; + unsigned i; + + while(!error) /*not really a while loop, only used to break on error*/ + { + unsigned length, string2_begin; + + length = 0; + while(length < chunkLength && data[length] != 0) ++length; + /*even though it's not allowed by the standard, no error is thrown if + there's no null termination char, if the text is empty*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char*)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + key[length] = 0; + for(i = 0; i != length; ++i) key[i] = (char)data[i]; + + string2_begin = length + 1; /*skip keyword null terminator*/ + + length = (unsigned)(chunkLength < string2_begin ? 0 : chunkLength - string2_begin); + str = (char*)lodepng_malloc(length + 1); + if(!str) CERROR_BREAK(error, 83); /*alloc fail*/ + + str[length] = 0; + for(i = 0; i != length; ++i) str[i] = (char)data[string2_begin + i]; + + error = lodepng_add_text(info, key, str); + + break; + } + + lodepng_free(key); + lodepng_free(str); + + return error; +} + +/*compressed text chunk (zTXt)*/ +static unsigned readChunk_zTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, + const unsigned char* data, size_t chunkLength) +{ + unsigned error = 0; + unsigned i; + + unsigned length, string2_begin; + char *key = 0; + ucvector decoded; + + ucvector_init(&decoded); + + while(!error) /*not really a while loop, only used to break on error*/ + { + for(length = 0; length < chunkLength && data[length] != 0; ++length) ; + if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char*)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + key[length] = 0; + for(i = 0; i != length; ++i) key[i] = (char)data[i]; + + if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ + + string2_begin = length + 2; + if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ + + length = (unsigned)chunkLength - string2_begin; + /*will fail if zlib error, e.g. if length is too small*/ + error = zlib_decompress(&decoded.data, &decoded.size, + (unsigned char*)(&data[string2_begin]), + length, zlibsettings); + if(error) break; + ucvector_push_back(&decoded, 0); + + error = lodepng_add_text(info, key, (char*)decoded.data); + + break; + } + + lodepng_free(key); + ucvector_cleanup(&decoded); + + return error; +} + +/*international text chunk (iTXt)*/ +static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, + const unsigned char* data, size_t chunkLength) +{ + unsigned error = 0; + unsigned i; + + unsigned length, begin, compressed; + char *key = 0, *langtag = 0, *transkey = 0; + ucvector decoded; + ucvector_init(&decoded); + + while(!error) /*not really a while loop, only used to break on error*/ + { + /*Quick check if the chunk length isn't too small. Even without check + it'd still fail with other error checks below if it's too short. This just gives a different error code.*/ + if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/ + + /*read the key*/ + for(length = 0; length < chunkLength && data[length] != 0; ++length) ; + if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char*)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + key[length] = 0; + for(i = 0; i != length; ++i) key[i] = (char)data[i]; + + /*read the compression method*/ + compressed = data[length + 1]; + if(data[length + 2] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ + + /*even though it's not allowed by the standard, no error is thrown if + there's no null termination char, if the text is empty for the next 3 texts*/ + + /*read the langtag*/ + begin = length + 3; + length = 0; + for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; + + langtag = (char*)lodepng_malloc(length + 1); + if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/ + + langtag[length] = 0; + for(i = 0; i != length; ++i) langtag[i] = (char)data[begin + i]; + + /*read the transkey*/ + begin += length + 1; + length = 0; + for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; + + transkey = (char*)lodepng_malloc(length + 1); + if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/ + + transkey[length] = 0; + for(i = 0; i != length; ++i) transkey[i] = (char)data[begin + i]; + + /*read the actual text*/ + begin += length + 1; + + length = (unsigned)chunkLength < begin ? 0 : (unsigned)chunkLength - begin; + + if(compressed) + { + /*will fail if zlib error, e.g. if length is too small*/ + error = zlib_decompress(&decoded.data, &decoded.size, + (unsigned char*)(&data[begin]), + length, zlibsettings); + if(error) break; + if(decoded.allocsize < decoded.size) decoded.allocsize = decoded.size; + ucvector_push_back(&decoded, 0); + } + else + { + if(!ucvector_resize(&decoded, length + 1)) CERROR_BREAK(error, 83 /*alloc fail*/); + + decoded.data[length] = 0; + for(i = 0; i != length; ++i) decoded.data[i] = data[begin + i]; + } + + error = lodepng_add_itext(info, key, langtag, transkey, (char*)decoded.data); + + break; + } + + lodepng_free(key); + lodepng_free(langtag); + lodepng_free(transkey); + ucvector_cleanup(&decoded); + + return error; +} + +static unsigned readChunk_tIME(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) +{ + if(chunkLength != 7) return 73; /*invalid tIME chunk size*/ + + info->time_defined = 1; + info->time.year = 256u * data[0] + data[1]; + info->time.month = data[2]; + info->time.day = data[3]; + info->time.hour = data[4]; + info->time.minute = data[5]; + info->time.second = data[6]; + + return 0; /* OK */ +} + +static unsigned readChunk_pHYs(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) +{ + if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/ + + info->phys_defined = 1; + info->phys_x = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; + info->phys_y = 16777216u * data[4] + 65536u * data[5] + 256u * data[6] + data[7]; + info->phys_unit = data[8]; + + return 0; /* OK */ +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/ +static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize) +{ + unsigned char IEND = 0; + const unsigned char* chunk; + size_t i; + ucvector idat; /*the data from idat chunks*/ + ucvector scanlines; + size_t predict; + size_t outsize = 0; + + /*for unknown chunk order*/ + unsigned unknown = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + + /*provide some proper output values if error will happen*/ + *out = 0; + + state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/ + if(state->error) return; + + if(lodepng_pixel_overflow(*w, *h, &state->info_png.color, &state->info_raw)) + { + CERROR_RETURN(state->error, 92); /*overflow possible due to amount of pixels*/ + } + + ucvector_init(&idat); + chunk = &in[33]; /*first byte of the first chunk after the header*/ + + /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk. + IDAT data is put at the start of the in buffer*/ + while(!IEND && !state->error) + { + unsigned chunkLength; + const unsigned char* data; /*the data in the chunk*/ + + /*error: size of the in buffer too small to contain next chunk*/ + if((size_t)((chunk - in) + 12) > insize || chunk < in) + { + if(state->decoder.ignore_end) break; /*other errors may still happen though*/ + CERROR_BREAK(state->error, 30); + } + + /*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/ + chunkLength = lodepng_chunk_length(chunk); + /*error: chunk length larger than the max PNG chunk size*/ + if(chunkLength > 2147483647) + { + if(state->decoder.ignore_end) break; /*other errors may still happen though*/ + CERROR_BREAK(state->error, 63); + } + + if((size_t)((chunk - in) + chunkLength + 12) > insize || (chunk + chunkLength + 12) < in) + { + CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk*/ + } + + data = lodepng_chunk_data_const(chunk); + + /*IDAT chunk, containing compressed image data*/ + if(lodepng_chunk_type_equals(chunk, "IDAT")) + { + size_t oldsize = idat.size; + size_t newsize; + if(lodepng_addofl(oldsize, chunkLength, &newsize)) CERROR_BREAK(state->error, 95); + if(!ucvector_resize(&idat, newsize)) CERROR_BREAK(state->error, 83 /*alloc fail*/); + for(i = 0; i != chunkLength; ++i) idat.data[oldsize + i] = data[i]; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + critical_pos = 3; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + /*IEND chunk*/ + else if(lodepng_chunk_type_equals(chunk, "IEND")) + { + IEND = 1; + } + /*palette chunk (PLTE)*/ + else if(lodepng_chunk_type_equals(chunk, "PLTE")) + { + state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength); + if(state->error) break; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + critical_pos = 2; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + /*palette transparency chunk (tRNS)*/ + else if(lodepng_chunk_type_equals(chunk, "tRNS")) + { + state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength); + if(state->error) break; + } +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*background color chunk (bKGD)*/ + else if(lodepng_chunk_type_equals(chunk, "bKGD")) + { + state->error = readChunk_bKGD(&state->info_png, data, chunkLength); + if(state->error) break; + } + /*text chunk (tEXt)*/ + else if(lodepng_chunk_type_equals(chunk, "tEXt")) + { + if(state->decoder.read_text_chunks) + { + state->error = readChunk_tEXt(&state->info_png, data, chunkLength); + if(state->error) break; + } + } + /*compressed text chunk (zTXt)*/ + else if(lodepng_chunk_type_equals(chunk, "zTXt")) + { + if(state->decoder.read_text_chunks) + { + state->error = readChunk_zTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); + if(state->error) break; + } + } + /*international text chunk (iTXt)*/ + else if(lodepng_chunk_type_equals(chunk, "iTXt")) + { + if(state->decoder.read_text_chunks) + { + state->error = readChunk_iTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); + if(state->error) break; + } + } + else if(lodepng_chunk_type_equals(chunk, "tIME")) + { + state->error = readChunk_tIME(&state->info_png, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "pHYs")) + { + state->error = readChunk_pHYs(&state->info_png, data, chunkLength); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + else /*it's not an implemented chunk type, so ignore it: skip over the data*/ + { + /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/ + if(!state->decoder.ignore_critical && !lodepng_chunk_ancillary(chunk)) + { + CERROR_BREAK(state->error, 69); + } + + unknown = 1; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(state->decoder.remember_unknown_chunks) + { + state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1], + &state->info_png.unknown_chunks_size[critical_pos - 1], chunk); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + + if(!state->decoder.ignore_crc && !unknown) /*check CRC if wanted, only on known chunk types*/ + { + if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/ + } + + if(!IEND) chunk = lodepng_chunk_next_const(chunk); + } + + ucvector_init(&scanlines); + /*predict output size, to allocate exact size for output buffer to avoid more dynamic allocation. + If the decompressed size does not match the prediction, the image must be corrupt.*/ + if(state->info_png.interlace_method == 0) + { + predict = lodepng_get_raw_size_idat(*w, *h, &state->info_png.color); + } + else + { + /*Adam-7 interlaced: predicted size is the sum of the 7 sub-images sizes*/ + const LodePNGColorMode* color = &state->info_png.color; + predict = 0; + predict += lodepng_get_raw_size_idat((*w + 7) >> 3, (*h + 7) >> 3, color); + if(*w > 4) predict += lodepng_get_raw_size_idat((*w + 3) >> 3, (*h + 7) >> 3, color); + predict += lodepng_get_raw_size_idat((*w + 3) >> 2, (*h + 3) >> 3, color); + if(*w > 2) predict += lodepng_get_raw_size_idat((*w + 1) >> 2, (*h + 3) >> 2, color); + predict += lodepng_get_raw_size_idat((*w + 1) >> 1, (*h + 1) >> 2, color); + if(*w > 1) predict += lodepng_get_raw_size_idat((*w + 0) >> 1, (*h + 1) >> 1, color); + predict += lodepng_get_raw_size_idat((*w + 0), (*h + 0) >> 1, color); + } + if(!state->error && !ucvector_reserve(&scanlines, predict)) state->error = 83; /*alloc fail*/ + if(!state->error) + { + state->error = zlib_decompress(&scanlines.data, &scanlines.size, idat.data, + idat.size, &state->decoder.zlibsettings); + if(!state->error && scanlines.size != predict) state->error = 91; /*decompressed size doesn't match prediction*/ + } + ucvector_cleanup(&idat); + + if(!state->error) + { + outsize = lodepng_get_raw_size(*w, *h, &state->info_png.color); + *out = (unsigned char*)lodepng_malloc(outsize); + if(!*out) state->error = 83; /*alloc fail*/ + } + if(!state->error) + { + for(i = 0; i < outsize; i++) (*out)[i] = 0; + state->error = postProcessScanlines(*out, scanlines.data, *w, *h, &state->info_png); + } + ucvector_cleanup(&scanlines); +} + +unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize) +{ + *out = 0; + decodeGeneric(out, w, h, state, in, insize); + if(state->error) return state->error; + if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color)) + { + /*same color type, no copying or converting of data needed*/ + /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype + the raw image has to the end user*/ + if(!state->decoder.color_convert) + { + state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color); + if(state->error) return state->error; + } + } + else + { + /*color conversion needed; sort of copy of the data*/ + unsigned char* data = *out; + size_t outsize; + + /*TODO: check if this works according to the statement in the documentation: "The converter can convert + from greyscale input color type, to 8-bit greyscale or greyscale with alpha"*/ + if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA) + && !(state->info_raw.bitdepth == 8)) + { + return 56; /*unsupported color mode conversion*/ + } + + outsize = lodepng_get_raw_size(*w, *h, &state->info_raw); + *out = (unsigned char*)lodepng_malloc(outsize); + if(!(*out)) + { + state->error = 83; /*alloc fail*/ + } + else state->error = lodepng_convert(*out, data, &state->info_raw, + &state->info_png.color, *w, *h); + lodepng_free(data); + } + return state->error; +} + +unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, + size_t insize, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned error; + LodePNGState state; + lodepng_state_init(&state); + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + error = lodepng_decode(out, w, h, &state, in, insize); + lodepng_state_cleanup(&state); + return error; +} + +unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) +{ + return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8); +} + +unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) +{ + return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer = 0; + size_t buffersize; + unsigned error; + error = lodepng_load_file(&buffer, &buffersize, filename); + if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth); + lodepng_free(buffer); + return error; +} + +unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) +{ + return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8); +} + +unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) +{ + return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8); +} +#endif /*LODEPNG_COMPILE_DISK*/ + +void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings) +{ + settings->color_convert = 1; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + settings->read_text_chunks = 1; + settings->remember_unknown_chunks = 0; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + settings->ignore_crc = 0; + settings->ignore_critical = 0; + settings->ignore_end = 0; + lodepng_decompress_settings_init(&settings->zlibsettings); +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) + +void lodepng_state_init(LodePNGState* state) +{ +#ifdef LODEPNG_COMPILE_DECODER + lodepng_decoder_settings_init(&state->decoder); +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER + lodepng_encoder_settings_init(&state->encoder); +#endif /*LODEPNG_COMPILE_ENCODER*/ + lodepng_color_mode_init(&state->info_raw); + lodepng_info_init(&state->info_png); + state->error = 1; +} + +void lodepng_state_cleanup(LodePNGState* state) +{ + lodepng_color_mode_cleanup(&state->info_raw); + lodepng_info_cleanup(&state->info_png); +} + +void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source) +{ + lodepng_state_cleanup(dest); + *dest = *source; + lodepng_color_mode_init(&dest->info_raw); + lodepng_info_init(&dest->info_png); + dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw); if(dest->error) return; + dest->error = lodepng_info_copy(&dest->info_png, &source->info_png); if(dest->error) return; +} + +#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ + +#ifdef LODEPNG_COMPILE_ENCODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG Encoder / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*chunkName must be string of 4 characters*/ +static unsigned addChunk(ucvector* out, const char* chunkName, const unsigned char* data, size_t length) +{ + CERROR_TRY_RETURN(lodepng_chunk_create(&out->data, &out->size, (unsigned)length, chunkName, data)); + out->allocsize = out->size; /*fix the allocsize again*/ + return 0; +} + +static void writeSignature(ucvector* out) +{ + /*8 bytes PNG signature, aka the magic bytes*/ + ucvector_push_back(out, 137); + ucvector_push_back(out, 80); + ucvector_push_back(out, 78); + ucvector_push_back(out, 71); + ucvector_push_back(out, 13); + ucvector_push_back(out, 10); + ucvector_push_back(out, 26); + ucvector_push_back(out, 10); +} + +static unsigned addChunk_IHDR(ucvector* out, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method) +{ + unsigned error = 0; + ucvector header; + ucvector_init(&header); + + lodepng_add32bitInt(&header, w); /*width*/ + lodepng_add32bitInt(&header, h); /*height*/ + ucvector_push_back(&header, (unsigned char)bitdepth); /*bit depth*/ + ucvector_push_back(&header, (unsigned char)colortype); /*color type*/ + ucvector_push_back(&header, 0); /*compression method*/ + ucvector_push_back(&header, 0); /*filter method*/ + ucvector_push_back(&header, interlace_method); /*interlace method*/ + + error = addChunk(out, "IHDR", header.data, header.size); + ucvector_cleanup(&header); + + return error; +} + +static unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info) +{ + unsigned error = 0; + size_t i; + ucvector PLTE; + ucvector_init(&PLTE); + for(i = 0; i != info->palettesize * 4; ++i) + { + /*add all channels except alpha channel*/ + if(i % 4 != 3) ucvector_push_back(&PLTE, info->palette[i]); + } + error = addChunk(out, "PLTE", PLTE.data, PLTE.size); + ucvector_cleanup(&PLTE); + + return error; +} + +static unsigned addChunk_tRNS(ucvector* out, const LodePNGColorMode* info) +{ + unsigned error = 0; + size_t i; + ucvector tRNS; + ucvector_init(&tRNS); + if(info->colortype == LCT_PALETTE) + { + size_t amount = info->palettesize; + /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/ + for(i = info->palettesize; i != 0; --i) + { + if(info->palette[4 * (i - 1) + 3] == 255) --amount; + else break; + } + /*add only alpha channel*/ + for(i = 0; i != amount; ++i) ucvector_push_back(&tRNS, info->palette[4 * i + 3]); + } + else if(info->colortype == LCT_GREY) + { + if(info->key_defined) + { + ucvector_push_back(&tRNS, (unsigned char)(info->key_r >> 8)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_r & 255)); + } + } + else if(info->colortype == LCT_RGB) + { + if(info->key_defined) + { + ucvector_push_back(&tRNS, (unsigned char)(info->key_r >> 8)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_r & 255)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_g >> 8)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_g & 255)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_b >> 8)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_b & 255)); + } + } + + error = addChunk(out, "tRNS", tRNS.data, tRNS.size); + ucvector_cleanup(&tRNS); + + return error; +} + +static unsigned addChunk_IDAT(ucvector* out, const unsigned char* data, size_t datasize, + LodePNGCompressSettings* zlibsettings) +{ + ucvector zlibdata; + unsigned error = 0; + + /*compress with the Zlib compressor*/ + ucvector_init(&zlibdata); + error = zlib_compress(&zlibdata.data, &zlibdata.size, data, datasize, zlibsettings); + if(!error) error = addChunk(out, "IDAT", zlibdata.data, zlibdata.size); + ucvector_cleanup(&zlibdata); + + return error; +} + +static unsigned addChunk_IEND(ucvector* out) +{ + unsigned error = 0; + error = addChunk(out, "IEND", 0, 0); + return error; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +static unsigned addChunk_tEXt(ucvector* out, const char* keyword, const char* textstring) +{ + unsigned error = 0; + size_t i; + ucvector text; + ucvector_init(&text); + for(i = 0; keyword[i] != 0; ++i) ucvector_push_back(&text, (unsigned char)keyword[i]); + if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ + ucvector_push_back(&text, 0); /*0 termination char*/ + for(i = 0; textstring[i] != 0; ++i) ucvector_push_back(&text, (unsigned char)textstring[i]); + error = addChunk(out, "tEXt", text.data, text.size); + ucvector_cleanup(&text); + + return error; +} + +static unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* textstring, + LodePNGCompressSettings* zlibsettings) +{ + unsigned error = 0; + ucvector data, compressed; + size_t i, textsize = strlen(textstring); + + ucvector_init(&data); + ucvector_init(&compressed); + for(i = 0; keyword[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)keyword[i]); + if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ + ucvector_push_back(&data, 0); /*0 termination char*/ + ucvector_push_back(&data, 0); /*compression method: 0*/ + + error = zlib_compress(&compressed.data, &compressed.size, + (unsigned char*)textstring, textsize, zlibsettings); + if(!error) + { + for(i = 0; i != compressed.size; ++i) ucvector_push_back(&data, compressed.data[i]); + error = addChunk(out, "zTXt", data.data, data.size); + } + + ucvector_cleanup(&compressed); + ucvector_cleanup(&data); + return error; +} + +static unsigned addChunk_iTXt(ucvector* out, unsigned compressed, const char* keyword, const char* langtag, + const char* transkey, const char* textstring, LodePNGCompressSettings* zlibsettings) +{ + unsigned error = 0; + ucvector data; + size_t i, textsize = strlen(textstring); + + ucvector_init(&data); + + for(i = 0; keyword[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)keyword[i]); + if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ + ucvector_push_back(&data, 0); /*null termination char*/ + ucvector_push_back(&data, compressed ? 1 : 0); /*compression flag*/ + ucvector_push_back(&data, 0); /*compression method*/ + for(i = 0; langtag[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)langtag[i]); + ucvector_push_back(&data, 0); /*null termination char*/ + for(i = 0; transkey[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)transkey[i]); + ucvector_push_back(&data, 0); /*null termination char*/ + + if(compressed) + { + ucvector compressed_data; + ucvector_init(&compressed_data); + error = zlib_compress(&compressed_data.data, &compressed_data.size, + (unsigned char*)textstring, textsize, zlibsettings); + if(!error) + { + for(i = 0; i != compressed_data.size; ++i) ucvector_push_back(&data, compressed_data.data[i]); + } + ucvector_cleanup(&compressed_data); + } + else /*not compressed*/ + { + for(i = 0; textstring[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)textstring[i]); + } + + if(!error) error = addChunk(out, "iTXt", data.data, data.size); + ucvector_cleanup(&data); + return error; +} + +static unsigned addChunk_bKGD(ucvector* out, const LodePNGInfo* info) +{ + unsigned error = 0; + ucvector bKGD; + ucvector_init(&bKGD); + if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) + { + ucvector_push_back(&bKGD, (unsigned char)(info->background_r >> 8)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_r & 255)); + } + else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) + { + ucvector_push_back(&bKGD, (unsigned char)(info->background_r >> 8)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_r & 255)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_g >> 8)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_g & 255)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_b >> 8)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_b & 255)); + } + else if(info->color.colortype == LCT_PALETTE) + { + ucvector_push_back(&bKGD, (unsigned char)(info->background_r & 255)); /*palette index*/ + } + + error = addChunk(out, "bKGD", bKGD.data, bKGD.size); + ucvector_cleanup(&bKGD); + + return error; +} + +static unsigned addChunk_tIME(ucvector* out, const LodePNGTime* time) +{ + unsigned error = 0; + unsigned char* data = (unsigned char*)lodepng_malloc(7); + if(!data) return 83; /*alloc fail*/ + data[0] = (unsigned char)(time->year >> 8); + data[1] = (unsigned char)(time->year & 255); + data[2] = (unsigned char)time->month; + data[3] = (unsigned char)time->day; + data[4] = (unsigned char)time->hour; + data[5] = (unsigned char)time->minute; + data[6] = (unsigned char)time->second; + error = addChunk(out, "tIME", data, 7); + lodepng_free(data); + return error; +} + +static unsigned addChunk_pHYs(ucvector* out, const LodePNGInfo* info) +{ + unsigned error = 0; + ucvector data; + ucvector_init(&data); + + lodepng_add32bitInt(&data, info->phys_x); + lodepng_add32bitInt(&data, info->phys_y); + ucvector_push_back(&data, info->phys_unit); + + error = addChunk(out, "pHYs", data.data, data.size); + ucvector_cleanup(&data); + + return error; +} + +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline, + size_t length, size_t bytewidth, unsigned char filterType) +{ + size_t i; + switch(filterType) + { + case 0: /*None*/ + for(i = 0; i != length; ++i) out[i] = scanline[i]; + break; + case 1: /*Sub*/ + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - scanline[i - bytewidth]; + break; + case 2: /*Up*/ + if(prevline) + { + for(i = 0; i != length; ++i) out[i] = scanline[i] - prevline[i]; + } + else + { + for(i = 0; i != length; ++i) out[i] = scanline[i]; + } + break; + case 3: /*Average*/ + if(prevline) + { + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i] - (prevline[i] >> 1); + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) >> 1); + } + else + { + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - (scanline[i - bytewidth] >> 1); + } + break; + case 4: /*Paeth*/ + if(prevline) + { + /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ + for(i = 0; i != bytewidth; ++i) out[i] = (scanline[i] - prevline[i]); + for(i = bytewidth; i < length; ++i) + { + out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); + } + } + else + { + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ + for(i = bytewidth; i < length; ++i) out[i] = (scanline[i] - scanline[i - bytewidth]); + } + break; + default: return; /*unexisting filter type given*/ + } +} + +/* log2 approximation. A slight bit faster than std::log. */ +static float flog2(float f) +{ + float result = 0; + while(f > 32) { result += 4; f /= 16; } + while(f > 2) { ++result; f /= 2; } + return result + 1.442695f * (f * f * f / 3 - 3 * f * f / 2 + 3 * f - 1.83333f); +} + +static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, + const LodePNGColorMode* info, const LodePNGEncoderSettings* settings) +{ + /* + For PNG filter method 0 + out must be a buffer with as size: h + (w * h * bpp + 7) / 8, because there are + the scanlines with 1 extra byte per scanline + */ + + unsigned bpp = lodepng_get_bpp(info); + /*the width of a scanline in bytes, not including the filter type*/ + size_t linebytes = (w * bpp + 7) / 8; + /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ + size_t bytewidth = (bpp + 7) / 8; + const unsigned char* prevline = 0; + unsigned x, y; + unsigned error = 0; + LodePNGFilterStrategy strategy = settings->filter_strategy; + + /* + There is a heuristic called the minimum sum of absolute differences heuristic, suggested by the PNG standard: + * If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e. + use fixed filtering, with the filter None). + * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is + not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply + all five filters and select the filter that produces the smallest sum of absolute values per row. + This heuristic is used if filter strategy is LFS_MINSUM and filter_palette_zero is true. + + If filter_palette_zero is true and filter_strategy is not LFS_MINSUM, the above heuristic is followed, + but for "the other case", whatever strategy filter_strategy is set to instead of the minimum sum + heuristic is used. + */ + if(settings->filter_palette_zero && + (info->colortype == LCT_PALETTE || info->bitdepth < 8)) strategy = LFS_ZERO; + + if(bpp == 0) return 31; /*error: invalid color type*/ + + if(strategy == LFS_ZERO) + { + for(y = 0; y != h; ++y) + { + size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + size_t inindex = linebytes * y; + out[outindex] = 0; /*filter type byte*/ + filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, 0); + prevline = &in[inindex]; + } + } + else if(strategy == LFS_MINSUM) + { + /*adaptive filtering*/ + size_t sum[5]; + unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t smallest = 0; + unsigned char type, bestType = 0; + + for(type = 0; type != 5; ++type) + { + attempt[type] = (unsigned char*)lodepng_malloc(linebytes); + if(!attempt[type]) return 83; /*alloc fail*/ + } + + if(!error) + { + for(y = 0; y != h; ++y) + { + /*try the 5 filter types*/ + for(type = 0; type != 5; ++type) + { + filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); + + /*calculate the sum of the result*/ + sum[type] = 0; + if(type == 0) + { + for(x = 0; x != linebytes; ++x) sum[type] += (unsigned char)(attempt[type][x]); + } + else + { + for(x = 0; x != linebytes; ++x) + { + /*For differences, each byte should be treated as signed, values above 127 are negative + (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there. + This means filtertype 0 is almost never chosen, but that is justified.*/ + unsigned char s = attempt[type][x]; + sum[type] += s < 128 ? s : (255U - s); + } + } + + /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || sum[type] < smallest) + { + bestType = type; + smallest = sum[type]; + } + } + + prevline = &in[y * linebytes]; + + /*now fill the out values*/ + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; + } + } + + for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); + } + else if(strategy == LFS_ENTROPY) + { + float sum[5]; + unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ + float smallest = 0; + unsigned type, bestType = 0; + unsigned count[256]; + + for(type = 0; type != 5; ++type) + { + attempt[type] = (unsigned char*)lodepng_malloc(linebytes); + if(!attempt[type]) return 83; /*alloc fail*/ + } + + for(y = 0; y != h; ++y) + { + /*try the 5 filter types*/ + for(type = 0; type != 5; ++type) + { + filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); + for(x = 0; x != 256; ++x) count[x] = 0; + for(x = 0; x != linebytes; ++x) ++count[attempt[type][x]]; + ++count[type]; /*the filter type itself is part of the scanline*/ + sum[type] = 0; + for(x = 0; x != 256; ++x) + { + float p = count[x] / (float)(linebytes + 1); + sum[type] += count[x] == 0 ? 0 : flog2(1 / p) * p; + } + /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || sum[type] < smallest) + { + bestType = type; + smallest = sum[type]; + } + } + + prevline = &in[y * linebytes]; + + /*now fill the out values*/ + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; + } + + for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); + } + else if(strategy == LFS_PREDEFINED) + { + for(y = 0; y != h; ++y) + { + size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + size_t inindex = linebytes * y; + unsigned char type = settings->predefined_filters[y]; + out[outindex] = type; /*filter type byte*/ + filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); + prevline = &in[inindex]; + } + } + else if(strategy == LFS_BRUTE_FORCE) + { + /*brute force filter chooser. + deflate the scanline after every filter attempt to see which one deflates best. + This is very slow and gives only slightly smaller, sometimes even larger, result*/ + size_t size[5]; + unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t smallest = 0; + unsigned type = 0, bestType = 0; + unsigned char* dummy; + LodePNGCompressSettings zlibsettings = settings->zlibsettings; + /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose, + to simulate the true case where the tree is the same for the whole image. Sometimes it gives + better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare + cases better compression. It does make this a bit less slow, so it's worth doing this.*/ + zlibsettings.btype = 1; + /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG + images only, so disable it*/ + zlibsettings.custom_zlib = 0; + zlibsettings.custom_deflate = 0; + for(type = 0; type != 5; ++type) + { + attempt[type] = (unsigned char*)lodepng_malloc(linebytes); + if(!attempt[type]) return 83; /*alloc fail*/ + } + for(y = 0; y != h; ++y) /*try the 5 filter types*/ + { + for(type = 0; type != 5; ++type) + { + unsigned testsize = (unsigned)linebytes; + /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/ + + filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); + size[type] = 0; + dummy = 0; + zlib_compress(&dummy, &size[type], attempt[type], testsize, &zlibsettings); + lodepng_free(dummy); + /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || size[type] < smallest) + { + bestType = type; + smallest = size[type]; + } + } + prevline = &in[y * linebytes]; + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; + } + for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); + } + else return 88; /* unknown filter strategy */ + + return error; +} + +static void addPaddingBits(unsigned char* out, const unsigned char* in, + size_t olinebits, size_t ilinebits, unsigned h) +{ + /*The opposite of the removePaddingBits function + olinebits must be >= ilinebits*/ + unsigned y; + size_t diff = olinebits - ilinebits; + size_t obp = 0, ibp = 0; /*bit pointers*/ + for(y = 0; y != h; ++y) + { + size_t x; + for(x = 0; x < ilinebits; ++x) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + /*obp += diff; --> no, fill in some value in the padding bits too, to avoid + "Use of uninitialised value of size ###" warning from valgrind*/ + for(x = 0; x != diff; ++x) setBitOfReversedStream(&obp, out, 0); + } +} + +/* +in: non-interlaced image with size w*h +out: the same pixels, but re-ordered according to PNG's Adam7 interlacing, with + no padding bits between scanlines, but between reduced images so that each + reduced image starts at a byte. +bpp: bits per pixel +there are no padding bits, not between scanlines, not between reduced images +in has the following size in bits: w * h * bpp. +out is possibly bigger due to padding bits between reduced images +NOTE: comments about padding bits are only relevant if bpp < 8 +*/ +static void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) +{ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + if(bpp >= 8) + { + for(i = 0; i != 7; ++i) + { + unsigned x, y, b; + size_t bytewidth = bpp / 8; + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) + { + size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; + size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth; + for(b = 0; b < bytewidth; ++b) + { + out[pixeloutstart + b] = in[pixelinstart + b]; + } + } + } + } + else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ + { + for(i = 0; i != 7; ++i) + { + unsigned x, y, b; + unsigned ilinebits = bpp * passw[i]; + unsigned olinebits = bpp * w; + size_t obp, ibp; /*bit pointers (for out and in buffer)*/ + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) + { + ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; + obp = (8 * passstart[i]) + (y * ilinebits + x * bpp); + for(b = 0; b < bpp; ++b) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + } + } + } +} + +/*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image. +return value is error**/ +static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const unsigned char* in, + unsigned w, unsigned h, + const LodePNGInfo* info_png, const LodePNGEncoderSettings* settings) +{ + /* + This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps: + *) if no Adam7: 1) add padding bits (= posible extra bits per scanline if bpp < 8) 2) filter + *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter + */ + unsigned bpp = lodepng_get_bpp(&info_png->color); + unsigned error = 0; + + if(info_png->interlace_method == 0) + { + *outsize = h + (h * ((w * bpp + 7) / 8)); /*image size plus an extra byte per scanline + possible padding bits*/ + *out = (unsigned char*)lodepng_malloc(*outsize); + if(!(*out) && (*outsize)) error = 83; /*alloc fail*/ + + if(!error) + { + /*non multiple of 8 bits per scanline, padding bits needed per scanline*/ + if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8) + { + unsigned char* padded = (unsigned char*)lodepng_malloc(h * ((w * bpp + 7) / 8)); + if(!padded) error = 83; /*alloc fail*/ + if(!error) + { + addPaddingBits(padded, in, ((w * bpp + 7) / 8) * 8, w * bpp, h); + error = filter(*out, padded, w, h, &info_png->color, settings); + } + lodepng_free(padded); + } + else + { + /*we can immediately filter into the out buffer, no other steps needed*/ + error = filter(*out, in, w, h, &info_png->color, settings); + } + } + } + else /*interlace_method is 1 (Adam7)*/ + { + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned char* adam7; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/ + *out = (unsigned char*)lodepng_malloc(*outsize); + if(!(*out)) error = 83; /*alloc fail*/ + + adam7 = (unsigned char*)lodepng_malloc(passstart[7]); + if(!adam7 && passstart[7]) error = 83; /*alloc fail*/ + + if(!error) + { + unsigned i; + + Adam7_interlace(adam7, in, w, h, bpp); + for(i = 0; i != 7; ++i) + { + if(bpp < 8) + { + unsigned char* padded = (unsigned char*)lodepng_malloc(padded_passstart[i + 1] - padded_passstart[i]); + if(!padded) ERROR_BREAK(83); /*alloc fail*/ + addPaddingBits(padded, &adam7[passstart[i]], + ((passw[i] * bpp + 7) / 8) * 8, passw[i] * bpp, passh[i]); + error = filter(&(*out)[filter_passstart[i]], padded, + passw[i], passh[i], &info_png->color, settings); + lodepng_free(padded); + } + else + { + error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]], + passw[i], passh[i], &info_png->color, settings); + } + + if(error) break; + } + } + + lodepng_free(adam7); + } + + return error; +} + +/* +palette must have 4 * palettesize bytes allocated, and given in format RGBARGBARGBARGBA... +returns 0 if the palette is opaque, +returns 1 if the palette has a single color with alpha 0 ==> color key +returns 2 if the palette is semi-translucent. +*/ +static unsigned getPaletteTranslucency(const unsigned char* palette, size_t palettesize) +{ + size_t i; + unsigned key = 0; + unsigned r = 0, g = 0, b = 0; /*the value of the color with alpha 0, so long as color keying is possible*/ + for(i = 0; i != palettesize; ++i) + { + if(!key && palette[4 * i + 3] == 0) + { + r = palette[4 * i + 0]; g = palette[4 * i + 1]; b = palette[4 * i + 2]; + key = 1; + i = (size_t)(-1); /*restart from beginning, to detect earlier opaque colors with key's value*/ + } + else if(palette[4 * i + 3] != 255) return 2; + /*when key, no opaque RGB may have key's RGB*/ + else if(key && r == palette[i * 4 + 0] && g == palette[i * 4 + 1] && b == palette[i * 4 + 2]) return 2; + } + return key; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +static unsigned addUnknownChunks(ucvector* out, unsigned char* data, size_t datasize) +{ + unsigned char* inchunk = data; + while((size_t)(inchunk - data) < datasize) + { + CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk)); + out->allocsize = out->size; /*fix the allocsize again*/ + inchunk = lodepng_chunk_next(inchunk); + } + return 0; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +unsigned lodepng_encode(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h, + LodePNGState* state) +{ + LodePNGInfo info; + ucvector outv; + unsigned char* data = 0; /*uncompressed version of the IDAT chunk data*/ + size_t datasize = 0; + + /*provide some proper output values if error will happen*/ + *out = 0; + *outsize = 0; + state->error = 0; + + /*check input values validity*/ + if((state->info_png.color.colortype == LCT_PALETTE || state->encoder.force_palette) + && (state->info_png.color.palettesize == 0 || state->info_png.color.palettesize > 256)) + { + CERROR_RETURN_ERROR(state->error, 68); /*invalid palette size, it is only allowed to be 1-256*/ + } + if(state->encoder.zlibsettings.btype > 2) + { + CERROR_RETURN_ERROR(state->error, 61); /*error: unexisting btype*/ + } + if(state->info_png.interlace_method > 1) + { + CERROR_RETURN_ERROR(state->error, 71); /*error: unexisting interlace mode*/ + } + state->error = checkColorValidity(state->info_png.color.colortype, state->info_png.color.bitdepth); + if(state->error) return state->error; /*error: unexisting color type given*/ + state->error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth); + if(state->error) return state->error; /*error: unexisting color type given*/ + + /* color convert and compute scanline filter types */ + lodepng_info_init(&info); + lodepng_info_copy(&info, &state->info_png); + if(state->encoder.auto_convert) + { + state->error = lodepng_auto_choose_color(&info.color, image, w, h, &state->info_raw); + } + if (!state->error) + { + if(!lodepng_color_mode_equal(&state->info_raw, &info.color)) + { + unsigned char* converted; + size_t size = ((size_t)w * (size_t)h * (size_t)lodepng_get_bpp(&info.color) + 7) / 8; + + converted = (unsigned char*)lodepng_malloc(size); + if(!converted && size) state->error = 83; /*alloc fail*/ + if(!state->error) + { + state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h); + } + if(!state->error) preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder); + lodepng_free(converted); + } + else preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder); + } + + /* output all PNG chunks */ + ucvector_init(&outv); + while(!state->error) /*while only executed once, to break on error*/ + { +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + size_t i; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*write signature and chunks*/ + writeSignature(&outv); + /*IHDR*/ + addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*unknown chunks between IHDR and PLTE*/ + if(info.unknown_chunks_data[0]) + { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*PLTE*/ + if(info.color.colortype == LCT_PALETTE) + { + addChunk_PLTE(&outv, &info.color); + } + if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA)) + { + addChunk_PLTE(&outv, &info.color); + } + /*tRNS*/ + if(info.color.colortype == LCT_PALETTE && getPaletteTranslucency(info.color.palette, info.color.palettesize) != 0) + { + addChunk_tRNS(&outv, &info.color); + } + if((info.color.colortype == LCT_GREY || info.color.colortype == LCT_RGB) && info.color.key_defined) + { + addChunk_tRNS(&outv, &info.color); + } +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*bKGD (must come between PLTE and the IDAt chunks*/ + if(info.background_defined) addChunk_bKGD(&outv, &info); + /*pHYs (must come before the IDAT chunks)*/ + if(info.phys_defined) addChunk_pHYs(&outv, &info); + + /*unknown chunks between PLTE and IDAT*/ + if(info.unknown_chunks_data[1]) + { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*IDAT (multiple IDAT chunks must be consecutive)*/ + state->error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings); + if(state->error) break; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*tIME*/ + if(info.time_defined) addChunk_tIME(&outv, &info.time); + /*tEXt and/or zTXt*/ + for(i = 0; i != info.text_num; ++i) + { + if(strlen(info.text_keys[i]) > 79) + { + state->error = 66; /*text chunk too large*/ + break; + } + if(strlen(info.text_keys[i]) < 1) + { + state->error = 67; /*text chunk too small*/ + break; + } + if(state->encoder.text_compression) + { + addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings); + } + else + { + addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]); + } + } + /*LodePNG version id in text chunk*/ + if(state->encoder.add_id) + { + unsigned alread_added_id_text = 0; + for(i = 0; i != info.text_num; ++i) + { + if(!strcmp(info.text_keys[i], "LodePNG")) + { + alread_added_id_text = 1; + break; + } + } + if(alread_added_id_text == 0) + { + addChunk_tEXt(&outv, "LodePNG", LODEPNG_VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/ + } + } + /*iTXt*/ + for(i = 0; i != info.itext_num; ++i) + { + if(strlen(info.itext_keys[i]) > 79) + { + state->error = 66; /*text chunk too large*/ + break; + } + if(strlen(info.itext_keys[i]) < 1) + { + state->error = 67; /*text chunk too small*/ + break; + } + addChunk_iTXt(&outv, state->encoder.text_compression, + info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i], + &state->encoder.zlibsettings); + } + + /*unknown chunks between IDAT and IEND*/ + if(info.unknown_chunks_data[2]) + { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + addChunk_IEND(&outv); + + break; /*this isn't really a while loop; no error happened so break out now!*/ + } + + lodepng_info_cleanup(&info); + lodepng_free(data); + /*instead of cleaning the vector up, give it to the output*/ + *out = outv.data; + *outsize = outv.size; + + return state->error; +} + +unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, const unsigned char* image, + unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned error; + LodePNGState state; + lodepng_state_init(&state); + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + state.info_png.color.colortype = colortype; + state.info_png.color.bitdepth = bitdepth; + lodepng_encode(out, outsize, image, w, h, &state); + error = state.error; + lodepng_state_cleanup(&state); + return error; +} + +unsigned lodepng_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8); +} + +unsigned lodepng_encode24(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned lodepng_encode_file(const char* filename, const unsigned char* image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer; + size_t buffersize; + unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth); + if(!error) error = lodepng_save_file(buffer, buffersize, filename); + lodepng_free(buffer); + return error; +} + +unsigned lodepng_encode32_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8); +} + +unsigned lodepng_encode24_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8); +} +#endif /*LODEPNG_COMPILE_DISK*/ + +void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings) +{ + lodepng_compress_settings_init(&settings->zlibsettings); + settings->filter_palette_zero = 1; + settings->filter_strategy = LFS_MINSUM; + settings->auto_convert = 1; + settings->force_palette = 0; + settings->predefined_filters = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + settings->add_id = 0; + settings->text_compression = 1; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ERROR_TEXT +/* +This returns the description of a numerical error code in English. This is also +the documentation of all the error codes. +*/ +const char* lodepng_error_text(unsigned code) +{ + switch(code) + { + case 0: return "no error, everything went ok"; + case 1: return "nothing done yet"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/ + case 10: return "end of input memory reached without huffman end code"; /*while huffman decoding*/ + case 11: return "error in code tree made it jump outside of huffman tree"; /*while huffman decoding*/ + case 13: return "problem while processing dynamic deflate block"; + case 14: return "problem while processing dynamic deflate block"; + case 15: return "problem while processing dynamic deflate block"; + case 16: return "unexisting code while processing dynamic deflate block"; + case 17: return "end of out buffer memory reached while inflating"; + case 18: return "invalid distance code while inflating"; + case 19: return "end of out buffer memory reached while inflating"; + case 20: return "invalid deflate block BTYPE encountered while decoding"; + case 21: return "NLEN is not ones complement of LEN in a deflate block"; + /*end of out buffer memory reached while inflating: + This can happen if the inflated deflate data is longer than the amount of bytes required to fill up + all the pixels of the image, given the color depth and image dimensions. Something that doesn't + happen in a normal, well encoded, PNG image.*/ + case 22: return "end of out buffer memory reached while inflating"; + case 23: return "end of in buffer memory reached while inflating"; + case 24: return "invalid FCHECK in zlib header"; + case 25: return "invalid compression method in zlib header"; + case 26: return "FDICT encountered in zlib header while it's not used for PNG"; + case 27: return "PNG file is smaller than a PNG header"; + /*Checks the magic file header, the first 8 bytes of the PNG file*/ + case 28: return "incorrect PNG signature, it's no PNG or corrupted"; + case 29: return "first chunk is not the header chunk"; + case 30: return "chunk length too large, chunk broken off at end of file"; + case 31: return "illegal PNG color type or bpp"; + case 32: return "illegal PNG compression method"; + case 33: return "illegal PNG filter method"; + case 34: return "illegal PNG interlace method"; + case 35: return "chunk length of a chunk is too large or the chunk too small"; + case 36: return "illegal PNG filter type encountered"; + case 37: return "illegal bit depth for this color type given"; + case 38: return "the palette is too big"; /*more than 256 colors*/ + case 39: return "more palette alpha values given in tRNS chunk than there are colors in the palette"; + case 40: return "tRNS chunk has wrong size for greyscale image"; + case 41: return "tRNS chunk has wrong size for RGB image"; + case 42: return "tRNS chunk appeared while it was not allowed for this color type"; + case 43: return "bKGD chunk has wrong size for palette image"; + case 44: return "bKGD chunk has wrong size for greyscale image"; + case 45: return "bKGD chunk has wrong size for RGB image"; + case 48: return "empty input buffer given to decoder. Maybe caused by non-existing file?"; + case 49: return "jumped past memory while generating dynamic huffman tree"; + case 50: return "jumped past memory while generating dynamic huffman tree"; + case 51: return "jumped past memory while inflating huffman block"; + case 52: return "jumped past memory while inflating"; + case 53: return "size of zlib data too small"; + case 54: return "repeat symbol in tree while there was no value symbol yet"; + /*jumped past tree while generating huffman tree, this could be when the + tree will have more leaves than symbols after generating it out of the + given lenghts. They call this an oversubscribed dynamic bit lengths tree in zlib.*/ + case 55: return "jumped past tree while generating huffman tree"; + case 56: return "given output image colortype or bitdepth not supported for color conversion"; + case 57: return "invalid CRC encountered (checking CRC can be disabled)"; + case 58: return "invalid ADLER32 encountered (checking ADLER32 can be disabled)"; + case 59: return "requested color conversion not supported"; + case 60: return "invalid window size given in the settings of the encoder (must be 0-32768)"; + case 61: return "invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)"; + /*LodePNG leaves the choice of RGB to greyscale conversion formula to the user.*/ + case 62: return "conversion from color to greyscale not supported"; + case 63: return "length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk"; /*(2^31-1)*/ + /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/ + case 64: return "the length of the END symbol 256 in the Huffman tree is 0"; + case 66: return "the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes"; + case 67: return "the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte"; + case 68: return "tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors"; + case 69: return "unknown chunk type with 'critical' flag encountered by the decoder"; + case 71: return "unexisting interlace mode given to encoder (must be 0 or 1)"; + case 72: return "while decoding, unexisting compression method encountering in zTXt or iTXt chunk (it must be 0)"; + case 73: return "invalid tIME chunk size"; + case 74: return "invalid pHYs chunk size"; + /*length could be wrong, or data chopped off*/ + case 75: return "no null termination char found while decoding text chunk"; + case 76: return "iTXt chunk too short to contain required bytes"; + case 77: return "integer overflow in buffer size"; + case 78: return "failed to open file for reading"; /*file doesn't exist or couldn't be opened for reading*/ + case 79: return "failed to open file for writing"; + case 80: return "tried creating a tree of 0 symbols"; + case 81: return "lazy matching at pos 0 is impossible"; + case 82: return "color conversion to palette requested while a color isn't in palette"; + case 83: return "memory allocation failed"; + case 84: return "given image too small to contain all pixels to be encoded"; + case 86: return "impossible offset in lz77 encoding (internal bug)"; + case 87: return "must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined"; + case 88: return "invalid filter strategy given for LodePNGEncoderSettings.filter_strategy"; + case 89: return "text chunk keyword too short or long: must have size 1-79"; + /*the windowsize in the LodePNGCompressSettings. Requiring POT(==> & instead of %) makes encoding 12% faster.*/ + case 90: return "windowsize must be a power of two"; + case 91: return "invalid decompressed idat size"; + case 92: return "integer overflow due to too many pixels"; + case 93: return "zero width or height is invalid"; + case 94: return "header chunk must have a size of 13 bytes"; + case 95: return "integer overflow with combined idat chunk size"; + } + return "unknown error code"; +} +#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // C++ Wrapper // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_CPP +namespace lodepng +{ + +#ifdef LODEPNG_COMPILE_DISK +unsigned load_file(std::vector& buffer, const std::string& filename) +{ + long size = lodepng_filesize(filename.c_str()); + if(size < 0) return 78; + buffer.resize((size_t)size); + return size == 0 ? 0 : lodepng_buffer_file(&buffer[0], (size_t)size, filename.c_str()); +} + +/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ +unsigned save_file(const std::vector& buffer, const std::string& filename) +{ + return lodepng_save_file(buffer.empty() ? 0 : &buffer[0], buffer.size(), filename.c_str()); +} +#endif /* LODEPNG_COMPILE_DISK */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_DECODER +unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGDecompressSettings& settings) +{ + unsigned char* buffer = 0; + size_t buffersize = 0; + unsigned error = zlib_decompress(&buffer, &buffersize, in, insize, &settings); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned decompress(std::vector& out, const std::vector& in, + const LodePNGDecompressSettings& settings) +{ + return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings); +} +#endif /* LODEPNG_COMPILE_DECODER */ + +#ifdef LODEPNG_COMPILE_ENCODER +unsigned compress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGCompressSettings& settings) +{ + unsigned char* buffer = 0; + size_t buffersize = 0; + unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned compress(std::vector& out, const std::vector& in, + const LodePNGCompressSettings& settings) +{ + return compress(out, in.empty() ? 0 : &in[0], in.size(), settings); +} +#endif /* LODEPNG_COMPILE_ENCODER */ +#endif /* LODEPNG_COMPILE_ZLIB */ + + +#ifdef LODEPNG_COMPILE_PNG + +State::State() +{ + lodepng_state_init(this); +} + +State::State(const State& other) +{ + lodepng_state_init(this); + lodepng_state_copy(this, &other); +} + +State::~State() +{ + lodepng_state_cleanup(this); +} + +State& State::operator=(const State& other) +{ + lodepng_state_copy(this, &other); + return *this; +} + +#ifdef LODEPNG_COMPILE_DECODER + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, const unsigned char* in, + size_t insize, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer; + unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth); + if(buffer && !error) + { + State state; + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const std::vector& in, LodePNGColorType colortype, unsigned bitdepth) +{ + return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth); +} + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const unsigned char* in, size_t insize) +{ + unsigned char* buffer = NULL; + unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize); + if(buffer && !error) + { + size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + } + lodepng_free(buffer); + return error; +} + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const std::vector& in) +{ + return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size()); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned decode(std::vector& out, unsigned& w, unsigned& h, const std::string& filename, + LodePNGColorType colortype, unsigned bitdepth) +{ + std::vector buffer; + unsigned error = load_file(buffer, filename); + if(error) return error; + return decode(out, w, h, buffer, colortype, bitdepth); +} +#endif /* LODEPNG_COMPILE_DECODER */ +#endif /* LODEPNG_COMPILE_DISK */ + +#ifdef LODEPNG_COMPILE_ENCODER +unsigned encode(std::vector& out, const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer; + size_t buffersize; + unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; + return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); +} + +unsigned encode(std::vector& out, + const unsigned char* in, unsigned w, unsigned h, + State& state) +{ + unsigned char* buffer; + size_t buffersize; + unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + State& state) +{ + if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84; + return encode(out, in.empty() ? 0 : &in[0], w, h, state); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned encode(const std::string& filename, + const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + std::vector buffer; + unsigned error = encode(buffer, in, w, h, colortype, bitdepth); + if(!error) error = save_file(buffer, filename); + return error; +} + +unsigned encode(const std::string& filename, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; + return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); +} +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_ENCODER */ +#endif /* LODEPNG_COMPILE_PNG */ +} /* namespace lodepng */ +#endif /*LODEPNG_COMPILE_CPP*/ diff --git a/source/LODEPNG.H b/source/LODEPNG.H new file mode 100644 index 0000000..6c56c1d --- /dev/null +++ b/source/LODEPNG.H @@ -0,0 +1,1770 @@ +/* +LodePNG version 20180611 + +Copyright (c) 2005-2018 Lode Vandevenne + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +#ifndef LODEPNG_H +#define LODEPNG_H + +#include /*for size_t*/ + +extern const char* LODEPNG_VERSION_STRING; + +/* +The following #defines are used to create code sections. They can be disabled +to disable code sections, which can give faster compile time and smaller binary. +The "NO_COMPILE" defines are designed to be used to pass as defines to the +compiler command to disable them without modifying this header, e.g. +-DLODEPNG_NO_COMPILE_ZLIB for gcc. +In addition to those below, you can also define LODEPNG_NO_COMPILE_CRC to +allow implementing a custom lodepng_crc32. +*/ +/*deflate & zlib. If disabled, you must specify alternative zlib functions in +the custom_zlib field of the compress and decompress settings*/ +#ifndef LODEPNG_NO_COMPILE_ZLIB +#define LODEPNG_COMPILE_ZLIB +#endif +/*png encoder and png decoder*/ +#ifndef LODEPNG_NO_COMPILE_PNG +#define LODEPNG_COMPILE_PNG +#endif +/*deflate&zlib decoder and png decoder*/ +#ifndef LODEPNG_NO_COMPILE_DECODER +#define LODEPNG_COMPILE_DECODER +#endif +/*deflate&zlib encoder and png encoder*/ +#ifndef LODEPNG_NO_COMPILE_ENCODER +#define LODEPNG_COMPILE_ENCODER +#endif +/*the optional built in harddisk file loading and saving functions*/ +#ifndef LODEPNG_NO_COMPILE_DISK +#define LODEPNG_COMPILE_DISK +#endif +/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/ +#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS +#define LODEPNG_COMPILE_ANCILLARY_CHUNKS +#endif +/*ability to convert error numerical codes to English text string*/ +#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT +#define LODEPNG_COMPILE_ERROR_TEXT +#endif +/*Compile the default allocators (C's free, malloc and realloc). If you disable this, +you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your +source files with custom allocators.*/ +#ifndef LODEPNG_NO_COMPILE_ALLOCATORS +#define LODEPNG_COMPILE_ALLOCATORS +#endif +/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/ +#ifdef __cplusplus +#ifndef LODEPNG_NO_COMPILE_CPP +#define LODEPNG_COMPILE_CPP +#endif +#endif + +#ifdef LODEPNG_COMPILE_CPP +#include +#include +#endif /*LODEPNG_COMPILE_CPP*/ + +#ifdef LODEPNG_COMPILE_PNG +/*The PNG color types (also used for raw).*/ +typedef enum LodePNGColorType +{ + LCT_GREY = 0, /*greyscale: 1,2,4,8,16 bit*/ + LCT_RGB = 2, /*RGB: 8,16 bit*/ + LCT_PALETTE = 3, /*palette: 1,2,4,8 bit*/ + LCT_GREY_ALPHA = 4, /*greyscale with alpha: 8,16 bit*/ + LCT_RGBA = 6 /*RGB with alpha: 8,16 bit*/ +} LodePNGColorType; + +#ifdef LODEPNG_COMPILE_DECODER +/* +Converts PNG data in memory to raw pixel data. +out: Output parameter. Pointer to buffer that will contain the raw pixel data. + After decoding, its size is w * h * (bytes per pixel) bytes larger than + initially. Bytes per pixel depends on colortype and bitdepth. + Must be freed after usage with free(*out). + Note: for 16-bit per channel colors, uses big endian format like PNG does. +w: Output parameter. Pointer to width of pixel data. +h: Output parameter. Pointer to height of pixel data. +in: Memory buffer with the PNG file. +insize: size of the in buffer. +colortype: the desired color type for the raw output image. See explanation on PNG color types. +bitdepth: the desired bit depth for the raw output image. See explanation on PNG color types. +Return value: LodePNG error code (0 means no error). +*/ +unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, + const unsigned char* in, size_t insize, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/ +unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, + const unsigned char* in, size_t insize); + +/*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/ +unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, + const unsigned char* in, size_t insize); + +#ifdef LODEPNG_COMPILE_DISK +/* +Load PNG from disk, from file with given name. +Same as the other decode functions, but instead takes a filename as input. +*/ +unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, + const char* filename, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image.*/ +unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, + const char* filename); + +/*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image.*/ +unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, + const char* filename); +#endif /*LODEPNG_COMPILE_DISK*/ +#endif /*LODEPNG_COMPILE_DECODER*/ + + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Converts raw pixel data into a PNG image in memory. The colortype and bitdepth + of the output PNG image cannot be chosen, they are automatically determined + by the colortype, bitdepth and content of the input pixel data. + Note: for 16-bit per channel colors, needs big endian format like PNG does. +out: Output parameter. Pointer to buffer that will contain the PNG image data. + Must be freed after usage with free(*out). +outsize: Output parameter. Pointer to the size in bytes of the out buffer. +image: The raw pixel data to encode. The size of this buffer should be + w * h * (bytes per pixel), bytes per pixel depends on colortype and bitdepth. +w: width of the raw pixel data in pixels. +h: height of the raw pixel data in pixels. +colortype: the color type of the raw input image. See explanation on PNG color types. +bitdepth: the bit depth of the raw input image. See explanation on PNG color types. +Return value: LodePNG error code (0 means no error). +*/ +unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/ +unsigned lodepng_encode32(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h); + +/*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/ +unsigned lodepng_encode24(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h); + +#ifdef LODEPNG_COMPILE_DISK +/* +Converts raw pixel data into a PNG file on disk. +Same as the other encode functions, but instead takes a filename as output. +NOTE: This overwrites existing files without warning! +*/ +unsigned lodepng_encode_file(const char* filename, + const unsigned char* image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image.*/ +unsigned lodepng_encode32_file(const char* filename, + const unsigned char* image, unsigned w, unsigned h); + +/*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image.*/ +unsigned lodepng_encode24_file(const char* filename, + const unsigned char* image, unsigned w, unsigned h); +#endif /*LODEPNG_COMPILE_DISK*/ +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +#ifdef LODEPNG_COMPILE_CPP +namespace lodepng +{ +#ifdef LODEPNG_COMPILE_DECODER +/*Same as lodepng_decode_memory, but decodes to an std::vector. The colortype +is the format to output the pixels to. Default is RGBA 8-bit per channel.*/ +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const unsigned char* in, size_t insize, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const std::vector& in, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#ifdef LODEPNG_COMPILE_DISK +/* +Converts PNG file from disk to raw pixel data in memory. +Same as the other decode functions, but instead takes a filename as input. +*/ +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const std::string& filename, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_DECODER */ + +#ifdef LODEPNG_COMPILE_ENCODER +/*Same as lodepng_encode_memory, but encodes to an std::vector. colortype +is that of the raw input data. The output PNG color type will be auto chosen.*/ +unsigned encode(std::vector& out, + const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#ifdef LODEPNG_COMPILE_DISK +/* +Converts 32-bit RGBA raw pixel data into a PNG file on disk. +Same as the other encode functions, but instead takes a filename as output. +NOTE: This overwrites existing files without warning! +*/ +unsigned encode(const std::string& filename, + const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned encode(const std::string& filename, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_ENCODER */ +} /* namespace lodepng */ +#endif /*LODEPNG_COMPILE_CPP*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ERROR_TEXT +/*Returns an English description of the numerical error code.*/ +const char* lodepng_error_text(unsigned code); +#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ + +#ifdef LODEPNG_COMPILE_DECODER +/*Settings for zlib decompression*/ +typedef struct LodePNGDecompressSettings LodePNGDecompressSettings; +struct LodePNGDecompressSettings +{ + /* Check LodePNGDecoderSettings for more ignorable errors */ + unsigned ignore_adler32; /*if 1, continue and don't give an error message if the Adler32 checksum is corrupted*/ + + /*use custom zlib decoder instead of built in one (default: null)*/ + unsigned (*custom_zlib)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGDecompressSettings*); + /*use custom deflate decoder instead of built in one (default: null) + if custom_zlib is used, custom_deflate is ignored since only the built in + zlib function will call custom_deflate*/ + unsigned (*custom_inflate)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGDecompressSettings*); + + const void* custom_context; /*optional custom settings for custom functions*/ +}; + +extern const LodePNGDecompressSettings lodepng_default_decompress_settings; +void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Settings for zlib compression. Tweaking these settings tweaks the balance +between speed and compression ratio. +*/ +typedef struct LodePNGCompressSettings LodePNGCompressSettings; +struct LodePNGCompressSettings /*deflate = compress*/ +{ + /*LZ77 related settings*/ + unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/ + unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/ + unsigned windowsize; /*must be a power of two <= 32768. higher compresses more but is slower. Default value: 2048.*/ + unsigned minmatch; /*mininum lz77 length. 3 is normally best, 6 can be better for some PNGs. Default: 0*/ + unsigned nicematch; /*stop searching if >= this length found. Set to 258 for best compression. Default: 128*/ + unsigned lazymatching; /*use lazy matching: better compression but a bit slower. Default: true*/ + + /*use custom zlib encoder instead of built in one (default: null)*/ + unsigned (*custom_zlib)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGCompressSettings*); + /*use custom deflate encoder instead of built in one (default: null) + if custom_zlib is used, custom_deflate is ignored since only the built in + zlib function will call custom_deflate*/ + unsigned (*custom_deflate)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGCompressSettings*); + + const void* custom_context; /*optional custom settings for custom functions*/ +}; + +extern const LodePNGCompressSettings lodepng_default_compress_settings; +void lodepng_compress_settings_init(LodePNGCompressSettings* settings); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_PNG +/* +Color mode of an image. Contains all information required to decode the pixel +bits to RGBA colors. This information is the same as used in the PNG file +format, and is used both for PNG and raw image data in LodePNG. +*/ +typedef struct LodePNGColorMode +{ + /*header (IHDR)*/ + LodePNGColorType colortype; /*color type, see PNG standard or documentation further in this header file*/ + unsigned bitdepth; /*bits per sample, see PNG standard or documentation further in this header file*/ + + /* + palette (PLTE and tRNS) + + Dynamically allocated with the colors of the palette, including alpha. + When encoding a PNG, to store your colors in the palette of the LodePNGColorMode, first use + lodepng_palette_clear, then for each color use lodepng_palette_add. + If you encode an image without alpha with palette, don't forget to put value 255 in each A byte of the palette. + + When decoding, by default you can ignore this palette, since LodePNG already + fills the palette colors in the pixels of the raw RGBA output. + + The palette is only supported for color type 3. + */ + unsigned char* palette; /*palette in RGBARGBA... order. When allocated, must be either 0, or have size 1024*/ + size_t palettesize; /*palette size in number of colors (amount of bytes is 4 * palettesize)*/ + + /* + transparent color key (tRNS) + + This color uses the same bit depth as the bitdepth value in this struct, which can be 1-bit to 16-bit. + For greyscale PNGs, r, g and b will all 3 be set to the same. + + When decoding, by default you can ignore this information, since LodePNG sets + pixels with this key to transparent already in the raw RGBA output. + + The color key is only supported for color types 0 and 2. + */ + unsigned key_defined; /*is a transparent color key given? 0 = false, 1 = true*/ + unsigned key_r; /*red/greyscale component of color key*/ + unsigned key_g; /*green component of color key*/ + unsigned key_b; /*blue component of color key*/ +} LodePNGColorMode; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_color_mode_init(LodePNGColorMode* info); +void lodepng_color_mode_cleanup(LodePNGColorMode* info); +/*return value is error code (0 means no error)*/ +unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source); + +void lodepng_palette_clear(LodePNGColorMode* info); +/*add 1 color to the palette*/ +unsigned lodepng_palette_add(LodePNGColorMode* info, + unsigned char r, unsigned char g, unsigned char b, unsigned char a); + +/*get the total amount of bits per pixel, based on colortype and bitdepth in the struct*/ +unsigned lodepng_get_bpp(const LodePNGColorMode* info); +/*get the amount of color channels used, based on colortype in the struct. +If a palette is used, it counts as 1 channel.*/ +unsigned lodepng_get_channels(const LodePNGColorMode* info); +/*is it a greyscale type? (only colortype 0 or 4)*/ +unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info); +/*has it got an alpha channel? (only colortype 2 or 6)*/ +unsigned lodepng_is_alpha_type(const LodePNGColorMode* info); +/*has it got a palette? (only colortype 3)*/ +unsigned lodepng_is_palette_type(const LodePNGColorMode* info); +/*only returns true if there is a palette and there is a value in the palette with alpha < 255. +Loops through the palette to check this.*/ +unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info); +/* +Check if the given color info indicates the possibility of having non-opaque pixels in the PNG image. +Returns true if the image can have translucent or invisible pixels (it still be opaque if it doesn't use such pixels). +Returns false if the image can only have opaque pixels. +In detail, it returns true only if it's a color type with alpha, or has a palette with non-opaque values, +or if "key_defined" is true. +*/ +unsigned lodepng_can_have_alpha(const LodePNGColorMode* info); +/*Returns the byte size of a raw image buffer with given width, height and color mode*/ +size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*The information of a Time chunk in PNG.*/ +typedef struct LodePNGTime +{ + unsigned year; /*2 bytes used (0-65535)*/ + unsigned month; /*1-12*/ + unsigned day; /*1-31*/ + unsigned hour; /*0-23*/ + unsigned minute; /*0-59*/ + unsigned second; /*0-60 (to allow for leap seconds)*/ +} LodePNGTime; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/*Information about the PNG image, except pixels, width and height.*/ +typedef struct LodePNGInfo +{ + /*header (IHDR), palette (PLTE) and transparency (tRNS) chunks*/ + unsigned compression_method;/*compression method of the original file. Always 0.*/ + unsigned filter_method; /*filter method of the original file*/ + unsigned interlace_method; /*interlace method of the original file: 0=none, 1=Adam7*/ + LodePNGColorMode color; /*color type and bits, palette and transparency of the PNG file*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /* + suggested background color chunk (bKGD) + This color uses the same color mode as the PNG (except alpha channel), which can be 1-bit to 16-bit. + + For greyscale PNGs, r, g and b will all 3 be set to the same. When encoding + the encoder writes the red one. For palette PNGs: When decoding, the RGB value + will be stored, not a palette index. But when encoding, specify the index of + the palette in background_r, the other two are then ignored. + + The decoder does not use this background color to edit the color of pixels. + */ + unsigned background_defined; /*is a suggested background color given?*/ + unsigned background_r; /*red component of suggested background color*/ + unsigned background_g; /*green component of suggested background color*/ + unsigned background_b; /*blue component of suggested background color*/ + + /* + non-international text chunks (tEXt and zTXt) + + The char** arrays each contain num strings. The actual messages are in + text_strings, while text_keys are keywords that give a short description what + the actual text represents, e.g. Title, Author, Description, or anything else. + + A keyword is minimum 1 character and maximum 79 characters long. It's + discouraged to use a single line length longer than 79 characters for texts. + + Don't allocate these text buffers yourself. Use the init/cleanup functions + correctly and use lodepng_add_text and lodepng_clear_text. + */ + size_t text_num; /*the amount of texts in these char** buffers (there may be more texts in itext)*/ + char** text_keys; /*the keyword of a text chunk (e.g. "Comment")*/ + char** text_strings; /*the actual text*/ + + /* + international text chunks (iTXt) + Similar to the non-international text chunks, but with additional strings + "langtags" and "transkeys". + */ + size_t itext_num; /*the amount of international texts in this PNG*/ + char** itext_keys; /*the English keyword of the text chunk (e.g. "Comment")*/ + char** itext_langtags; /*language tag for this text's language, ISO/IEC 646 string, e.g. ISO 639 language tag*/ + char** itext_transkeys; /*keyword translated to the international language - UTF-8 string*/ + char** itext_strings; /*the actual international text - UTF-8 string*/ + + /*time chunk (tIME)*/ + unsigned time_defined; /*set to 1 to make the encoder generate a tIME chunk*/ + LodePNGTime time; + + /*phys chunk (pHYs)*/ + unsigned phys_defined; /*if 0, there is no pHYs chunk and the values below are undefined, if 1 else there is one*/ + unsigned phys_x; /*pixels per unit in x direction*/ + unsigned phys_y; /*pixels per unit in y direction*/ + unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/ + + /* + unknown chunks + There are 3 buffers, one for each position in the PNG where unknown chunks can appear + each buffer contains all unknown chunks for that position consecutively + The 3 buffers are the unknown chunks between certain critical chunks: + 0: IHDR-PLTE, 1: PLTE-IDAT, 2: IDAT-IEND + Do not allocate or traverse this data yourself. Use the chunk traversing functions declared + later, such as lodepng_chunk_next and lodepng_chunk_append, to read/write this struct. + */ + unsigned char* unknown_chunks_data[3]; + size_t unknown_chunks_size[3]; /*size in bytes of the unknown chunks, given for protection*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGInfo; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_info_init(LodePNGInfo* info); +void lodepng_info_cleanup(LodePNGInfo* info); +/*return value is error code (0 means no error)*/ +unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +void lodepng_clear_text(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/ +unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str); /*push back both texts at once*/ + +void lodepng_clear_itext(LodePNGInfo* info); /*use this to clear the itexts again after you filled them in*/ +unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, + const char* transkey, const char* str); /*push back the 4 texts of 1 chunk at once*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/* +Converts raw buffer from one color type to another color type, based on +LodePNGColorMode structs to describe the input and output color type. +See the reference manual at the end of this header file to see which color conversions are supported. +return value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported) +The out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel +of the output color type (lodepng_get_bpp). +For < 8 bpp images, there should not be padding bits at the end of scanlines. +For 16-bit per channel colors, uses big endian format like PNG does. +Return value is LodePNG error code +*/ +unsigned lodepng_convert(unsigned char* out, const unsigned char* in, + const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, + unsigned w, unsigned h); + +#ifdef LODEPNG_COMPILE_DECODER +/* +Settings for the decoder. This contains settings for the PNG and the Zlib +decoder, but not the Info settings from the Info structs. +*/ +typedef struct LodePNGDecoderSettings +{ + LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/ + + /* Check LodePNGDecompressSettings for more ignorable errors */ + unsigned ignore_crc; /*ignore CRC checksums*/ + unsigned ignore_critical; /*ignore unknown critical chunks*/ + unsigned ignore_end; /*ignore issues at end of file if possible (missing IEND chunk, too large chunk, ...)*/ + + unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + unsigned read_text_chunks; /*if false but remember_unknown_chunks is true, they're stored in the unknown chunks*/ + /*store all bytes from unknown chunks in the LodePNGInfo (off by default, useful for a png editor)*/ + unsigned remember_unknown_chunks; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGDecoderSettings; + +void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/*automatically use color type with less bits per pixel if losslessly possible. Default: AUTO*/ +typedef enum LodePNGFilterStrategy +{ + /*every filter at zero*/ + LFS_ZERO, + /*Use filter that gives minimum sum, as described in the official PNG filter heuristic.*/ + LFS_MINSUM, + /*Use the filter type that gives smallest Shannon entropy for this scanline. Depending + on the image, this is better or worse than minsum.*/ + LFS_ENTROPY, + /* + Brute-force-search PNG filters by compressing each filter for each scanline. + Experimental, very slow, and only rarely gives better compression than MINSUM. + */ + LFS_BRUTE_FORCE, + /*use predefined_filters buffer: you specify the filter type for each scanline*/ + LFS_PREDEFINED +} LodePNGFilterStrategy; + +/*Gives characteristics about the colors of the image, which helps decide which color model to use for encoding. +Used internally by default if "auto_convert" is enabled. Public because it's useful for custom algorithms.*/ +typedef struct LodePNGColorProfile +{ + unsigned colored; /*not greyscale*/ + unsigned key; /*image is not opaque and color key is possible instead of full alpha*/ + unsigned short key_r; /*key values, always as 16-bit, in 8-bit case the byte is duplicated, e.g. 65535 means 255*/ + unsigned short key_g; + unsigned short key_b; + unsigned alpha; /*image is not opaque and alpha channel or alpha palette required*/ + unsigned numcolors; /*amount of colors, up to 257. Not valid if bits == 16.*/ + unsigned char palette[1024]; /*Remembers up to the first 256 RGBA colors, in no particular order*/ + unsigned bits; /*bits per channel (not for palette). 1,2 or 4 for greyscale only. 16 if 16-bit per channel required.*/ +} LodePNGColorProfile; + +void lodepng_color_profile_init(LodePNGColorProfile* profile); + +/*Get a LodePNGColorProfile of the image.*/ +unsigned lodepng_get_color_profile(LodePNGColorProfile* profile, + const unsigned char* image, unsigned w, unsigned h, + const LodePNGColorMode* mode_in); +/*The function LodePNG uses internally to decide the PNG color with auto_convert. +Chooses an optimal color model, e.g. grey if only grey pixels, palette if < 256 colors, ...*/ +unsigned lodepng_auto_choose_color(LodePNGColorMode* mode_out, + const unsigned char* image, unsigned w, unsigned h, + const LodePNGColorMode* mode_in); + +/*Settings for the encoder.*/ +typedef struct LodePNGEncoderSettings +{ + LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/ + + unsigned auto_convert; /*automatically choose output PNG color type. Default: true*/ + + /*If true, follows the official PNG heuristic: if the PNG uses a palette or lower than + 8 bit depth, set all filters to zero. Otherwise use the filter_strategy. Note that to + completely follow the official PNG heuristic, filter_palette_zero must be true and + filter_strategy must be LFS_MINSUM*/ + unsigned filter_palette_zero; + /*Which filter strategy to use when not using zeroes due to filter_palette_zero. + Set filter_palette_zero to 0 to ensure always using your chosen strategy. Default: LFS_MINSUM*/ + LodePNGFilterStrategy filter_strategy; + /*used if filter_strategy is LFS_PREDEFINED. In that case, this must point to a buffer with + the same length as the amount of scanlines in the image, and each value must <= 5. You + have to cleanup this buffer, LodePNG will never free it. Don't forget that filter_palette_zero + must be set to 0 to ensure this is also used on palette or low bitdepth images.*/ + const unsigned char* predefined_filters; + + /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette). + If colortype is 3, PLTE is _always_ created.*/ + unsigned force_palette; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*add LodePNG identifier and version as a text chunk, for debugging*/ + unsigned add_id; + /*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/ + unsigned text_compression; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGEncoderSettings; + +void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings); +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) +/*The settings, state and information for extended encoding and decoding.*/ +typedef struct LodePNGState +{ +#ifdef LODEPNG_COMPILE_DECODER + LodePNGDecoderSettings decoder; /*the decoding settings*/ +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER + LodePNGEncoderSettings encoder; /*the encoding settings*/ +#endif /*LODEPNG_COMPILE_ENCODER*/ + LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/ + LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/ + unsigned error; +#ifdef LODEPNG_COMPILE_CPP + /* For the lodepng::State subclass. */ + virtual ~LodePNGState(){} +#endif +} LodePNGState; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_state_init(LodePNGState* state); +void lodepng_state_cleanup(LodePNGState* state); +void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source); +#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ + +#ifdef LODEPNG_COMPILE_DECODER +/* +Same as lodepng_decode_memory, but uses a LodePNGState to allow custom settings and +getting much more information about the PNG image and color mode. +*/ +unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize); + +/* +Read the PNG header, but not the actual data. This returns only the information +that is in the header chunk of the PNG, such as width, height and color type. The +information is placed in the info_png field of the LodePNGState. +*/ +unsigned lodepng_inspect(unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize); +#endif /*LODEPNG_COMPILE_DECODER*/ + + +#ifdef LODEPNG_COMPILE_ENCODER +/*This function allocates the out buffer with standard malloc and stores the size in *outsize.*/ +unsigned lodepng_encode(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h, + LodePNGState* state); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/* +The lodepng_chunk functions are normally not needed, except to traverse the +unknown chunks stored in the LodePNGInfo struct, or add new ones to it. +It also allows traversing the chunks of an encoded PNG file yourself. + +PNG standard chunk naming conventions: +First byte: uppercase = critical, lowercase = ancillary +Second byte: uppercase = public, lowercase = private +Third byte: must be uppercase +Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy +*/ + +/* +Gets the length of the data of the chunk. Total chunk length has 12 bytes more. +There must be at least 4 bytes to read from. If the result value is too large, +it may be corrupt data. +*/ +unsigned lodepng_chunk_length(const unsigned char* chunk); + +/*puts the 4-byte type in null terminated string*/ +void lodepng_chunk_type(char type[5], const unsigned char* chunk); + +/*check if the type is the given type*/ +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type); + +/*0: it's one of the critical chunk types, 1: it's an ancillary chunk (see PNG standard)*/ +unsigned char lodepng_chunk_ancillary(const unsigned char* chunk); + +/*0: public, 1: private (see PNG standard)*/ +unsigned char lodepng_chunk_private(const unsigned char* chunk); + +/*0: the chunk is unsafe to copy, 1: the chunk is safe to copy (see PNG standard)*/ +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk); + +/*get pointer to the data of the chunk, where the input points to the header of the chunk*/ +unsigned char* lodepng_chunk_data(unsigned char* chunk); +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk); + +/*returns 0 if the crc is correct, 1 if it's incorrect (0 for OK as usual!)*/ +unsigned lodepng_chunk_check_crc(const unsigned char* chunk); + +/*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/ +void lodepng_chunk_generate_crc(unsigned char* chunk); + +/*iterate to next chunks. don't use on IEND chunk, as there is no next chunk then*/ +unsigned char* lodepng_chunk_next(unsigned char* chunk); +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk); + +/* +Appends chunk to the data in out. The given chunk should already have its chunk header. +The out variable and outlength are updated to reflect the new reallocated buffer. +Returns error code (0 if it went ok) +*/ +unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk); + +/* +Appends new chunk to out. The chunk to append is given by giving its length, type +and data separately. The type is a 4-letter string. +The out variable and outlength are updated to reflect the new reallocated buffer. +Returne error code (0 if it went ok) +*/ +unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, + const char* type, const unsigned char* data); + + +/*Calculate CRC32 of buffer*/ +unsigned lodepng_crc32(const unsigned char* buf, size_t len); +#endif /*LODEPNG_COMPILE_PNG*/ + + +#ifdef LODEPNG_COMPILE_ZLIB +/* +This zlib part can be used independently to zlib compress and decompress a +buffer. It cannot be used to create gzip files however, and it only supports the +part of zlib that is required for PNG, it does not support dictionaries. +*/ + +#ifdef LODEPNG_COMPILE_DECODER +/*Inflate a buffer. Inflate is the decompression step of deflate. Out buffer must be freed after use.*/ +unsigned lodepng_inflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings); + +/* +Decompresses Zlib data. Reallocates the out buffer and appends the data. The +data must be according to the zlib specification. +Either, *out must be NULL and *outsize must be 0, or, *out must be a valid +buffer and *outsize its size in bytes. out must be freed by user after usage. +*/ +unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Compresses data with Zlib. Reallocates the out buffer and appends the data. +Zlib adds a small header and trailer around the deflate data. +The data is output in the format of the zlib specification. +Either, *out must be NULL and *outsize must be 0, or, *out must be a valid +buffer and *outsize its size in bytes. out must be freed by user after usage. +*/ +unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings); + +/* +Find length-limited Huffman code for given frequencies. This function is in the +public interface only for tests, it's used internally by lodepng_deflate. +*/ +unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, + size_t numcodes, unsigned maxbitlen); + +/*Compress a buffer with deflate. See RFC 1951. Out buffer must be freed after use.*/ +unsigned lodepng_deflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings); + +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_ZLIB*/ + +#ifdef LODEPNG_COMPILE_DISK +/* +Load a file from disk into buffer. The function allocates the out buffer, and +after usage you should free it. +out: output parameter, contains pointer to loaded buffer. +outsize: output parameter, size of the allocated out buffer +filename: the path to the file to load +return value: error code (0 means ok) +*/ +unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename); + +/* +Save a file from buffer to disk. Warning, if it exists, this function overwrites +the file without warning! +buffer: the buffer to write +buffersize: size of the buffer to write +filename: the path to the file to save to +return value: error code (0 means ok) +*/ +unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename); +#endif /*LODEPNG_COMPILE_DISK*/ + +#ifdef LODEPNG_COMPILE_CPP +/* The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. */ +namespace lodepng +{ +#ifdef LODEPNG_COMPILE_PNG +class State : public LodePNGState +{ + public: + State(); + State(const State& other); + virtual ~State(); + State& operator=(const State& other); +}; + +#ifdef LODEPNG_COMPILE_DECODER +/* Same as other lodepng::decode, but using a State for more settings and information. */ +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const unsigned char* in, size_t insize); +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const std::vector& in); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* Same as other lodepng::encode, but using a State for more settings and information. */ +unsigned encode(std::vector& out, + const unsigned char* in, unsigned w, unsigned h, + State& state); +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + State& state); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DISK +/* +Load a file from disk into an std::vector. +return value: error code (0 means ok) +*/ +unsigned load_file(std::vector& buffer, const std::string& filename); + +/* +Save the binary data in an std::vector to a file on disk. The file is overwritten +without warning. +*/ +unsigned save_file(const std::vector& buffer, const std::string& filename); +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_PNG */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_DECODER +/* Zlib-decompress an unsigned char buffer */ +unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); + +/* Zlib-decompress an std::vector */ +unsigned decompress(std::vector& out, const std::vector& in, + const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); +#endif /* LODEPNG_COMPILE_DECODER */ + +#ifdef LODEPNG_COMPILE_ENCODER +/* Zlib-compress an unsigned char buffer */ +unsigned compress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGCompressSettings& settings = lodepng_default_compress_settings); + +/* Zlib-compress an std::vector */ +unsigned compress(std::vector& out, const std::vector& in, + const LodePNGCompressSettings& settings = lodepng_default_compress_settings); +#endif /* LODEPNG_COMPILE_ENCODER */ +#endif /* LODEPNG_COMPILE_ZLIB */ +} /* namespace lodepng */ +#endif /*LODEPNG_COMPILE_CPP*/ + +/* +TODO: +[.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often +[.] check compatibility with various compilers - done but needs to be redone for every newer version +[X] converting color to 16-bit per channel types +[ ] read all public PNG chunk types (but never let the color profile and gamma ones touch RGB values) +[ ] make sure encoder generates no chunks with size > (2^31)-1 +[ ] partial decoding (stream processing) +[X] let the "isFullyOpaque" function check color keys and transparent palettes too +[X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl" +[ ] don't stop decoding on errors like 69, 57, 58 (make warnings) +[ ] make warnings like: oob palette, checksum fail, data after iend, wrong/unknown crit chunk, no null terminator in text, ... +[ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes +[ ] allow user to provide custom color conversion functions, e.g. for premultiplied alpha, padding bits or not, ... +[ ] allow user to give data (void*) to custom allocator +*/ + +#endif /*LODEPNG_H inclusion guard*/ + +/* +LodePNG Documentation +--------------------- + +0. table of contents +-------------------- + + 1. about + 1.1. supported features + 1.2. features not supported + 2. C and C++ version + 3. security + 4. decoding + 5. encoding + 6. color conversions + 6.1. PNG color types + 6.2. color conversions + 6.3. padding bits + 6.4. A note about 16-bits per channel and endianness + 7. error values + 8. chunks and PNG editing + 9. compiler support + 10. examples + 10.1. decoder C++ example + 10.2. decoder C example + 11. state settings reference + 12. changes + 13. contact information + + +1. about +-------- + +PNG is a file format to store raster images losslessly with good compression, +supporting different color types and alpha channel. + +LodePNG is a PNG codec according to the Portable Network Graphics (PNG) +Specification (Second Edition) - W3C Recommendation 10 November 2003. + +The specifications used are: + +*) Portable Network Graphics (PNG) Specification (Second Edition): + http://www.w3.org/TR/2003/REC-PNG-20031110 +*) RFC 1950 ZLIB Compressed Data Format version 3.3: + http://www.gzip.org/zlib/rfc-zlib.html +*) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3: + http://www.gzip.org/zlib/rfc-deflate.html + +The most recent version of LodePNG can currently be found at +http://lodev.org/lodepng/ + +LodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds +extra functionality. + +LodePNG exists out of two files: +-lodepng.h: the header file for both C and C++ +-lodepng.c(pp): give it the name lodepng.c or lodepng.cpp (or .cc) depending on your usage + +If you want to start using LodePNG right away without reading this doc, get the +examples from the LodePNG website to see how to use it in code, or check the +smaller examples in chapter 13 here. + +LodePNG is simple but only supports the basic requirements. To achieve +simplicity, the following design choices were made: There are no dependencies +on any external library. There are functions to decode and encode a PNG with +a single function call, and extended versions of these functions taking a +LodePNGState struct allowing to specify or get more information. By default +the colors of the raw image are always RGB or RGBA, no matter what color type +the PNG file uses. To read and write files, there are simple functions to +convert the files to/from buffers in memory. + +This all makes LodePNG suitable for loading textures in games, demos and small +programs, ... It's less suitable for full fledged image editors, loading PNGs +over network (it requires all the image data to be available before decoding can +begin), life-critical systems, ... + +1.1. supported features +----------------------- + +The following features are supported by the decoder: + +*) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image, + or the same color type as the PNG +*) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image +*) Adam7 interlace and deinterlace for any color type +*) loading the image from harddisk or decoding it from a buffer from other sources than harddisk +*) support for alpha channels, including RGBA color model, translucent palettes and color keying +*) zlib decompression (inflate) +*) zlib compression (deflate) +*) CRC32 and ADLER32 checksums +*) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks. +*) the following chunks are supported (generated/interpreted) by both encoder and decoder: + IHDR: header information + PLTE: color palette + IDAT: pixel data + IEND: the final chunk + tRNS: transparency for palettized images + tEXt: textual information + zTXt: compressed textual information + iTXt: international textual information + bKGD: suggested background color + pHYs: physical dimensions + tIME: modification time + +1.2. features not supported +--------------------------- + +The following features are _not_ supported: + +*) some features needed to make a conformant PNG-Editor might be still missing. +*) partial loading/stream processing. All data must be available and is processed in one call. +*) The following public chunks are not supported but treated as unknown chunks by LodePNG + cHRM, gAMA, iCCP, sRGB, sBIT, hIST, sPLT + Some of these are not supported on purpose: LodePNG wants to provide the RGB values + stored in the pixels, not values modified by system dependent gamma or color models. + + +2. C and C++ version +-------------------- + +The C version uses buffers allocated with alloc that you need to free() +yourself. You need to use init and cleanup functions for each struct whenever +using a struct from the C version to avoid exploits and memory leaks. + +The C++ version has extra functions with std::vectors in the interface and the +lodepng::State class which is a LodePNGState with constructor and destructor. + +These files work without modification for both C and C++ compilers because all +the additional C++ code is in "#ifdef __cplusplus" blocks that make C-compilers +ignore it, and the C code is made to compile both with strict ISO C90 and C++. + +To use the C++ version, you need to rename the source file to lodepng.cpp +(instead of lodepng.c), and compile it with a C++ compiler. + +To use the C version, you need to rename the source file to lodepng.c (instead +of lodepng.cpp), and compile it with a C compiler. + + +3. Security +----------- + +Even if carefully designed, it's always possible that LodePNG contains possible +exploits. If you discover one, please let me know, and it will be fixed. + +When using LodePNG, care has to be taken with the C version of LodePNG, as well +as the C-style structs when working with C++. The following conventions are used +for all C-style structs: + +-if a struct has a corresponding init function, always call the init function when making a new one +-if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks +-if a struct has a corresponding copy function, use the copy function instead of "=". + The destination must also be inited already. + + +4. Decoding +----------- + +Decoding converts a PNG compressed image to a raw pixel buffer. + +Most documentation on using the decoder is at its declarations in the header +above. For C, simple decoding can be done with functions such as +lodepng_decode32, and more advanced decoding can be done with the struct +LodePNGState and lodepng_decode. For C++, all decoding can be done with the +various lodepng::decode functions, and lodepng::State can be used for advanced +features. + +When using the LodePNGState, it uses the following fields for decoding: +*) LodePNGInfo info_png: it stores extra information about the PNG (the input) in here +*) LodePNGColorMode info_raw: here you can say what color mode of the raw image (the output) you want to get +*) LodePNGDecoderSettings decoder: you can specify a few extra settings for the decoder to use + +LodePNGInfo info_png +-------------------- + +After decoding, this contains extra information of the PNG image, except the actual +pixels, width and height because these are already gotten directly from the decoder +functions. + +It contains for example the original color type of the PNG image, text comments, +suggested background color, etc... More details about the LodePNGInfo struct are +at its declaration documentation. + +LodePNGColorMode info_raw +------------------------- + +When decoding, here you can specify which color type you want +the resulting raw image to be. If this is different from the colortype of the +PNG, then the decoder will automatically convert the result. This conversion +always works, except if you want it to convert a color PNG to greyscale or to +a palette with missing colors. + +By default, 32-bit color is used for the result. + +LodePNGDecoderSettings decoder +------------------------------ + +The settings can be used to ignore the errors created by invalid CRC and Adler32 +chunks, and to disable the decoding of tEXt chunks. + +There's also a setting color_convert, true by default. If false, no conversion +is done, the resulting data will be as it was in the PNG (after decompression) +and you'll have to puzzle the colors of the pixels together yourself using the +color type information in the LodePNGInfo. + + +5. Encoding +----------- + +Encoding converts a raw pixel buffer to a PNG compressed image. + +Most documentation on using the encoder is at its declarations in the header +above. For C, simple encoding can be done with functions such as +lodepng_encode32, and more advanced decoding can be done with the struct +LodePNGState and lodepng_encode. For C++, all encoding can be done with the +various lodepng::encode functions, and lodepng::State can be used for advanced +features. + +Like the decoder, the encoder can also give errors. However it gives less errors +since the encoder input is trusted, the decoder input (a PNG image that could +be forged by anyone) is not trusted. + +When using the LodePNGState, it uses the following fields for encoding: +*) LodePNGInfo info_png: here you specify how you want the PNG (the output) to be. +*) LodePNGColorMode info_raw: here you say what color type of the raw image (the input) has +*) LodePNGEncoderSettings encoder: you can specify a few settings for the encoder to use + +LodePNGInfo info_png +-------------------- + +When encoding, you use this the opposite way as when decoding: for encoding, +you fill in the values you want the PNG to have before encoding. By default it's +not needed to specify a color type for the PNG since it's automatically chosen, +but it's possible to choose it yourself given the right settings. + +The encoder will not always exactly match the LodePNGInfo struct you give, +it tries as close as possible. Some things are ignored by the encoder. The +encoder uses, for example, the following settings from it when applicable: +colortype and bitdepth, text chunks, time chunk, the color key, the palette, the +background color, the interlace method, unknown chunks, ... + +When encoding to a PNG with colortype 3, the encoder will generate a PLTE chunk. +If the palette contains any colors for which the alpha channel is not 255 (so +there are translucent colors in the palette), it'll add a tRNS chunk. + +LodePNGColorMode info_raw +------------------------- + +You specify the color type of the raw image that you give to the input here, +including a possible transparent color key and palette you happen to be using in +your raw image data. + +By default, 32-bit color is assumed, meaning your input has to be in RGBA +format with 4 bytes (unsigned chars) per pixel. + +LodePNGEncoderSettings encoder +------------------------------ + +The following settings are supported (some are in sub-structs): +*) auto_convert: when this option is enabled, the encoder will +automatically choose the smallest possible color mode (including color key) that +can encode the colors of all pixels without information loss. +*) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree, + 2 = dynamic huffman tree (best compression). Should be 2 for proper + compression. +*) use_lz77: whether or not to use LZ77 for compressed block types. Should be + true for proper compression. +*) windowsize: the window size used by the LZ77 encoder (1 - 32768). Has value + 2048 by default, but can be set to 32768 for better, but slow, compression. +*) force_palette: if colortype is 2 or 6, you can make the encoder write a PLTE + chunk if force_palette is true. This can used as suggested palette to convert + to by viewers that don't support more than 256 colors (if those still exist) +*) add_id: add text chunk "Encoder: LodePNG " to the image. +*) text_compression: default 1. If 1, it'll store texts as zTXt instead of tEXt chunks. + zTXt chunks use zlib compression on the text. This gives a smaller result on + large texts but a larger result on small texts (such as a single program name). + It's all tEXt or all zTXt though, there's no separate setting per text yet. + + +6. color conversions +-------------------- + +An important thing to note about LodePNG, is that the color type of the PNG, and +the color type of the raw image, are completely independent. By default, when +you decode a PNG, you get the result as a raw image in the color type you want, +no matter whether the PNG was encoded with a palette, greyscale or RGBA color. +And if you encode an image, by default LodePNG will automatically choose the PNG +color type that gives good compression based on the values of colors and amount +of colors in the image. It can be configured to let you control it instead as +well, though. + +To be able to do this, LodePNG does conversions from one color mode to another. +It can convert from almost any color type to any other color type, except the +following conversions: RGB to greyscale is not supported, and converting to a +palette when the palette doesn't have a required color is not supported. This is +not supported on purpose: this is information loss which requires a color +reduction algorithm that is beyong the scope of a PNG encoder (yes, RGB to grey +is easy, but there are multiple ways if you want to give some channels more +weight). + +By default, when decoding, you get the raw image in 32-bit RGBA or 24-bit RGB +color, no matter what color type the PNG has. And by default when encoding, +LodePNG automatically picks the best color model for the output PNG, and expects +the input image to be 32-bit RGBA or 24-bit RGB. So, unless you want to control +the color format of the images yourself, you can skip this chapter. + +6.1. PNG color types +-------------------- + +A PNG image can have many color types, ranging from 1-bit color to 64-bit color, +as well as palettized color modes. After the zlib decompression and unfiltering +in the PNG image is done, the raw pixel data will have that color type and thus +a certain amount of bits per pixel. If you want the output raw image after +decoding to have another color type, a conversion is done by LodePNG. + +The PNG specification gives the following color types: + +0: greyscale, bit depths 1, 2, 4, 8, 16 +2: RGB, bit depths 8 and 16 +3: palette, bit depths 1, 2, 4 and 8 +4: greyscale with alpha, bit depths 8 and 16 +6: RGBA, bit depths 8 and 16 + +Bit depth is the amount of bits per pixel per color channel. So the total amount +of bits per pixel is: amount of channels * bitdepth. + +6.2. color conversions +---------------------- + +As explained in the sections about the encoder and decoder, you can specify +color types and bit depths in info_png and info_raw to change the default +behaviour. + +If, when decoding, you want the raw image to be something else than the default, +you need to set the color type and bit depth you want in the LodePNGColorMode, +or the parameters colortype and bitdepth of the simple decoding function. + +If, when encoding, you use another color type than the default in the raw input +image, you need to specify its color type and bit depth in the LodePNGColorMode +of the raw image, or use the parameters colortype and bitdepth of the simple +encoding function. + +If, when encoding, you don't want LodePNG to choose the output PNG color type +but control it yourself, you need to set auto_convert in the encoder settings +to false, and specify the color type you want in the LodePNGInfo of the +encoder (including palette: it can generate a palette if auto_convert is true, +otherwise not). + +If the input and output color type differ (whether user chosen or auto chosen), +LodePNG will do a color conversion, which follows the rules below, and may +sometimes result in an error. + +To avoid some confusion: +-the decoder converts from PNG to raw image +-the encoder converts from raw image to PNG +-the colortype and bitdepth in LodePNGColorMode info_raw, are those of the raw image +-the colortype and bitdepth in the color field of LodePNGInfo info_png, are those of the PNG +-when encoding, the color type in LodePNGInfo is ignored if auto_convert + is enabled, it is automatically generated instead +-when decoding, the color type in LodePNGInfo is set by the decoder to that of the original + PNG image, but it can be ignored since the raw image has the color type you requested instead +-if the color type of the LodePNGColorMode and PNG image aren't the same, a conversion + between the color types is done if the color types are supported. If it is not + supported, an error is returned. If the types are the same, no conversion is done. +-even though some conversions aren't supported, LodePNG supports loading PNGs from any + colortype and saving PNGs to any colortype, sometimes it just requires preparing + the raw image correctly before encoding. +-both encoder and decoder use the same color converter. + +Non supported color conversions: +-color to greyscale: no error is thrown, but the result will look ugly because +only the red channel is taken +-anything to palette when that palette does not have that color in it: in this +case an error is thrown + +Supported color conversions: +-anything to 8-bit RGB, 8-bit RGBA, 16-bit RGB, 16-bit RGBA +-any grey or grey+alpha, to grey or grey+alpha +-anything to a palette, as long as the palette has the requested colors in it +-removing alpha channel +-higher to smaller bitdepth, and vice versa + +If you want no color conversion to be done (e.g. for speed or control): +-In the encoder, you can make it save a PNG with any color type by giving the +raw color mode and LodePNGInfo the same color mode, and setting auto_convert to +false. +-In the decoder, you can make it store the pixel data in the same color type +as the PNG has, by setting the color_convert setting to false. Settings in +info_raw are then ignored. + +The function lodepng_convert does the color conversion. It is available in the +interface but normally isn't needed since the encoder and decoder already call +it. + +6.3. padding bits +----------------- + +In the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines +have a bit amount that isn't a multiple of 8, then padding bits are used so that each +scanline starts at a fresh byte. But that is NOT true for the LodePNG raw input and output. +The raw input image you give to the encoder, and the raw output image you get from the decoder +will NOT have these padding bits, e.g. in the case of a 1-bit image with a width +of 7 pixels, the first pixel of the second scanline will the the 8th bit of the first byte, +not the first bit of a new byte. + +6.4. A note about 16-bits per channel and endianness +---------------------------------------------------- + +LodePNG uses unsigned char arrays for 16-bit per channel colors too, just like +for any other color format. The 16-bit values are stored in big endian (most +significant byte first) in these arrays. This is the opposite order of the +little endian used by x86 CPU's. + +LodePNG always uses big endian because the PNG file format does so internally. +Conversions to other formats than PNG uses internally are not supported by +LodePNG on purpose, there are myriads of formats, including endianness of 16-bit +colors, the order in which you store R, G, B and A, and so on. Supporting and +converting to/from all that is outside the scope of LodePNG. + +This may mean that, depending on your use case, you may want to convert the big +endian output of LodePNG to little endian with a for loop. This is certainly not +always needed, many applications and libraries support big endian 16-bit colors +anyway, but it means you cannot simply cast the unsigned char* buffer to an +unsigned short* buffer on x86 CPUs. + + +7. error values +--------------- + +All functions in LodePNG that return an error code, return 0 if everything went +OK, or a non-zero code if there was an error. + +The meaning of the LodePNG error values can be retrieved with the function +lodepng_error_text: given the numerical error code, it returns a description +of the error in English as a string. + +Check the implementation of lodepng_error_text to see the meaning of each code. + + +8. chunks and PNG editing +------------------------- + +If you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG +editor that should follow the rules about handling of unknown chunks, or if your +program is able to read other types of chunks than the ones handled by LodePNG, +then that's possible with the chunk functions of LodePNG. + +A PNG chunk has the following layout: + +4 bytes length +4 bytes type name +length bytes data +4 bytes CRC + +8.1. iterating through chunks +----------------------------- + +If you have a buffer containing the PNG image data, then the first chunk (the +IHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the +signature of the PNG and are not part of a chunk. But if you start at byte 8 +then you have a chunk, and can check the following things of it. + +NOTE: none of these functions check for memory buffer boundaries. To avoid +exploits, always make sure the buffer contains all the data of the chunks. +When using lodepng_chunk_next, make sure the returned value is within the +allocated memory. + +unsigned lodepng_chunk_length(const unsigned char* chunk): + +Get the length of the chunk's data. The total chunk length is this length + 12. + +void lodepng_chunk_type(char type[5], const unsigned char* chunk): +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type): + +Get the type of the chunk or compare if it's a certain type + +unsigned char lodepng_chunk_critical(const unsigned char* chunk): +unsigned char lodepng_chunk_private(const unsigned char* chunk): +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk): + +Check if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are). +Check if the chunk is private (public chunks are part of the standard, private ones not). +Check if the chunk is safe to copy. If it's not, then, when modifying data in a critical +chunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your +program doesn't handle that type of unknown chunk. + +unsigned char* lodepng_chunk_data(unsigned char* chunk): +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk): + +Get a pointer to the start of the data of the chunk. + +unsigned lodepng_chunk_check_crc(const unsigned char* chunk): +void lodepng_chunk_generate_crc(unsigned char* chunk): + +Check if the crc is correct or generate a correct one. + +unsigned char* lodepng_chunk_next(unsigned char* chunk): +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk): + +Iterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these +functions do no boundary checking of the allocated data whatsoever, so make sure there is enough +data available in the buffer to be able to go to the next chunk. + +unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk): +unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, + const char* type, const unsigned char* data): + +These functions are used to create new chunks that are appended to the data in *out that has +length *outlength. The append function appends an existing chunk to the new data. The create +function creates a new chunk with the given parameters and appends it. Type is the 4-letter +name of the chunk. + +8.2. chunks in info_png +----------------------- + +The LodePNGInfo struct contains fields with the unknown chunk in it. It has 3 +buffers (each with size) to contain 3 types of unknown chunks: +the ones that come before the PLTE chunk, the ones that come between the PLTE +and the IDAT chunks, and the ones that come after the IDAT chunks. +It's necessary to make the distionction between these 3 cases because the PNG +standard forces to keep the ordering of unknown chunks compared to the critical +chunks, but does not force any other ordering rules. + +info_png.unknown_chunks_data[0] is the chunks before PLTE +info_png.unknown_chunks_data[1] is the chunks after PLTE, before IDAT +info_png.unknown_chunks_data[2] is the chunks after IDAT + +The chunks in these 3 buffers can be iterated through and read by using the same +way described in the previous subchapter. + +When using the decoder to decode a PNG, you can make it store all unknown chunks +if you set the option settings.remember_unknown_chunks to 1. By default, this +option is off (0). + +The encoder will always encode unknown chunks that are stored in the info_png. +If you need it to add a particular chunk that isn't known by LodePNG, you can +use lodepng_chunk_append or lodepng_chunk_create to the chunk data in +info_png.unknown_chunks_data[x]. + +Chunks that are known by LodePNG should not be added in that way. E.g. to make +LodePNG add a bKGD chunk, set background_defined to true and add the correct +parameters there instead. + + +9. compiler support +------------------- + +No libraries other than the current standard C library are needed to compile +LodePNG. For the C++ version, only the standard C++ library is needed on top. +Add the files lodepng.c(pp) and lodepng.h to your project, include +lodepng.h where needed, and your program can read/write PNG files. + +It is compatible with C90 and up, and C++03 and up. + +If performance is important, use optimization when compiling! For both the +encoder and decoder, this makes a large difference. + +Make sure that LodePNG is compiled with the same compiler of the same version +and with the same settings as the rest of the program, or the interfaces with +std::vectors and std::strings in C++ can be incompatible. + +CHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets. + +*) gcc and g++ + +LodePNG is developed in gcc so this compiler is natively supported. It gives no +warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++ +version 4.7.1 on Linux, 32-bit and 64-bit. + +*) Clang + +Fully supported and warning-free. + +*) Mingw + +The Mingw compiler (a port of gcc for Windows) should be fully supported by +LodePNG. + +*) Visual Studio and Visual C++ Express Edition + +LodePNG should be warning-free with warning level W4. Two warnings were disabled +with pragmas though: warning 4244 about implicit conversions, and warning 4996 +where it wants to use a non-standard function fopen_s instead of the standard C +fopen. + +Visual Studio may want "stdafx.h" files to be included in each source file and +give an error "unexpected end of file while looking for precompiled header". +This is not standard C++ and will not be added to the stock LodePNG. You can +disable it for lodepng.cpp only by right clicking it, Properties, C/C++, +Precompiled Headers, and set it to Not Using Precompiled Headers there. + +NOTE: Modern versions of VS should be fully supported, but old versions, e.g. +VS6, are not guaranteed to work. + +*) Compilers on Macintosh + +LodePNG has been reported to work both with gcc and LLVM for Macintosh, both for +C and C++. + +*) Other Compilers + +If you encounter problems on any compilers, feel free to let me know and I may +try to fix it if the compiler is modern and standards complient. + + +10. examples +------------ + +This decoder example shows the most basic usage of LodePNG. More complex +examples can be found on the LodePNG website. + +10.1. decoder C++ example +------------------------- + +#include "lodepng.h" +#include + +int main(int argc, char *argv[]) +{ + const char* filename = argc > 1 ? argv[1] : "test.png"; + + //load and decode + std::vector image; + unsigned width, height; + unsigned error = lodepng::decode(image, width, height, filename); + + //if there's an error, display it + if(error) std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl; + + //the pixels are now in the vector "image", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ... +} + +10.2. decoder C example +----------------------- + +#include "lodepng.h" + +int main(int argc, char *argv[]) +{ + unsigned error; + unsigned char* image; + size_t width, height; + const char* filename = argc > 1 ? argv[1] : "test.png"; + + error = lodepng_decode32_file(&image, &width, &height, filename); + + if(error) printf("decoder error %u: %s\n", error, lodepng_error_text(error)); + + / * use image here * / + + free(image); + return 0; +} + +11. state settings reference +---------------------------- + +A quick reference of some settings to set on the LodePNGState + +For decoding: + +state.decoder.zlibsettings.ignore_adler32: ignore ADLER32 checksums +state.decoder.zlibsettings.custom_...: use custom inflate function +state.decoder.ignore_crc: ignore CRC checksums +state.decoder.ignore_critical: ignore unknown critical chunks +state.decoder.ignore_end: ignore missing IEND chunk. May fail if this corruption causes other errors +state.decoder.color_convert: convert internal PNG color to chosen one +state.decoder.read_text_chunks: whether to read in text metadata chunks +state.decoder.remember_unknown_chunks: whether to read in unknown chunks +state.info_raw.colortype: desired color type for decoded image +state.info_raw.bitdepth: desired bit depth for decoded image +state.info_raw....: more color settings, see struct LodePNGColorMode +state.info_png....: no settings for decoder but ouput, see struct LodePNGInfo + +For encoding: + +state.encoder.zlibsettings.btype: disable compression by setting it to 0 +state.encoder.zlibsettings.use_lz77: use LZ77 in compression +state.encoder.zlibsettings.windowsize: tweak LZ77 windowsize +state.encoder.zlibsettings.minmatch: tweak min LZ77 length to match +state.encoder.zlibsettings.nicematch: tweak LZ77 match where to stop searching +state.encoder.zlibsettings.lazymatching: try one more LZ77 matching +state.encoder.zlibsettings.custom_...: use custom deflate function +state.encoder.auto_convert: choose optimal PNG color type, if 0 uses info_png +state.encoder.filter_palette_zero: PNG filter strategy for palette +state.encoder.filter_strategy: PNG filter strategy to encode with +state.encoder.force_palette: add palette even if not encoding to one +state.encoder.add_id: add LodePNG identifier and version as a text chunk +state.encoder.text_compression: use compressed text chunks for metadata +state.info_raw.colortype: color type of raw input image you provide +state.info_raw.bitdepth: bit depth of raw input image you provide +state.info_raw: more color settings, see struct LodePNGColorMode +state.info_png.color.colortype: desired color type if auto_convert is false +state.info_png.color.bitdepth: desired bit depth if auto_convert is false +state.info_png.color....: more color settings, see struct LodePNGColorMode +state.info_png....: more PNG related settings, see struct LodePNGInfo + + +12. changes +----------- + +The version number of LodePNG is the date of the change given in the format +yyyymmdd. + +Some changes aren't backwards compatible. Those are indicated with a (!) +symbol. + +*) 11 jun 2018: less restrictive check for pixel size integer overflow +*) 14 jan 2018: allow optionally ignoring a few more recoverable errors +*) 17 sep 2017: fix memory leak for some encoder input error cases +*) 27 nov 2016: grey+alpha auto color model detection bugfix +*) 18 apr 2016: Changed qsort to custom stable sort (for platforms w/o qsort). +*) 09 apr 2016: Fixed colorkey usage detection, and better file loading (within + the limits of pure C90). +*) 08 dec 2015: Made load_file function return error if file can't be opened. +*) 24 okt 2015: Bugfix with decoding to palette output. +*) 18 apr 2015: Boundary PM instead of just package-merge for faster encoding. +*) 23 aug 2014: Reduced needless memory usage of decoder. +*) 28 jun 2014: Removed fix_png setting, always support palette OOB for + simplicity. Made ColorProfile public. +*) 09 jun 2014: Faster encoder by fixing hash bug and more zeros optimization. +*) 22 dec 2013: Power of two windowsize required for optimization. +*) 15 apr 2013: Fixed bug with LAC_ALPHA and color key. +*) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png). +*) 11 mar 2013 (!): Bugfix with custom free. Changed from "my" to "lodepng_" + prefix for the custom allocators and made it possible with a new #define to + use custom ones in your project without needing to change lodepng's code. +*) 28 jan 2013: Bugfix with color key. +*) 27 okt 2012: Tweaks in text chunk keyword length error handling. +*) 8 okt 2012 (!): Added new filter strategy (entropy) and new auto color mode. + (no palette). Better deflate tree encoding. New compression tweak settings. + Faster color conversions while decoding. Some internal cleanups. +*) 23 sep 2012: Reduced warnings in Visual Studio a little bit. +*) 1 sep 2012 (!): Removed #define's for giving custom (de)compression functions + and made it work with function pointers instead. +*) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc + and free functions and toggle #defines from compiler flags. Small fixes. +*) 6 may 2012 (!): Made plugging in custom zlib/deflate functions more flexible. +*) 22 apr 2012 (!): Made interface more consistent, renaming a lot. Removed + redundant C++ codec classes. Reduced amount of structs. Everything changed, + but it is cleaner now imho and functionality remains the same. Also fixed + several bugs and shrunk the implementation code. Made new samples. +*) 6 nov 2011 (!): By default, the encoder now automatically chooses the best + PNG color model and bit depth, based on the amount and type of colors of the + raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color. +*) 9 okt 2011: simpler hash chain implementation for the encoder. +*) 8 sep 2011: lz77 encoder lazy matching instead of greedy matching. +*) 23 aug 2011: tweaked the zlib compression parameters after benchmarking. + A bug with the PNG filtertype heuristic was fixed, so that it chooses much + better ones (it's quite significant). A setting to do an experimental, slow, + brute force search for PNG filter types is added. +*) 17 aug 2011 (!): changed some C zlib related function names. +*) 16 aug 2011: made the code less wide (max 120 characters per line). +*) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors. +*) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled. +*) 11 dec 2010: encoding is made faster, based on suggestion by Peter Eastman + to optimize long sequences of zeros. +*) 13 nov 2010: added LodePNG_InfoColor_hasPaletteAlpha and + LodePNG_InfoColor_canHaveAlpha functions for convenience. +*) 7 nov 2010: added LodePNG_error_text function to get error code description. +*) 30 okt 2010: made decoding slightly faster +*) 26 okt 2010: (!) changed some C function and struct names (more consistent). + Reorganized the documentation and the declaration order in the header. +*) 08 aug 2010: only changed some comments and external samples. +*) 05 jul 2010: fixed bug thanks to warnings in the new gcc version. +*) 14 mar 2010: fixed bug where too much memory was allocated for char buffers. +*) 02 sep 2008: fixed bug where it could create empty tree that linux apps could + read by ignoring the problem but windows apps couldn't. +*) 06 jun 2008: added more error checks for out of memory cases. +*) 26 apr 2008: added a few more checks here and there to ensure more safety. +*) 06 mar 2008: crash with encoding of strings fixed +*) 02 feb 2008: support for international text chunks added (iTXt) +*) 23 jan 2008: small cleanups, and #defines to divide code in sections +*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor. +*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder. +*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added + Also various fixes, such as in the deflate and the padding bits code. +*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved + filtering code of encoder. +*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A + C++ wrapper around this provides an interface almost identical to before. + Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code + are together in these files but it works both for C and C++ compilers. +*) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks +*) 30 aug 2007: bug fixed which makes this Borland C++ compatible +*) 09 aug 2007: some VS2005 warnings removed again +*) 21 jul 2007: deflate code placed in new namespace separate from zlib code +*) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images +*) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing + invalid std::vector element [0] fixed, and level 3 and 4 warnings removed +*) 02 jun 2007: made the encoder add a tag with version by default +*) 27 may 2007: zlib and png code separated (but still in the same file), + simple encoder/decoder functions added for more simple usage cases +*) 19 may 2007: minor fixes, some code cleaning, new error added (error 69), + moved some examples from here to lodepng_examples.cpp +*) 12 may 2007: palette decoding bug fixed +*) 24 apr 2007: changed the license from BSD to the zlib license +*) 11 mar 2007: very simple addition: ability to encode bKGD chunks. +*) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding + palettized PNG images. Plus little interface change with palette and texts. +*) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes. + Fixed a bug where the end code of a block had length 0 in the Huffman tree. +*) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented + and supported by the encoder, resulting in smaller PNGs at the output. +*) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone. +*) 24 jan 2007: gave encoder an error interface. Added color conversion from any + greyscale type to 8-bit greyscale with or without alpha. +*) 21 jan 2007: (!) Totally changed the interface. It allows more color types + to convert to and is more uniform. See the manual for how it works now. +*) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days: + encode/decode custom tEXt chunks, separate classes for zlib & deflate, and + at last made the decoder give errors for incorrect Adler32 or Crc. +*) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel. +*) 29 dec 2006: Added support for encoding images without alpha channel, and + cleaned out code as well as making certain parts faster. +*) 28 dec 2006: Added "Settings" to the encoder. +*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now. + Removed some code duplication in the decoder. Fixed little bug in an example. +*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter. + Fixed a bug of the decoder with 16-bit per color. +*) 15 okt 2006: Changed documentation structure +*) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the + given image buffer, however for now it's not compressed. +*) 08 sep 2006: (!) Changed to interface with a Decoder class +*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different + way. Renamed decodePNG to decodePNGGeneric. +*) 29 jul 2006: (!) Changed the interface: image info is now returned as a + struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy. +*) 28 jul 2006: Cleaned the code and added new error checks. + Corrected terminology "deflate" into "inflate". +*) 23 jun 2006: Added SDL example in the documentation in the header, this + example allows easy debugging by displaying the PNG and its transparency. +*) 22 jun 2006: (!) Changed way to obtain error value. Added + loadFile function for convenience. Made decodePNG32 faster. +*) 21 jun 2006: (!) Changed type of info vector to unsigned. + Changed position of palette in info vector. Fixed an important bug that + happened on PNGs with an uncompressed block. +*) 16 jun 2006: Internally changed unsigned into unsigned where + needed, and performed some optimizations. +*) 07 jun 2006: (!) Renamed functions to decodePNG and placed them + in LodePNG namespace. Changed the order of the parameters. Rewrote the + documentation in the header. Renamed files to lodepng.cpp and lodepng.h +*) 22 apr 2006: Optimized and improved some code +*) 07 sep 2005: (!) Changed to std::vector interface +*) 12 aug 2005: Initial release (C++, decoder only) + + +13. contact information +----------------------- + +Feel free to contact me with suggestions, problems, comments, ... concerning +LodePNG. If you encounter a PNG image that doesn't work properly with this +decoder, feel free to send it and I'll use it to find and fix the problem. + +My email address is (puzzle the account and domain together with an @ symbol): +Domain: gmail dot com. +Account: lode dot vandevenne. + + +Copyright (c) 2005-2018 Lode Vandevenne +*/