From b33699ad8ab34278185a70afada33de0a7a5e118 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Sat, 22 Nov 2014 16:22:16 +0200 Subject: [PATCH 1/6] Remove outdated or unused files --- README.md | 2 - docs/WOFFUltraCondensedfileformat.pdf | Bin 192108 -> 0 bytes ots-lzma.patch | 5500 ------------------------- woff2_header_dump.py | 38 - 4 files changed, 5540 deletions(-) delete mode 100644 docs/WOFFUltraCondensedfileformat.pdf delete mode 100644 ots-lzma.patch delete mode 100644 woff2_header_dump.py diff --git a/README.md b/README.md index ee76801..fb1dea8 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,6 @@ algorithm. Note that it is licensed under an Apache 2 license. woff2/ contains the C++ code for compressing and decompressing fonts. -docs/ contains documents describing the proposed compression format. - # Build & Run This document documents how to run the compression reference code. At this diff --git a/docs/WOFFUltraCondensedfileformat.pdf b/docs/WOFFUltraCondensedfileformat.pdf deleted file mode 100644 index 24c1e04b055f2db6b6abc2ccc74565d94808a20f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192108 zcmag_cT`i)^9PK-0hJ;}0R*(fW?<(|$Yc%okEAZ9%xxyuWhGwd06S`W|Cih^&rB)~RYHeqr9ghT`ZL7TA7V1gB z_pgR>Q^|F^q>@}OAc{|~orl5_^XBoF)d_ouuQZps2fr4VZUR`Az^itcdZR!JgnRH! zu6LmSWKv#89@?|vN$C+c#w3yST7$Q(=i=g~c=e(z7k8B!gE$l42)ogEwA96yg}+Hj zfFi!J;PH5MLdQ*P0vK084O8ZN*0v}D9%sK1YwzNb52;w4IU`WVuU`;DXKzaJ>n*t0(ydK&jUZ)GP(#u8F{=%cnKPt zgt=Sham(J6t|H5_@SD6bl~Ml7MvoLPW>;NiD85lnsImQ-u6&2YeY}b1C0Q5mCo*|7 zWU4Ps-B1d5{NbX~HR(MJqsw<$d0@tN*NP!b*edU-pV9KFz6PO(nN1Ar%Iaq{)brA6 z^(VN!z{7tiiPe%LE#-kW%&V+8*@XYp=Zn!7z+7EiOcr3kvP0j^Cbr`9WGoa)b8_Mx zKh6-apHCZ*FKvcyFPx)~{veelYda6ua2(-3nGyexs-4EqFKcJ87VVN#OYawd3LDp7 z7Ffj>tt-`fw%$}Slb>C;HMR59nP)O8{|zK;n?ft=eMV8uai9GU4S-FlKHsQNIVJo% zk^o%A!Q}l)s`10;g6H1(Wdsvd>N5+ZEND%h5a^6X(W#I4*Dj$FQu#wddhq?AR4|+`$yMp+B%32+xdmctY6}TOc_(3 zSOA*Dgrpn1;KKYj?bJw{bX;YJk-1r$0rb>E!_*|!w$c8{@aj*MRwj+OdS`>~hxSiq z7i`Xx?cdWN&4ku&9FZ`C0zaab)=%iWr+WN2hdmY(D*KuB@w~o)CVwUGD4kZSIq>*O z_78T@392^-!1}@I>B|ad)l_diQaH2GxxQRNY;Ae0l)Z&mn*BF$zX}6;`Fhl*r@o(zGm9jQhn?=e|7lf%e@Pe5t+Y)HXUzR@fdpEN;W?KUV?kxIX6l<<#7Y3eASOd zD5&}E>PvbigBeqCX@3H(gMp#_Qq~1c!K0Q8%6%(s!uaj*d5{Qs%BDVT^G`H53GK~teYt#R5b+)@#VpeORI-W#)%WHYNWUElcdrI=eB(bIP zXm_S^47&57XT2+^ZgX8(d}-D~r>*2@YC{VYP4bR{girOcq5;*byFcEQi?~@1_nIa&vzZ9Wg@2Mq(KMMQeymf_)5u~iUBXgd z*WN0Mib6)~&fTA^OAHWJMJ35X2S$j0uPn>Aj!7oVGnk5B`ssyDdTld2GSz}t3%Kh# zFb0~W8Cqf7Cu|i5>IV~=6GWlaN`M!yP45dr=-ECDy}FUIN-J@W*eAZbvoi2WF?hxu zrS}&Bs&&n42BNW5c*S2d7J#V*WW4AEOAu<=#ue|3`${5*&IsZ51*|DrFu zuZ(`+EA-heoPb~KgN;nQ+HH=sV6Zgr~RF6$+ zca4Gnn5nOe3IGni<-ic#A?26sZdDXUkgQ{`n0Du|f((fJ^~VHg@-h6VMi9Op%ABH} z!prXFG25Vn_<}cNX|eG2ileql2+ns19i0^ zycZbavm6q~=`cZtUQ6QfnZfz$B`u{->h`_4JOU@FXud$!uqgV;K!?*poIYopf(SUqDayH~ z+A{OmFKdE%<&#em^riSp1Y0x^Hjl~-W^a90#lpF-Y@XC1;uQuYp%sK3wru^oC`xrj zbzc4iGSXZPtbZe6*icQMJ?dbV#dBW(ghPtC+f;IR-not0zSLQXBGMe5W>Q}!s8@Rf zFpaIw?_So&$}Yn)#7>fRDxVH!KAYSR%INQ=gz=_Z`)_dJG1sM?#t=n$w=0D+%0|#; z(FS`1$WuQYKU>pNf^R6o3PfPek6svo3>uGL4I>7g=HOB+fu$?mQ%zm zpnc=P^-%@j&?2Bz6UmcPs*?ClGsorGf%5cnc!9H>24!%7;+fgh$`G~D@C?nZV>7X= zKLlG%n1BvwfuS3($Us*E9&P+otwF9UY(b`J2H#es+N5Od7qRLzN&L%i+S}SEitnHx z1<1Lv@gTw?gxh$j@(V<0>Thr{;`a0V>{uVt+m}bo13yIM%@=801;?+*S(etiUzi|` zENxqZv$WQAXZAneoV9ui}GV%NY_^`Ub7^NzvYlyqsp* z3Q~s>+yD{qy#3IcC0gYkPPN4fM}P9^?syG-uuOVBT&`Gcu#feMkin}l+$yRs%LS*l zK0i9vZ|&rdKW^GepGp9@o(>PuPWHGs!sPLi3$WT*WCOEy=L%Sy|*Bq1X$$7WNFQp87_R*OvSHFBYWR} zGw+prk&p0Kk%su^ffgW-)lq7TX!IyGAliKea}`wcn!QHUoJeB*9WXc6=EU|hT4g)6!!+eME}P|hM2-LRb_SVMcW1QX`+*rIA_ zeThTm4fFVUJ|Ss>6~-m9vM^g9wMK8g{bQw3N)y)wOg*n}ki7erW(nWLGf9k)^741P z|16N?PjE@-UC7`Z)42JfeVX4c*Kc88(Ddr)wFOhs!K6n?tdhB2jB3;=M6U{S_y$iX zq-pzf?V+Q9+%Z2~R*-SNIC6UiKmW<`Wmy*^1K3<^XN}J*Pu%@p6tpj3Sf5cX7t_tO z@iy(~LYYgYp)OHy#EuFyEh+!rJcx1Z1Mti^Ad_a+pl-1N^v6cP-964WgvahHG0QKl z%QT~X$l~*T=Ncq;>+6om0=X?t;>z9aT~qcIWq)$u;TJz!t`R|%umh3BC6siU@~$D* zf%4~q8WiU~45JTQm1>8^4b52+Mh$hv;dj;;>G zLv=j75V0SrN#_$J4M`;fnuJ@-vjote?@>$9U%vFno!_$7>DzwOiBJCHKm&VQY;8x4 zJjwm|5bss+ct%a3An7Ch&OBJQxyaFn*4mv_ri*q7p|>|~f85R}7}(qny(8`eCpFB} z{rv8+#o`Mhj+Yj!w_N%1QvaUnHud?qpi|_Q+Kxm}T=6~l=YInUvx~-Xk?vRU?Pu-D z=CZ{zAr|5u)kpPSxw4Dc9Sy1AY7^4&CHdkJ`N;!m2fqDM)FCBfs^8>xh|bo7Q~7@f z;TP>>m$_S3el6>rfgAaB9Urh9) zQFQ(Fok9mNrC(QAo`XLx;?>CKX`%GxC=@wrZqGH~>4uy<%!gF+;-3LJJ~-%dlji^y zd|l1xf&3&OL9MxrD^MBqY{sj2vKEACmSNM2o|f!J^yoM&FX00zXxctC6- zG>+DeJ!lclI!UXn`!Itjpe*d#bs0q70#3Xk+GD84l{J72E?Q%Q7do_M?lLVd)siTJ zFNg&;85ucz}%oXU*VIC@(MU2gmL zXF^0UZXsY_w?j0IpxnIPo{XTgOt=(Q3tobxe&ac+MEwTYo8-}-+0FC}{zC@|yJ)E3 zY~2p-nR_d`@!m~aQV_BhN>3{9So99;*UD*^*4UY{UeqM&VDF(q?H3|hG_N!w`dbKw z-{VeLQf-mzwXtkZlgyX5-GB`o0lfp;hlsAss@LWKqq+Ymd_5y49ZR;_7UN4;32oZ( zdqSj7Zinxb3kh*65$U>b-817yJNL0l%I7~%?*s<&kX|+I#Mz{O`C4d$Nx=PM!8TT| zE;0@4Fpd3VnR1Sg4&8TOOAVTNMH4Unt)ao47S?%E?*OrmITEX%^99<9hL>eAmdPdg zuy(MmoKHO1efDAn+lQw9NLx|LgYCDVZeZPCxvf>oztX#d>A}f;m`*G1VD`sLquKYB zH9}cBANu8U{x`DGy`>ZX<1;NnzHz6;+mt>h{rSF+tkxaQMaJl=Ad0a1AE^`Sbw9X& z9`bAaDXrTK_>PDu%T~FU#;)EV*psEpxdO}RI?lg4&$!u~pGu4X8dDk`?}XN80#>6m z$4H4Gg8}g}!)DhVlpa=tz{sz!+fM%tp#^jLel0GDE1@$Jo|b#uv64rBGADG6DH*7p zH-ekgi^HnIydcQ5&|cQ804b=pY}B-{K8(ZgKl7@q68yf^;shi5D7 zX-4*A&V%#UN8V?-%`Q|gpoVSOQ=+;tfrPs{)IH=4Or-0+(MLzh1mhw!_i62@v@(Cg zspl^SLFz1(6t`Wsw49?0XU1gaEw0N3T`NOSn#;zUUIQ6Ii(pK?mxVM(OspoUtiWRb z{NGsYiDg*a$sg2QBaWf1{bemJ$~fz>clDBLJ~qt@3;$Hz%yNRiV87S$mMQSF+o99; zXu&1n#fj85E6i_Ow@XI|1$#s)%d=24;D;|hS^ts7#R*ZqpX*afXwuHVj!O1rypPm* zDvPUb+x&MyI~fQrl)5SL!u5pws}5zCpSPY8HG}=-Y~>zTZ;+e#$ThBB%Othre@zRi z`|=b1j0iZVI;Qlw1Lq{L_TVjMS}`5>3M`h!2hCxTrtv>M$uj@&^$%~FFOEp{)2EyI zGd$J22e9c+-BPrWpH2224{fly6XMY*%eIC4Mrf+E#DF~Y77?l6qpi^hUlnf-D+HEJ z#5@6+rSSJXgPvMLlkr%^Q7CRDnA$-d^k6XAjS!{FbDoODq)SO#y7j?Z|p z`;YGcX8ZMT!8I*(U_BbR#=m&^Pbg_UJ2`4VkzYoccCpg5!3T`?uB!^a3%Yul-vDZB zFFIddf~IdXN25I7GW*JPuRH1xzW8;Yf#LO%Yc`EyY0jf4Y4%nI^r6CD?D#J$XKX-@ z5P>-8D~FALz*i1VE1e&!Yy#w{g?iaZQe%h{%hH$|p}X@F9l~UHeDU`yY+!g8+ANwh z#*x#aol8pNV<--mtJF^mF>SSodUnwCNOi-aw{L~f-7_$^e9e7%@;t%u8?&~~uw8H0 zJm&iz4`t*#?X^!UIDsrkL`VotB615cpMURKj{N$Zd)8B3^w|k$UiW5nFAJJI*vk<(K5&~gBxIaOt7H9q@sq&_=P<$r~ae@JKHed`=-+bk{tYn|;q z4VS3|o`5kJD$W@*^6s^X!E=S>q0w&0%LKK+?-Gq}$!O1)`(ym0O&`}P3y3S^0iMxO z3OK~rq*5P%RsED><)@69zzYGdUF~<2w&C}NC|-&>8h7l7)R=V*@ziL@cJmEgwy-ZN zCnmT*w9V3~lziwW>kH?-+?OqAbA05exqePhgfbFe|7DlO$jb@kR8ALv*1Ra zKm3%XD5z0v)wERPlyi(ZA{4i`<7w5yXlqfdYb~`e0$%&ps%#KWpd1Ohjbr$RyiJjz zK;CuYr>)7DGV}odyb_%eNr|E9bN2wf%WsAK3lcVwD3&m~ImAhZE8)CFJ8+2zw4YTt zEE}gAlvaE){am1wR3~w!W+e+C^Ov5>VRxGO?-Q7_++>N>-fN+uhJ+RPh7xjf+`;D; z0G8lqp%Ee3z4}&kIDIgwah+*4=gZNV6n1b+?tHgqWtiDmPtFSfKfaRC9n5A4M^+_hBNCtT4OM@N{*)N~}{o z`rLbiq>@3g*C)u5o2vlF|0K!G$MpU@CwB4)JAWc)8t&`MqIQYP(!3J>psvh*B{P6V z!L?bHOe(fX$}d!-)5%FjgxSie9m;ftYqf}MZky=j(W+8N@G(RG`M?;wL=>N{Xd*0_ z(9A{CN}lso#t?uzbh>>AFaECnn%(3&_?%{|GYP{R5a`*d@syev|kC}3G&vjGGdb44dQC%BJChc{zad{I1O%5ERehDS{ zq8?q3jr5Cra!sRKlkc}2qLTRGb?IKJUtQi4$IvXwb1go4T4q5CzShwE(! z=R1BawbI0}G^^D{crYx40fn45Hr^De@S}q$E2I?rHST5R>cx1KyIC7|h2cfWNym^J z^V(07-aiY{?213-N&8Q&<$(Ut?jEyIaI}m~H1Ke!A?AUV;LzeOcR*YV>+sVgKXzd|USXEwzi)Q(JU=4GYj%jUSe-ei_lLA_5}GsNj$n#H?q07l376%!MT~5N-;=vq zty@(E-LrJi1YQBGtSJC*2l;(B*J@XGbK07CIDzlzwV1Is4Byh-zanSatS5G~(SY65 zTjKyDI$a3HkaOI~7&Xd&V!aUxCb!zHX6|aVxGHhkg1==!3(pR)4<-Nk3>a9b7&}<~ zYZO4Tv{+;!H8^t1%H?wxF~agk`ZTOp%B^EUSB32)+g4krur%0<1YGRX585qQR{a|M zvTp7K|5Y{TjVjVNVY1^Aj9sgijpuELl{v1Zkje=+rkF2ajnW5n(*K3+tr(A-!vgYa zMJ<;DPIq4%tM!=0BZ(w?~pSB_rC!gzhsQBc{ajw{}wREbi4mlmYig#5@@_!!|bS_ z32oml#7P<8!>;}Z1byu{9{VBL3zGZY7cbxTtlOl{=}B~p48XMi;~6pU!MqnQc;|NE zMz6)CpY~qXL+teW2H-joydR8@oMBg|;)Ljg(d%&b;uq0bIw&va`0I~-2z|!%54mZfPp6xT-x*bA;A8>MIBWJ(8ZI6Ga>*SW<*vXTp z-eIfZ%>eZmUU{ZGR0_M-pRdVnF<6E7&|tH$ZeafxG0CHq1SMtn2Dd%Pj^uxl@sf$li{=B#ggp?(>3&sl5ME_9_78UN`35Ey|`fNLaPOL{fj- zlY!ZEP<-VUvNLsGGd;^DE0A>!f6N&P*}em%13vR`bFiGoTvZ0dOeCH>+XyfQblVK< ze?L=lz`r0Df7kh>2D0tG{gst1&!+6*Qh}7@yU^-vu0h`{pNzqbeT0yb%(BBp0G@bZ zLiPpm;)HjnbY9#jh`TWX@{p7W0d=b8@Q zS|;dcVs8^U!jW?x8Z9EOH3v1UnmU+-2USula+5g(!TJhAC30bl=#j5^(a zc^gU(=#u~=L!rLfHtv6EimE`TeLVaLM}K*EhB|WxuUM^vzKQ_@Lnr0MzsmKFt4jX3 zM3F!rzrNGf@hm*mT&_0W2u`;R<0d!Bmt%iwnzGuwsMbaBg6^90t~g7M{7)E*(`Zx3 zdVlg+j$iz6R%j_3pyB(}x=xUH(*5Y*eiPfqfg3F}PPXvO?bgq&9K$gVYmCil=%}{@ z?@J5>Ru=W(PKMW5U8^QA3bM1-$95V0v-|7%Kigi9oXp(+_$K`w z!5cl6#1rQ;mJenx(S1Y7Pd(AkC)pE*CY;F#D0j4t9hLSl8+>JNMWFEviQBrENAUi^ zfx>1x12BJ`vs%M8CiTVgr;zr^%wStPPmZT=&=o$eUm}ZDF5l6)9lfJ7UAvY4FI~K& zv$pk`Xq&!G)t!BRtV|0ze&NdP7`HL}#lkuo_?C(@u)=AC8;(+^{%TvX_SAnWV-{ag zXClW;jBo_uX*_J_Gv~GMg7-E9zjWYrDjASlX4l%FGpAFP)k0)L+I`uG&LWAudfsT@ zB};JmSHA`Dcm6rgR_Fh6^^aZL1LgHxrkJS6_?OvU-?L_(^OI`YtBb z(caDW*~fAKyaDKr375aTxmrt3)l#FiB6>28y@{Opge@GZNCbo`hP{C(5~=(j)!*tQ z`gP76=-k+|-IqQPBNF@Gf9lm(o*dVD5`)oickXTLR!jKe`BzJ6C8*$h$g5hV{ja0F zYbXWrBs4XNm0e9>WzgUEo8HFHKL{^j&#~FEZENk>Ep}ng7anG^gEPHCv`}S1X~FZg z{}Pk3BfAH~9KHcOzB&GxQDQyH0tFO*vFRxYySGuW_DtR*>xr?<+JE4TPR3AQmwT-= zw&WiOKVsk+PyQqU7RtXDI`(!B_bWsLY1`Sr5umn(C7{Ky=7{>O-~K$i$Yd2QJXRq| z*h6&tIcdwv)sz|Rk5`)~cP5tM@XOq*_=pMAcgL7J znITmNHi3)1%vd;PId-`-k9WEA_`u~3;Qwg;*hN==kv)(YTH8vFh}}|-O2mkEWc`%5 zsA2WXua3=~SZO9CHHawgIUO=@bn`;4`EMM9cqW+)xOR_e;LUz6&Xpx z<0V;1{D;;6j~D;5?9cJlp|&4c?aLe6-|g#Mlh4WODC=uA^jmu%fwc*7;$6`D`9l%z zkpIt8WHlq^d<>kSbwZD_;eUwA!uv5s+BW-uiBAik=~OoU4_l*`W0=w7wb z{O!4~g3XF>Ez?vgl?x2b5XoK0`2NY(+=SJ_!?4G00m!s2PJ>SprOw3Zn9J)~fSxfa) z49UQ~$ou`7zTJ1%hniPDieeVrUZo#F8af93DH+04C>ij@EzE+%G*1L?Z~fLX=ho7G z#J1u4*#522n*6PbmA7j635sLyxr?Dx?&rEt=I)^1dF=b=bG#|?5~KkXj>;M>5Y(gL zxIby;{th`kxJb)YO-Ix7Gl8>YhlMH}L9V6Arru)ycF1D(Nwm2Wdt}Q<-ZCTWDz$GI z5g4?@h!6w4=HG8xsk1&BO3RFqMmR}-PPgbq5UQj<#$nUKH|=3)4j@tKOs(KgnlSE^9=bBYm&stR3UuZU@>DQQ2uS$__VFc)iAl3zZzNa)-67|Luv zd2v_ccKzR;hW4|c?b^xIvlpJnw+nEAyk&B}Q{V1C0F{SB1nR0ZsIe!EMA4|$+tjn* zN|Qlj5t(X>NI0m9n+TEGgw`YlGUvKPqmFt~1*V%xTF3}N#9ORW`=N;T{* zKo$Gwy^>LyhCZcMf4rlfUf%wDua2}u+4jn%t{RK4#bxCEY?8+le%%}TP$Cm8BWD>V z>e&i2{_y0NO=ZzPZ1yGercJHef7+g9-`PM{-&G9%ly*OcwoS8?hPMi@e+TqBOF+zu z*p{A7Jkjc>6&dxTp@LT|8`5t)M`~;a55Kbx7k@1@-R;=BPq986H6Z2P&j0Z7N6n*D zv6iyrzazH(&&%HY{Q-juB$ zPF8>XTg8OKZ937~Px?uBjP3O?S#Ksj)4uQcKMIP2vIpOOx$3;GvZpIU<)e&zDPMT*+ z_Q~Kv(fkvS>^l(VB|_~HU}S^P&FPE3Ph_*%8YzoAWH|p3S4ubU$a&urNm3-;OfAe2 zv_XNZ(nK>(6Ta3ZS^MW?o__p*vK=I4}4_K^g<6#f+dM0+O z(HByJLcDHkp3nY=Jk}R7^mnrt(zS847t*))gnE0}+I!wYk##+wwg&cI&&-8x(aO(+ z4DJ2Ao(ZYB-kK@?pH%uksb(ppeB0vfG0Gy(ME=*L-0dc$WpC$XqX_jg7rs?Vh=@J| zN{U*_$^Gv#|95fXx7z<7)bmSmap3heqy$s;--X;;7ly72146Xwom z?`Y%a{^_VBrPl~Y3ez#_T-rc_b1f%NU`0(P#Z56`XUprb$KEEl8`v@v9CQ`?w9VsU z%H`s?J2&X6lLjn*eLiV&I^}qNJV035-(dg?6z<&=gxvI^azn1xa6;|q`Wr$@+tq>M zRj&!<()9u=_nJTOqK1GuV7}T5xlY_`Kf<*K-WdB`-&_UAV?xOBDjMIPUag#mo$kPM z5xGA?;+M|P!-T=MYG(t85IpL7`6T%CKJ78$PlAce%8hY&;{MyGLM!rmD`%6#;2Ruo zOY2+t`E+?akE!Dk$F+?cS)TdnupxKQOP2BwUAT_@dQs-@fsKN-PW77I7U zXk5v~(nROeOx*>pl3tVT(?YEsTV`zkho={#pB>v^e_9o>Ta!BLH_W%~a9@H;_Vp|a zbN@7Gfp4z-_be=>Yv>+WRRDJ5D|eFtr79VKKLYVhBcA+-t?5n4UXyRs{`&sC*w5T> z6DilDM6bYr^{tLHd}%^2uZHX+;FU$>DiZa@hXJ-U{|KFxJw0=#TiUhH#)_;iR+R4q_vPb~*bL#^;QH^s6Bg-- z7U+EFJ#ymWd41X(B$rFgDnXL9B$Z3wxIW!3Kk?cdd;FrU490j!I-$FI);*@OmC=(5 z0)lBZKir~GLJ!^3*WCWnnOI{_=NV0`V}y(}Q)H5R%2*`}U$IgkF{-S$;4=+fE9_u{ zNKf^I834<#kxlK6on5A0N2y=a0wcZ4)QThs%(x~6FtZ+Nm_kL-`)~WDflRweJ6iB2 zxw?Bc)v-Y$t?liAxZj76g$51JV#l*c7opPJOvUHE{0AY$OW(Wsv@K+vb_ju`VDA$i zPLzY1%h43}^s1$;e&t-p<;VxleajO(gKi9wBPMbOSofSMpO)=cvcuyPLc{B#ph&ma z{7j{?6AV-Po^;dL>`t1@Ip$b1E20M%Xz|v)gL8Cg)GX5L{?ECQVw8_bt78TqOs7GN z+n9~R0`QJg5lP5ZDt!Ndn&prJr{7zzk&prjX}EN6QSaIjL(KJSHZ-$Yv1Q>37IQqT zmSXo7Ev7Izepl7af=@j`6KZgAh^+sPkILF-^X6bn28RU>{Vq$--EfF@gFu{W)&oH~ z_XX;uB$S$Lne8u!VDZFYuA_=7=!@46jpro>X3aZosCw=gs@SP&DtNz++$l1++zc`!5l}$+dh~Cv~J}@>9xfNlCNg(c7(avu0nAVt4iLz3tOrejGp5 zc;3ij6iK9QSoLv$YzUajXn@!!F(~0tlQ;65_6WstZgBz3#a)C)B3y2AuxC(S8D-dR zSZ|4Y5TtX`Ec&nXx?bW~({F^M^ppkkaVH1VxVB!~<p({rbW{?>0$^j_J537(f|sVzf-SSf`kFkl8=KIBgpF6u9gyWxaqw zmuOCIJ$RCoLDIhK>Azg~;Am{b$w`W(iaL5=;@T9c!$ooT8k+t=)1#c>jo(!Vj{J^* z$7nc{rv*dp1C|Xne7_To)J5%Yi1YzAh%dnl%3vw)a&(NI7P8&{^l<7H{~!GCEcC(N z)sH0xr4=Ox0#^?*Ya<_Xrza39M6z_+^-&P2ez0hDFQ^+~zVA`sEuT4_H@wcO=v`cM z$3fcWDtXWsV45?wDNgQ_TM`VgJl~^}HDtlnz58p%at>Yhp@Hcu|AB+Q3ITN1Yei>h9?{vGv*vOS-qE z_TU;xX;?^b+?crltjT2yg1vjnku(JIiP~3X-*{>z zhh@VUyIlWrdVb0>&u=iE+BdQB-^#8?{i4;?Oc62ygr@!O^?Z{ zT!@}$vCD~7XSnuq&y`oKpb*__Y8>~+7n0?etgnq?NgHzt}GwkLD|6!W?4n z^5C%&EazLR5{}{4(c6=Eu6?~PTSCCxn+`4QCQDW|9&zwsp@*V76YV)G56)Xz2+W5` z&)D~MKT@8z@@NP5KJ;Vne(uU@bs3hkqVPnV92oWb)%4a9p7L>japz9@ll1ZIVqXde zQ|*h1C!d=x)jR`tn>^yzs^IHSm62D>MrWGHYb{x~U}pXsimo3j@&od<8>6>~)$EP$ z2BLgq&5A^2)TB!m(6-mhg!`871H;~YvI*{WHx_G0yKST^{@&^+>IkIam;dBP=Nl;* zZ_dh|?NGB`ETYSzz1bj?H7r42tA)a+~lFgxwUU=ao>4|=3^?=VKc3? zR%%~SskDhWF;O$@CPPx&yDp(YxNl&!Qy;tF0??Y-ua?yfBjXof+TDsMaC$kWL`!Y)N zmDKg}Yg`}QK)aPoSy|Ec+b3Z_-b5+*05QT7=nc=@KQ!jDusN9HvbbwC^2Y4iFUPNS zzsz$>q@||VpHz>uN(!0au(HRJ`Mo!!y;a-Yt1w1Aad>3XAa{d0SdZXY8f)tx9ZgP` zmg{M$?IQ8*QKeyIMUr|-p=~2=E5v9%P+$9GcP#y<3_}NWwysD%plFu60q>I}VR6tX9f-x%W&#sJfrPrGU@MxqOBECNt&{ zdAE-No3iRlWU}+Y4X8wpGJr{`>=9Siw~$}DaV_)GY02m#?HyU20Dk%Ln4}5zYlR}F zoX3*4$hht9`z<*}iqX>v>oEh*R?jYA43A3l<>R$R&c9ce z9|aIN3ad+kCZv`uq1OJ`vDd7e_V4LFE62@qt}^lI~B%Oc%q_-^L5T|=kq3>Rn3>SI<`O&b44M=>EjXWM-9odT5RdtaM~^It_p%!6jy#LE zwYR?X$dTvdoC;NH834JeOd5Z7HN-vFesn0y$3I0c*&LU2BzZhI!-5)b}-;cEUi7=r$2^P_hn{}0! zibs7^I-AhrmV8{lm-C?N0KY&-EQ^iuQ@{PKDP-wIXw2ZNu6B8O2)Qzmp+myc$q@1* z>dZ;tonee*yupYHjG}OK=*^i75Bi*+FHVOA#VwB7S;))vZf)r@WY6P1Ah60>M8P~x z-(ow)GgdJ?^+2h?qTRPdUIBVSi(4Sv3!)dVkskk&#-dT<$f=Z8iFuT$!R;I1DD3~W zkY1XRuvEldY>+Ee1M*d2$G_7{3us_7&)#|NFu!SM zT`O+rR5~ropK&gDP1Qkpyv7QDxi&A2XP|%)JR4kgl*PB4MZJa6ZvS2RPgc@17+5~! zeHKdxys8xp$w&W5DppupA*Fk?8L$?;>cgq5PD_&?O6cB!(Lx62D;+^=ebSto%LIBM zUh1+2K23Y%Uh!TYx(atf1$mELEtWO-Ws*aEVbjw$a(;k zqfy~$SDG&lHaOzFb5vU%N+kF$qKKos*JN-}8t%Wy<97o~c zd-YrYE`su_O>v z*%6Yje&Pn-gcOQE=Yl^I7znqx`ZtY8uIt8hC#K5)6jd>S1hF@(6}>uOJV@Y^CDY!@0nnvs{6eH z_bLZM*Zr}g9E%@bG3j_t@m-^yCyx*&nUy(qk(5wGav?JF=O9h-{x15&o}q1_9oi;@ zIr1b(zgqucH4S*b{UQGJ_(y7P-Rg!870;|w4lhq8EMK~~hnd~VuZOI1L~n1$eqQgk zC@4?3e}#y^-aI_3Xq4=!2%xa9mPt3r=@5e6oDf``@wL?&GQ)AMpDuc;aM- zC)+u>7G3!3c@B_3?(fG_vC0c}|n+?9W) z7>_e{Go!9UGaAh0S}gFvEG&*fz@KgrU+uGZOn$ny_@-Sr*m!*-I~nSFk^TN;rY!N& zEYDMZ{h!90*@mFZe_xUe1URqjy)W%V?_FPcA7~X_ZGKXk`1)gIv8cSJ3AEi_S<{qr zF2Wjj#3IGK{viI0(eSzmpok_gESv7tEUdi{)hVbx=?^AKbz8n`+C}&xkPfU2En^NE znM-lI>I5xx6+3ez2tReZdgOGg^2=9xL4*D3mt7FE{&-3C7^CjwXP+)q(jalx$q0U% zQ*VAyxBgIw)jf*CD{$xVtU%J(cL5Ux3GL;PIkZ|fWhxfWCq^U{bD^RAq{jdhQpeGm!4;Rpp}7?_t>S9r&ln*y&Asa zON$`4V1!(i#4d{2tKJ|jE)WZD*ESFjTg7-b^!}SnI_sT0xJc0_wt*^Yf&QFbCzA_37Q^`_Fg(Q&3NK5eU-QdlfSr7_uu8a6 zq||UtnB<+WyZ1Xseg*fffP`wRb(o>m&L%rC;eASg z8A!0-@VT3%j~B6X*V6c_D0e zwDqmF<>!z&X;+J|sha0HOEL%a`ZgOUvi^F~Aml-SfsT!Lcc>t-h?~={jwW!K|t9 z^K-cwdb?7WhHE9~Plfa7tbsqasw34BMTPkl$m}8ru9nh z8cARHjgKhTpbIR|BMIdQE*BYUr}-DHbgD1CLco!7xv((;^;>ipQ*Eg?G-{_(S0 z;K0=N@eOT7eQcbaT1&%RaoZFdODXS0zA1RK#R$kd+Clf$1U5Wzdx$@7>JQyp-nwXp zQ7eRo7_1Efh3xAGER|asli!6l#;H{dQf7|3=DNkWf8?x~b$IdFyyRV+#0$r1Fe4Wy zMDT90khepBw8gByqs)6IgTKv1YZ-R4FBgL3Ozc%g@@D)5GbRUbtXZ-Db|F!-#xcB!=E5S zJlgtsi0J!&h5H!8rD5mQT1goE4Yw_M@UI;E1o!xC}#CcT&XD1b3=|WVc<_6$Qh#^tOS_X*sIJQ zf3@W!P@&=zXMBycZ$GZSH^#yp>RFvGonP1#vta~pRpeISNxOBAj#56X7Mkr5B?pdK z*ayFT;0AHZm9cmYdpetcYUS?Gjnt13wv#T+Woe~yS!+eMuggX%eL-SCRJ5o2cjIhB z;>d|mfMO5Rkz4@bBQl`64u>oT2P%UA5vV7+SmVZFLjo*Pshxc{i2($No#>cb5%6Ds zx61e7k1Rq_&Ezw_vb;t%l8_j!o#)Pe`nE7s%jXZUCWji?|6#Z7FQWRqJoiI3gpB*C z41|bt+KI=xDy8ma za`R$lVOAQ+9rhx*`B=zXQnfqQJAv3*Pu6Uoo5{ccc-*}V+iy(P0p`k8mh#WnJkPq@RYs#-1k^^O15w$>)h+@7LG=XzD}Imx);bnolJb`N z0t3>8{v4?ezxS7suQWP6jWgN!6!=T(*Xp|mOU~7j2d4kru8t?r6Qt`Rs0fo=EWUMY z;QC*PmumW$=~Dzg)BwY`fv$t_FxWL-kI-YX$5HC~Juh8dU39&4RRXc{Zn4G^UaVQm zmGjma^g|R8PwTb!c&^*xG%#Q>vXwhau!dd8{YH?I2F1y8<<a+9C*4h>yV>*Hob9HV|^pay8G6T28oQLD0X- zr5DY??;vNU0lRaD!7H92=@}terTqAa-gbFD@yq=7>JCaOYY6?oC{1A2HD+)i-{cuD zp>K9$69X`m3T|Go-w+BMMV21WU)VKFtDORoOn#t{-Yk_yLiW=ykb{myUE|Q)>f^6^ zLUCuQatG|;XIB-X(&Ba#^kbWA8sJq7m9{<)IBwii**0qAcX>VGKIANB=vDU$uHF;#VNp8Cz10=0Sf)R<7OtLse2m~S=9(;NL~+baZUcDc6QJyh_?4?r4&_KmjvH0m?+08p9v#~@Lt}8-w+T@X@>k&Ba zEVFWx%t0y0by~-rgllgRFM@p$3i6)v(b0|jhw49@pfQ_4Er^BXw5VOk>e?hDeRZ$d z(MP(~&=>-^AXMugIhA3RfJdKH`8>bFi-z7%2E-cKQxIHe5s;eL>-;`b3OHvp>?K`& zd*F8ybw(clV|DK4xqX=8Q~a3*u+(L8dzTvAh&NX12lXwPx{yjOetG3RN!n6ajP9Shjl8|)*LsUO52=|ZRQQ%mz;a3wFQUFjJ#h(9GAxV1ah`;izmyr?57d- zqvFb=j|)`)6^EbtA1bc2Jme|Oxn@x2R9W!rm1>0^UEMZL0R863Tch^S!vepx$;z>5 zW@2*idRPZ`lVcNHm4<;L6m=R8a=Db}n{1sR>g-|Kh(jMyc+;pHUa}E#u$VB+f;P_^ z_ODcj(A_QI(LEl&@qMOS}& z&%dr`L2DS9vcB)CTMj56K3ryLC;MJBBzyv-N_=drUb}aj2e>&y$VtyZS%+P0s)qQG zwhk2e#-b)PCqPQI{599|NELy=`dkz*u%3wGRdV#r^iQ%0u8|-WVPJ|jSrS25Y$KnP z1>ybsP%oyeG-y#1r;K<87$e~_Wo%I|_j?X^s>Di9K5a7^)=`dIuLL`H5yZCM=7+4yiEZ@2Ct z+}~MsJkP0Ki&W!ba?(07D1yhsO%5B875^TxcS3%NP z*^}R7+03(U)Cal_ZXKk+W@7eSD3!q|QptTkbJlBz58#b;&0Qzhy5_~v-7Y~5z!1Eo z#)QyT5Cacn$TMkKJiBzR^z8H$Bet||L>S=XO<*5Ei0a&b6wKz`RR7Ypu0C^T>4r?< z!}m_XZ}m^-FL&j%8>y%6-As6?`{Zv(6~~+TF*{s>OCSwH_BuTmyov+5G-fyZ%_Wf9 z^6S(_|G#!nOZd9hw4Yg`LQX{X^VM3#)DkUbM}~P`dl^$QPQ{G2TlN{~WmXAh$Ck}B z)DOk@?y&Qd+%PFtnbT!ifo)yn)ktgUTTgTHSYOxnoyF zeJuPVm0nM8MQ{_yQME51OD?B8J>TB^sm@0AK^~cc0EP(atED^-^7aAfxEC-g zJe@kr{fA1R>y6v2y2XM%X&mr`#mw;g-XYEyM9MILLdWbMnteJXdh;3Lfd{S~;@j>2 z{JTH#>!FV|WBh4?y^^C3bliM)XS0fp#p_j3kn&4_#Sd_z9|$Nf+y2|u+@pGTU>VbX zR>pf6a?#M+yU*-WyqY8H$b^|5bp&TTI)#~-NKFc%Mg_s-aKILqvs44zf{`zAsro_V;Xu&kz1$tFH7 z1(B|d;caxE|Fec$xG^dgU3K)(y+-WSk-~m}-J-z6E-G{3;`Slq`%Q=ENvW*BV< z|H#A05yeHlkIghZulm>?T_0X4`1UC6>-Nyy!O=&4{cMBNkF_lLX~fDO{v!FxYP)qR zTeW3czF>TF8nmT!r+W5*O5xw}(H>K46L$k&yl z<$k7r?azExTYIxW@=l>$>J{`hz_9}B#Um0>&V_1y|Z#!R}nTuRr*M!PLZ0OfAB7)>bM2eb_gnD z7;x6lUm%IiqZz(!Ze+O8Qq@lsj`O?`8#ttPpnz-86XUtybVU8P_QmTri z@)7aO`GiX^>VI_ilwQRgB^g{3+B$v-`kVb?HWoGW*r-z2PE-?#;<UJ36b%^74~_W+1(a#Tbq(6M^9!cpqubx05!6%WVHd0onWRYq{nUk z+)dF5t)2F2Te1pjWWRA5FA`%wST|GT+iJj`6!&_77}S(POy%e4l<0y(NF zYn$W4R5%kCwehe&hj24w3p506SNr%NE^1W{V9h*?v=HmAoQkFDd!*n~^=^8?N+v}- z)e*d(T*1c$yw7~49(@5*hG(3jg+M?e)IH%tu@vG{E^BE~5L4&qXRs5oxAqS&cuL@D zhzAl%QBZ6*=o?IQ_C~Z1+`h#uVu-V2~QWa@ffcD0rr=d`>%^M zILNb+1|9caV(BIB zOG+EtL7T>2U!e7y{n@qQXhL=^o!VEIC?=_k+TV*l^~3lKm#Dbbi{P_PeG6YOWS@;U zsHQ;L)VILLWFP^WH=4+Ro11X9_1~?*YX5c-8oy~j4bajd`e`GNX;peHR<8Ma1mta+ z3N~C;42>G*!4u>LxU85179`{PewfoClnakrpZ7Ki_cDf>K+fZgix^h)B)7#88P{g4 zsNzVDUCB8iknKW}eXEjneq1Q(^mwj|?iXORrtYx0E}`~N^?kiM4+FhXe+`p=z2N2@ z%M*J381?gG5a=w}E#Nd_fgGvEP6)nAA8^ftQw(b=tVn1lI*u__8?yhqVA-Idk)Hc* z&9rxX$vX8XvS%^=?I(>{>O*Yt$WA}kpGPwy_cH!rD+$AkH~n^>RKcLoxmY_i#J8t9 z;ddhqwG3D>V+M?=G^Df#OHo zgx;9EM3a(Jz|9rQ6_#~qszh6g{GruA)kdjBk3LD5xCO2+<{)?JVpJp3RtI;&OjJXr ziA!U*T1)$ziJ_17Itzo(p24Q7K9xLSXG7*>9lAjn7CuOGu*bDod}}|Q#d%VNo3x$w zxMpQ?Tta@ea-(Ttm+T|0r(}T)PZ7t3iK8_y_Xq+j-xYXv&=Xc$sdRpWs2uNM%;`+Xj@XUz?9UaK;JPXR-x3jn(4 zUBa`n>@TO1SWY!*)H2$Zj$E{NM%;r znX6hQ37VC@y1Os(QH8m5wXHD#TuJYlBfq;u1xm9e%Kn-=>ynERmtyXbVPv0)Q}@P@ zR!_QR-c$74^;DI%yq2JRSC}`Y`OGH4bh(Q*d;yg@Y^0o*?Ywczl$-KC7*&mGWASo4 zFd%EgQ8k5Xt>wRxlS^$5$KzGGN7aS^zfJ{bCI*&%jNCts`%4k^1OK79`)Kad$0WDI*D}D z>lXyr_rCjf_&_iZO1^dJIJo}E>KfIJtQ+Oa+t_}rxDrX7&bySoBem_x)XU!w`Lk^6QU_j36 zos-}1xa&hPN4HORAz9*k*^*n@=&#+IL$qF&1C`W}I*p5Yf*7{q;RsR(kcPfX>*;%M zTwSrYD#5PbcsbU0pj}DICOiEv8CP8C`EE~La!d7Fg^Pn87XBm7Lph~N$6uKiJrtc) ztUT*M{cDzKrpb8+-RJ_=G`t{Ea+_~@4JmQy_-b6xPcK%6_V1 zmB^OgW*aUg7}2@z)aAoqacgM|H~A`oyve;s(}T;zoXG&@m95{j`URw#EYyf#l;!Dm zCmZ1WY;NTnTiwHo^~5@4ZGQFAuh($ZNG2bf>b7yPwQlUEbW*`=)iO$9=@nlB;D&uE z4-3M6>A*XK@^LjW%FK4BHK@zUaEl1}c(`dHJ!+8y?|6H@wRl;jb@%EVrBir%hkM@C z#hc^YuIN%zfFLu*KS;9vR0yFMh;31?=ez__Vse5Oa38*9=!3qu6}3=`>;Ith+8Ob% zq=%aa^76SE%=-hA^V9-05?i+6JtSyy49;%vF7a1$IXm#F)qE&8<2;#R-DtoOQmxhV zGYO*e?{Ocij~v+krCWovt7@_}nYU(n#dT!C;8RUasbsDCYMe&j!eCl?l@lvA}dpel-yLW73%2}2*Lcy(TM~0QQRMgk~^%LAP&5+cqG}cb3l&rmT1S4w; z(;Irb#&vTP(t@Wx)w$0#5qjod6a8FxTHGZ6c>PnUEAh(5-;au2uM$=hYep(Q6ch3R zg(l4-Z*TrKVtBD>SU)C6bCGczgwf zz;HR*OVb64angr&D?w-cJ|%*kwJHw=#%tAY{C(_pfQQ ze?Tht!rK5moPu-A!f_vI#SUpWp2Y-jUBTLU=s1>;0y|bswsC?j_h;i5M&(Jk)t8y2O`_BH zWo&1nB@)#w{e#wPFCpg-VcyE3b|zOIs8?|l7NvBOp;O;Ro>GUigroh=M<8JAj6CFs zyRRq_s!;Z6PuU;m7phsk=0jQ;!TI*^#r0)137ll_h;3iCuWjz~Jr8TjVP+h1TrNa9 z6dwL-Mq1#4I5}xx=UyJ9?TT%yhW0MUuy}6GC2vr@qoY|WN=wkYv_A0Ya+XQH zdpoPwR!0Jp%i%C_t#!p_+V(h7dQ<8w2`ZSC@Uo9O0~s^{U4&EDR@GpPa#9!W)#`B7 zVUd!#%^qK*E=E1G2fAV*{cgf&o~Lo9!0(cK-%}g=ojV>J3^%^wDJ^Z8zf^oIr1AT~ zQNX$KPpUGP@ncU;_m6hryKjlrCaVK=*I1jfc*or*$^RfxJ~?zjeuR;)%n0?o`uvu^ zi^m}Rn88RIxv#kU8i$K&4646B-KTQT5+>fi_w+0&6B==*Dq!s5=Nt5>^WZgsv$Hk$ z-&tJZRS4d(=L3fHOX|mDo$bY0XQVjzZr}9)$WpoYzt>7l{%tMR%!x%| z0A`xr0XT;tcL0fxAxAp3;S2zRPtwbfa2DnO87CoN$mD~)&8&4M#h5R>K^AP)P8Wj2PBb?|F%ZFvhmEBVKp zY4Q$coC30QGIjk{%>e>NbQKEOp?2Kr7L@)HeOK{!y~J}MzW}CJU>moyf>tI(TlRl3 z2ora%OLgHJ1Ke}2uO|L$93L_of@bnb-Bsj2)6gdcGhv!UD1?PKJ?&1xv!i`JEX)|Y z)oR7SPZ-%qLq;ZY`&cp)Nnl5eX)?7?dH)m^9wZ)A_n}RizhUxzY;4j*RF?%XsQe*I zxQi~SYeMANcuT`+M@Z`eXTqjQf%M$qGrU>Pe1A=yudJ7goIVyJFtr@H!yMD@l-W$j z-JikxguS)0G>)ERY#&FTC%`SNHs8mOKt4VQ;<1C1Dw+ZR&faKQj-i4NR@7oXZKlOJ zh*bwaz6lLJWpV(3lv1=;DZ1UVuoiF82!rsIyxSmp_rj$Ouf zUr0gKHQ2AYKw$_4OS)_~_ALZ{T8KIM{x9Ke z;BwH&y!@@nprs&SbzU!UfE2%aK(3z}ffin#nJWGmPkmoBSgyf60w|c$WzxnEmPLi5 zIJMeH-`*b%4?c(7pMx7bGzKPt0h*tOn1w-JVpWkLRJl4YSu)dAYzTQuvQ20@weAn# zijW=Ikhm|nMAqQ^#NySbLmfzapX^16Y#lG@rU!WAC@T})iKh-ucNq~Zh7J^UHYO}6 z`Q>dYlV;=l@q8gEg?zEXW{h2UI6ky_%4c)oF}-tVeb)6+=MjVUM-qnKJo+%rLX|pf zpM}eQnx%&-3;#V22!sb+u;}@2NS|dJMkxJjvvPKz;Ozdz9;k()8S$uxitV`SJ6`_WGH?a|$2A?jVG4}()d;oA zah*^KkFWJ9O=wf%NO;--`72yhx6A~|zJAa5_cZ6zf^uTWo46rj7UTn8gUJCD3M=Fv zXLrAIHdNMiSi_$#_;)ts4eDq~D@*=C4~;ax3)1*^QV9RXWfz;>;1{c$pt?|X_Y0E? zs4|yBT!Hdvv6>By#jhH$Cwl9F1I++wg<|7wS5yz2)Osg3O0kUm2(9Z9OY z^=-MmD0<~>SFIQu{vag@#39ysmys#(zN_rq)m2gJkp8fRZz)@C+b1UNw;llNmojIH zT@Fp#2WlEF=T*pkatM5rfkRM+Fa+82dJnm~OCb+}sn&5%9)_r2FD+~v(Q^s(P6bvr z>N5Em^VM8G+2P7H$PRdNQ=IwW12yb^wfIk7kK@6SuV%PYPP$@fe5rL$#8vI#Q;Et( za4K-Q41#gdX<8L3VtC=zo1$`s6#hW+WLP{DNG2t&WRE>2>1eeFa*t>#K`#)N?l*eJ_~Dqpj^lQhSFle4hhLw1RZV>>NA2Fmmt>1xT#~k)`=-g_W!a*$Z$gC;o>Vrf zkAq$+D97X=V7>@AUp$q7x4Z@A2_u}n-PC|-V-_9`2@JWOX+ONkFP&S+Qlq2a7fGz^ zYB`?kD56seH3oMxOzYZoS04;mtYv#Y4O*$W8u_)sO4a?uS;jc69-xEudL>n-{kh}b6r0O>dbR_Q+j4sMheVH(z40+^DBrOk{GyIzW9ql+!2y# zx5=gxW<7JBTCWjm4_N&F;(5x3f3ta~fXrSRqMy^v^tNC( zuH4U0W1+IZ=c{iQ@nH@h`mauCB zc@nvg`%I*zzAk3FD0w`*xekf(?HhSt1ab0tusOco@!J+!p$l0;6hZoCl*%MG%X{Cr zJXcx%$BLZVeb!tT5Rw_IdcYmzA_(jC8|k~kd^ViHh_Sm>`*QvY29El=GrUXq3DT0K zqp@Z-D^dc?9rMIL*1p@XT35s1fy+6r&`*MfpFvflBY`rV&($oZXwj^n3#S{sel;2% zG_43#k&hjmFm8b`4J2IH3ZYzQeNU=)DC&Bp(PC({W{8^>btF|axBOIO3y$jP9ZKdo zY!}VMaR+Vh{oNT~BFA(8Y$L97#0(BJKaVPqwNSqCxGyUAHxEi?-zJU~y{q_J*6X7x zA6F4v%%1EqXxw@enpNGgkTP>8aop>OvME_dx#s3txW?uUg>)GUa6r%O8c{`5cdx~> zj26CesUJ^yuTliA(FM5orCLT3@Ux{^d?;$?8D#g}HJ>RPgXm-|Zp>X-b(xME(%qR5 zn=VjI`v^JY%XQ3eIRJCZPM&NTj(mE_y)6zPQr!@r{SXHNcFxLJlU|aB^Kc&J4*9c?AAp*7bvanH*Xli{ToA1S$r5=wM0CdF>Tgo^5ZwGyf0T zk;@yu>5F}gML12j4gM})Uut@ysgf&5B!A-S$2L4W z^TEYb;oQse-m1za7k($uDtkZSCH-d7M! znr?tcQ&kkamuCz(!^qx+Nj^nm%^G9*pWLFgW+5laF za(Pv(au&-4>#crQY*XBYXx6P?+XNLs0YGb%h+EJzgu<{zZ9tmQx3;* zQ+_N@N4H;!Z9=-*0GyPJZbR#{GgH5<$sopTdj-rgSP&FcKjs}3ZTdZ2=Ft1Wma58c zrf=XCdr^b?dgS4FGq7IpAD+ui!GDayh7qqzWqOz*HpI|dA+M@B=RDJbRnH=`M>K7> z5Kc6VCgLA%B#ohn{U*FfpqXBXF|BH-9oi+o1Crghu3pd|*2j~C%Q=xBLm;E=cA_-T zoTd|Er1}gEFJHsj&8Y=EV_(UU`*Blko?OC*2<`ekeUAS_n_e9#qi@5Sh+Kj_-b*A^ zEI#<^Q*(X45S+nnlNG_hu8+;mw}3jZo!6}DkMlIyQ1$wxYL7}JTvy^2azk#%y%9l6 ztYu=3EV7Mbn1V~!Cvr8e<#1{XaJI)lA6Zy zs3rEvy2!naUNJN(XG4csX*v?{2D5Fv76w$_bexD1&$9`(^f#?fTW)n>;633?1;40N-B7qXV@{EuW`ypuH94 zpJHY%@{?JFey_JxQDvjSqVL@M?)wh7-0u%H{2I3JM0>-RpY_exqtr*m0h0INaWkXQ zX`jf;ETv@N+8#embs3D-mW?`x4ZsKKhFq&2ci3M&7f^i6bCj}ae>OEF7-O0M_2 zJ-&YNuocIB?gCRw_Rf6v?`L=2n>qDw>3<$fJTKcn@LQ|l=#q^HaWDX zJsY^U6mU)zWIo-WG8r`)Xl(ZiK6{jk{#|f7hCc|I<7m8?0+KB@^4vOF!~1 zC*x@@EZ8;dD32}@K4veB7{3T9XmYxOwqwE`XFZ&^&S5y$QEjN#ZUZW|@1^rzOx__& zTxU2Ft0x}SUp&XhTe~rwhZY=y>}u4ugt46+eZZmZXrSmB@cj2V1L;{Wa7nyj)LI>Q zDD8U+jh%ORBXPj6L_1EB$fVsvQond5^1_K1XfMfkcu`8!38t*g_NAhO__lJ24^=#m zpM@CI+P6WH^X=?= zn$B<8162R;FO2l{odH#|!!V`YZM|##Q#I}*R1xK}KV7Nc!?+W%F&$d{7bDy2BD&6R zL=GfKJD-sUG9sQOvM^>c&1qPa$*Q;EA zxCS6~96Jg;1cT?J0y#6qb{xWuQ*lL=;?CQ<6;!1SGyO*N+cTUS=IS62vuG_DM_1f+ z5RiH?I2hbmyx3R)vDZ=6v|jtdv;S)^1kb1%N*$7^odx2F@q$$na+CXyQK41V{ve$s z`R7s=9=I_n3+{0mYd!mv{bRpmxob+)EI&8aiCrZOpvsJB$%PNaZe=Czu?(Pi-4<^* zx!!b4W|2HImM=j{4w`^Qy-MK}Lg~z2L}$xhUE8~Y&2E1F`d7~0X>uHyhcD;_gx>b3 zwOHUa$O`-v1SOWa?W#+U#Ncn+eN#Rx$7X+u4gndP=ripgMHbiYx)lDK%>=&!9Ynjd zrkK?wnYoY|bDsnh5X|w)5Q@H|T2H~@_a6;N)s=^v-d}d8WQ=a^u3}%%ltpK?%0m{} zbu0U4Qx?Y6wM&nce;BfqHWae?>pPqy_qlkHIhI3jnLzgDS<-#vDtK{TZ|{QBD}h@*0;2XI;rD1h5)(5Nx{{Hwcpn{#ZLo>a)_S{|w@gKs1+N^A0tGyOa@%z*=IK6nwrBg&@!@pC+kNL=e8%2_p z6aY)H|7a}fQlk0_sAE7iOP)Q`pAUM^pZq8jwd=7pr?NzXXgVp~L+MLRsta%)yg^5X z#rXO7pDE>#4DsiHT+;x)>*r_tx2u*~tKrdQX2-YenUucl$TZE3n)5C0l#Sd+?25Mu z93@$+-1wP|w@HT%phaaz+m;3%)cPXH(bv{6e8Qd9L6WoHA)J;YwLIHcxvCLF@@h}aAI8TQjFUMe`Q??V2AF$nmDm>PD zVsWUz!upG{TTbc_qtW?dL0hU6MBNL1lbaihvqxfF1Pk4N<&RbZJ1k| zGC&O=WE^$^GocM8$+%EFVB{tByzJG<|rs3FK(2UWKJ#CPtx1g7GO zjZa(@ubrPQJkvoyHP-E90{>hM0QpaD_z`2*Eay=|!>9Aq{=50rCA?s`WA5!drfX=R zOCDvL9mi*Fysij@*9xL0PM6x$g}vdI7EP9UU{|m!Ig4C&1K&2%vOo52K06x*1$grN zS^B)K_9@s6ooaxn_9COQibw}YRb%{m@A@-Nr3=`y7i7sP+pD+8xQ{V6yakrOU$g{1 zt5IeI+PR@?u@3*AiEm-CLIQw=EC&=6#yCul{5 zUEeH=_?7(O1!lw+&7RBltf?)hHb;u0;FjPoC*gKpc)LT(Bu5FL8oDI8Jl|+0!FIIF zoPuC~VL$y5-jGD6_VecoXyjMMb2IPz&ZB~*amjF$-1$k;psu@sJH9AD|CF&J+p#Ms zmJyTen76`1qf_KVeKM8RbZyg5zG)v{IHdLJo>^XVx`I8%aXQW3q%wA|C~kNMg%Je* zE`*zXy1R9Z%}!E&`lv5uaXDu3D{#|0C^ZMRb%MdI_Bj67!f=NX0ouUBvpN60! zbDq=Z+BH_7LttICLx>dr13!d1aOx$MYiN_gY*iG_S9Do@R(sb9;}M=lbCtZ!#VO3y z=yM)6ZTEztLPtPW>=7JG2F>v?FB$mqN&QlM`K-)XjY$N{T~30w{=14@DCKoNi}L%3 zW$Cot&;mcw3QwP_Eq}2K-O9$ZcadI^Id>hOzp1mPsjo4o=CE=j-(hI6%Bjf#nOP)@RI_|d5$}P`V6}f5)q2?hxPCktk6E>fTWHXu^a^!`Sb|biPUiZ5 z8b(xbx`f)zS@~@N(HY|{A^N5Appo6$zk$BLP?!Bf=SV;6*6-vu(u1DK!e}t8iGf%z zEkHu`>9!rud`y<^dl+#1XAL~pWv!L9`=n-fzrYQWJO5n=9rCqXr{&0ER1&~rtj@k; zh&M7DG#2`HD(wnv%`3Ct;fspgX`Htej;f_`UjCPldJi?SW83w9%mW`91C~q4`6QKx zaT(Ea5>(br+E3e4y69btQ@V0QRA?>ffS?sz7@cqkt&9BnufSgZSCJCpC&-HVfh_oZ z*whPc#m?{9?A?l;j99?H#LCO+!0tokauT#Z?bu9SYvD!$|4nnQ6)}Br|Cx95Pi>J} zp-YqZB_o687_oeM2td8TZ0yR9{}vQO+)(NVZ-gAb=yY#TD;-*AT4FSvdO-=nW5Qvy zUWRoyUIjoghTqiX7=b3+J!|dA3hy#=Q+mhA`3EsXDC#KWyM5Ro=QpH3tfZb^1 zHHxY`i2!*}Ris^Qwk)jqC{KCtAWUA1DI zgww9xCd4^|stf$r$^h_{hda1OsV8FIoXY1Xg_Bh}e)Z5_hkEfEAEVQSS)_VE6VJdf zs9T)_OxJ+hzQ&j01EPSgngPJuU;8deh)rcXako1W! z2o)f6$Hb}d31qg=uMoBsYiA2lk6%a3&6`U4Oz^vS6#Uf_lo!GlGO+_W3=X|sKJL*o z9JI~uW=h3bPenwcSDh#no&*9+7yEltsPrGR=Gc@N<6F6{+~o>#ftIvh#wMu@r`5h3 z@9bHH?HY4kD;8;#>`s>a_HnCSFYZeQdh3Mpps?;5TX31ikUB+g6~{sj@Y5A~o&-1z z;=A3fKp_WIcZHshx~X(}8YDLao}@duO>JR~s?LnA>{-j@nI*v(PvL!~}06n~{xkLeQVSz>*L zL33W|Gxb_3?C32g>^7CDQTce1PGY-#0mod%aLV&4neas@#>`~P>|GBnzNs^U%He zeSIwKtZ(<=h8&BEB|DUKzFC5xMNcFEXs^34`xz-Bl)Lv;O{|p!ynV#R`y7v++ zac}k$JGJ&GYVBIo+V9aaKfe`5n8Dve=ICMh475F!sEJc7?pJ3}6YF%=&KwBYadfFK zC)*NlNHjmDs*S&>%UKn&BfNl@ax?9_=Lyc%4p#Ll-dr@6Mkm5;T{=Ey7Uhb2eDBbq zC-)AH%O1gKMqXTHsIY3L`I!uU`c{~4;6+^}nw>6q?qhS--1w9#%hF z%?AZARD`od66j%Gi3w0ra*Q;UmGPb_`@ZD1wkB=g2@*RewEWO3$Oe``h?rkt_09}e!t5y(`gR|kW6gj z7$&#Gl)v4b)t;AGDzwMlh<`6gLzTQ`V7zo`94rbIN_scpb(PMg`%01kJGce;w*k*F zd4=op#P!b)zvm@q8QAF2^9-2N=nPxp1OV(%T{G$rU>Qb;7puw$@nLcV*0@^jP|?$? zLs5GjzE`jhg**ersf-yJFB7d&^!PX zzFzTYYpm{lS+mDk`g6LonBR*O?975D938-CV%sevA6fk6`EOGCI|u5$c4^mV^d+|+ zBpU>|Mv^n?4VaXwcrPLXnsTM@(Q5o{E@C_S)N3kUt@<6Gb^f3s0zROfHj9yX1AwG5 z!DXd!tz*wI)_1Hp#$AF`MBDE~K{Hr`J9XFB8m?h~e@#XGnLGVW6XE9`n0`1)@wH2li5b+z+v?g&jeX(m2*%9mm|#N5xh zMVIDsQVlcy@U)nrlKfN`BkoeS3~Hvly1LLJ%;liRVF zDlwu$Cg5Jrfa>zYvNjOM$6X)myyh|-`tcEN)z3fKTAa9N`dA;bmB?s59#)<5LB3(I zjX%|SS4@@3y+%fbRP-m_c&zE`k60&FCI>C$a%CoH-=9|cxEJMs5jE#*5_=V2N|A2c=@8vJH{TAX&5{2WHj!XdF`M_nA7ns%B#WuWo}bDDPc zOa4SG#L98CL2!XurF8bedlk^3Jf>_|RTOSNjO@k-2F%Ij8vHjCk)p_2{rxzRdFS{E zsg{RBk$JQP1Nd%5Sq2+>#~je35x)YBt_0bs-yec}+xcoZ37k_&BOk5YdOe0lZjsF& z-A8 z(VLxxh0~>5uc1CYv3spwH6W<~b+Ms2o|FZ5`>Ln$cZPa5atE~~yz(?B^;fDr`U9TK zE0OK%qc!B%eyIoL-!~JR_)Ot~r?X8QfU0wd!E|(4VUQ%e9 z%itJaN`{;fW7>~u;Fn*`PjHwHWjP-$BGHa(>sd&cX?d3VbGf-eT%s(mwUh1QH`Tbe zM-N~9z9;MO3H#k2M-diCxSsLhzg}Uli)pY4;9U)~Lhp6tr3-raDa?Ao)&QX`Aho?Fb&`~t$==$K8>L!e({=5$`@iZvgxG20NP6z z(^>tvWdVNo+5IiOceAJ8Aq(u)qON0zph0vz*W}e3Hul*Hh16UPnDylB&zuqaT*RHm zgCgSIT78i+kem^$s2F-lyq}7?Gt#J-uq!-%BFur5%cG7?KtP5rps-;(%+Ag9>D9#L zUpb(>gst5Lt{ZsR!ldVgPM<)M?+Lf|N8zbG?m(MWqei}Y3&1JNuAOi6$yG;?hFbi+ zwq;a)`flLJ7v{|t1{D+V!tnJ$t*iWlA@wQ`@mN<6bq%?aGd`fpwRfQc;Xm(Rg)Hc2Bs z2Uo5ZHJ!y*{%1y5C!B0DUH{c;s*G-)GUdfnKGba;4BlT}Q!e#uT!<;QW<0Xeabh`T zvNux?e!H;m(%tadcwoG6sh4hwns;)y0-47TPX5B4_dN(V5?L)b)##b5`vZofFr}C( zw@@R|cs7q)y@&X+2wo<5N`&9m7jE!Gn3A?5z47c-tZL8UbH)eT$I4D_pR*37+BKWfq*>7Tb0=_tqdB>sm~sl8r!{-n1l10E(8cA`ER(dD8I!pEq$N-4BW=P;0wN@&B;oc?DI;(yy(w zjUT)(ISz4Z4lft+ic?_+xLjEY8YCI*$X_9#8f^mj{W4P#JklBVvh>Uk{R z?rCsdp{r@6gfa8ap*3nJEutoDR?t*;`3HsY<{Eo!VxV*e{}Os+DFugPmyg(aFJ5iHS-(JUrGMggaR)xk@)SL?r%ly-wd={M?5HRl&27c0=Vs2&xKp{EtZW z&VL#uyyw4t+44(Z4PeAw?}0IB$%OAPMVUqjkd>4`j+j4xG?~{)%FAZ<6zI)vDqa3c z;LVuUiEsxV{K(My3TH4Vod21l|KQCYqH-y_cWl_I7vFBa4gvq8agNO-c;m(m51%Dz z1#jC@a%lfHrOFy^?4%Sjx7Vr^Sh|zrqrr5J{ClW(3FR_fT1EAq*-9P9W||)iB+h{T z7jf?y)l~CFkG?b!P>?RtL_j*IbV5^_)X-77BE9z-iZoG*NS6|NDAJ@PltAdxl@5U< zgkD1L^`GCTyVkvTt^4tQnM}@{tW0vwnR&{7_73ya+Oq#g%kN&&HWy|irro-#HuiqX zCwMG~)1+#FmhdQcIug)RpfW0zKi$zVN;UlgU{dUD;eYw*=P0Ms!5Hgi;-`~6R`+SE zJ5-jG3TfCLi||>jD%yOvVoUz-Mz$v0@T?#vFq?D{R3;$PvXd6XK1I)JaarQuCj>e> zH%Z0L7eQT+6K7N0m>|$_dmOR3h}Hn9@mQWVWhaR__^5vGKEVuUNQDNz+94Y$d_^0; zx%h~d@kv2WfppKY4%dF4Dzrzw3c>8XLfT!Wz04JROf|5SK=3qsbIEKWnw|0H~336d*Ti@Ge^vbO$e85V$O6}*_ z@V+4D-t!Y9Mq!DkV7Mr)WS z-5CwA0c-p3drm>OyLg{r*J;n4GftQ&t>P+{AhFlBRcqz&pqBb0dB>bwn+|Y3lySA& z%PT}=iZ^#h(&=X(-a0z)pB2*F*gWj{F#+4$jL&rcATbV1U?=*wT;em;1I)O`M>@8? z)+2KF0&rxu^3j;ZHr7>u8{HnMS1{>@?#z!hsm2^n`b@YtJn&RD1SI2rs@(M)6Nv2#L=9K!`%w4D+gumo$Pe1TU&>hBNhd)p_9!6OVhV=V@SO7k%1X->C+SdQ|Y6A5@V~Zfh2XBYLvoINl~R0BB7Bo zc`r0#2Ff+=tgo!i(g+z#avO@cN z$(u9I8EU-C?uGe!7~5JuwkK|^IJ{jrO_8;^*}VkO_dfNl+Xm8RFxfrP%x)qsg*@}30$iwAw4%C)|VV|EIiArqA5?{)Z&snAhM{E)z5(r$@PUqGxqy_gB8D`cQO&m7$GTY8%Y>ES4%d!6t!E(r+OTM; zxufQxbv~YppiNh1sMz*M58d*o{)5vl_YbvFXQAIZghv}*Hc9u`??AaSZ?iyH)saM= zo6GQ*PL{G$Dtp=q3wlJsM5%>k^y^e5Ec5tV%;87`rxD5Z; zZ4`VUBa@_>3}#{7y?4UK6MOwP9J=%3ZnDyxW%r)AfJtoY>yg1KnUxP7%}gN{D+g=B zOnkA>ZIwl9&EE8xz3o-&V8x=I?Nw7Bi(pJb1^v>P(2%r3iMB{}(U6SHpE$tlSW|ZX zQ9L^zg!M#4^Tjci}oe?d* zD746KO$SW83PWt1BtTD0+&TI41QU^8zVcMY=FPb|SHDV4f8!S`GcE>;sIMPi`ETJ= z_vDlR0=@Vs^6a0cwBz|QqPO`uTOI}2cw}|jQk0_}?rr9k_feBTvgz|D2I2^lhXb>g zN#Wa~+q67bl55iG*yn6q-(GU>f8V@GLrcQEmW;e*$=BIQ%;7_U^C2K?MF?h` zKgxKs-1u7d{Ge*93rHm$(P*=rc!c*#E$h|3DFZFHgv#mG@)pE2bdlTFfklNr_MO&# zc6rHM2de51#@==fh{$qoe*XmTgzv|5<$%-dxzyX<>&uK%884ex6lBeH{_S%mrm2CD z0jPfVZlb@bc}6^5@C%<%2>2^F8WzO=3no;cQuq>E`c;+E^3u8C-5FB;vCwpubDnPS z8}YKaNJ!!1*pr1|iv6*Xi&s>ty<2S~k$QEe7fbYMc2770vPd~AdzVc;gLuEnH<#o2 zUo7^iG>PEX+Wnim$)NMiQ;Yp1%fzui@;P~(%Yq(3e$?xjCZc;nQj6+79l@IwJNS>I%ad&G)=YRXs9V=A=KQKHC`4G zA<_dgL+0hL*NfFeysH+__bZ3$r&uH!Wed))L5+Vm=bRGR_fSs42Tozn%V9_~k)$a`Hn9XVKYA3y=>`fw?W=d(-fI>v z`WCu8QiDF;b~l~rtp*akHI_U-|Kmi&fH9HgM*( z{1jvGM#0}!+ut##>Nqwzfn0^>9OG&ugr;qo+e`N>e)9UCf5$eRvh@J$) zNOkVmra2BShu-6MTnoqhNCuc@e%Ys_^lXcSP3Fq7T<Uw8ubh#qyuhg+8>SfUa_xHOi4vbahCKPXmVJ=>Pqk&)>kPpl?F8L4U zeJq|ubuJpV@gUEF_n>dV^nWi-zuxxt+F}YX8Z^60Q~HYWlDbfve!t4}wcV@gPOSO${ej8kBH4n9y+h-CwYgQ#FRk20rzW#TdJ&{(PK^p5lOd;kc zBT16ebnuIVOV37pmENTM-~6ey{Ue7YUH@5uLEBHUXam)DbJE=0jNPq<2}%yNF9U!m zojF4hzrjxdgnpx+q+B@0-s8^a4l|9^;?>tp19%y8E*^Ps9dTgZt|=jshhxJl-_%3j zX~L2(FhbKb?soDUO!T)me{6MVYE0h$Q1JEY&x|xJXSyeE$~NqmS0$H;y9R+0o!unm zRI|DyvdYAIx=8l$>m;Q^-HJyJV~IQqRxvAn?P-VWnIV2Nin-C@-4C++%%CTe`mN&W z8{aQfRq#F`B6qkBrQ@twu=QbJJd!~2vWdCXx$K3mjqealOjk`&p}FQ#&75OPmmx35 z4{t%kccCv|rtk09vc8jXBpcg+`5YQftmH#V&E}@sc(uh7C=Z#b#v)ulm@XMOQ+jT< ziPITZ+uKvQARS17@&|p>8-q(M!+7+y(7)DiO{z(okL;gB(j4r8np6S%%eSDSFPx~* zB)!k`((`XtBkX!@bL6D8g_CIlKz!~xJFmOInh!a7M{?@{&j zr9D%myurNmDINDVi43;6STap{mbSJh*n&isDzs;n_VCQO)LW!%QaG{I-6&>?j6lb% zp6#q~`r%btcP+keSDPY{0DfLyTA9&2`*^lnf^AjLe@ZruEs+J=ss)qji0w{L-VPOc zTk=-<4prANW1dm?5#*59E>5j)SG_HHyP#7@>cX&L++($HQd>T0i1$t0wG_dGk`dwv zv7M#D|3(@Ug#CdUtsu2>_lnO7jr?Y==eTzJ*gUg&PHL%Zc%+YnQO8X}I1vq$jb*Z< zI_t-y8_v9S`T4Npisc1EQX9?TzXizkY(wS~Ja2dKXvVwpyR{xO3Ktk2b^d~p$SNWJ zMx4I&N}7aabDhqk7;Jz@4%H!0yTl*ZTBi#r1JmBjj)m$({O^eQNy2%H5Gjh6X3>He zA7%YDY2vMGh25qRvvI&t))J#&azv8ihy^RCt2}TU{T}KH2)k3*IzMulnlv>3H`U7m zC;E(*`?>6_20t+lyH_+MD(w@^F9mda0$pF3EJAFrrG?X)oY3LHDt#w?!DQBr%?RmD46_XZD_t{=TvL7FS8jD7kBSg4Y?)RO;_d$ymt& zS3b`PP)}64zF6(%xD|_NvLy|h&pr{ee1-Z2xxE5*3kXu;8>bNkX3Gx;@1edzl%Ay! zDpKj~-@BB{VCCdRr_@XznSg$NQIg=bLj&C#Wa?%YrP)4l{b<1M*y1b~X zSXUJ<%;Sx9RtC;Zk`AT^4z*i~zTd_4I!bZU5U6f7G}tPHP_fH# zqK-G##aje~u~4emSHddbNppw(Rsj7z$@I79fm7Fv?@9s#MJzs7eI8iO_#cKPdxvp4 zvx8}K{O%1iz)gm`P0>%bPT|ic>qS_^iEfhdqH%=8mI!H@VgzaTCQr_f;nnpG_dN}b z)QHJ9h<`Lmc@kOcU2 zv9LnXC{w!g(}drH0YzUcR^Vo;eG$}Hen?B${~i!RW2hZy@mT_;}{>tBE7h$*H-&?!_CS5{6CEO|gyf=|jrr zluK?pank|_eK~iH8v)UpCB+V}MG#Z^t~sF`eWV{hqvhI7^z_i~pe@mfF0AxO#$du} za-Zp-#-**7*{3Ye4#OvEi+760>0<%w0)K{{u4nD0S)$ z5v6tdj*L?3_dX?qe`q(>HF549PC>oxA6iV$gDieHcG0M4|F_RL{!C>+PEPyoOSb+A=k3m3|;%`S1ErAzv!R)je_Y=w!_ti>6?txXau*Iksx}{ET5aQ7B zo9-lVSd=@+B2MAz=>||?{ zF9~C=3cK1(k`LW$O=1td#x7q-7~h^A-Hfdx$K-+hcs)3Yh%@ z$?h@<4k=zocHEvHu*;)w9qs}zRqw9$?r<3$M>kfXx6?aGwjv>!4D>iRu*)zkwk2^2iMT9vm_dBEJ zFF>^5|Ka}S_-agYBdCNgrnaK*fD)lJy4bt=xSEr+XK1sTO0{-qLbZR<4cun?2({B;k6oX(f4FnnFfM=&+vjAqvbr$d zP=M}V1Rf`fDM%@-8j-gDck#Z4;TWh@4iFBzUPWbA~etNyA>b5zlhM{)N$Z|U!Eh{{T!j1Ke)XUza9ZU%Y*RO}4 z2?p0^M1{Gj9~lurGzT_~h=z>3rXVL);s>k$Amuk#C2gw8;F9f$nQ7q2rC8%?Ij+&o z`%0V^{X0<(heo3~RNDQ6N$G#xs?h@fDfPlX%JrBi!De89@khx2xsL0O@$B-fcR@4qQ_^r66geFd3FF%+tgvT(~|pyH~TN9!dsd!j-mrK4fekGwB}z?QKPA zw)^|G8*ifL_D}d{Vt;<{|CpnQoD~D+5sNkFdHz^Dy;3cau zZG4~kw?FDDqV>{OG+@-0ujT{f&8dzn#mp6|9Gdd7D0X4onV4?QZ%5Q~&Y!oLyiHHq znfsrePK=i^XXn}|UnL@gGV%A4NJ-SxNr_*OrS zb?#o^=3@Nbps10geZ0Pbe%$&#!M=5t7>=U;HtRzlNc6$C5VOQB(14}7xXW(KJ zUG!E4MGd*v)8P4YCQnvhwLR!|?F8`^Dy!NGT2Bm!K~Pt|CQxs%S{2KNcT2fneFwg_a=u5QP@22?-m>&)zO%24C*liy08gOv?r;&BH zkpN7~E8Bn8-`;CSFPC<>0ri()DV!D1y1UZcgFxP3K}?5JcQBV_DaoR|FUhM{go(wU zh!@(PTv6&GcZC7{r1an#US+@NmTVr0r7}XN3LJd1MP=` zjPSRo;my9GOT8IT#`a;dw%m^SmkWXsX!d@l?n|bGBO5~Z^~|z7K5NS3XLG`BxpQ-) z91j;Via{TC_-fm($fYzC<&K{+&B6nNQvxd|v<}x}@e@Ub>W$#fKcK=KLc%}8t~ZUp z=dKJ~cYPCZuwqq1z-@!N&0)bqw)(yIg{h`ARgT|ZsJz4GwoNF}bHZ-T)-&nS!>pvz z6g>5T(cSu!=rvrJlky!BT=vj0rZn(5oWu3zZ_%fR8}@)NW+9@VhMf0}v@p2O8IU%8 zgq#7~kQ`<&oY^wc$rtW4pOf1#KDp+?D3(je%VO2ek`&h6=lz;iIPAhpcAiB3DkhWE zZPeC^dI)Z5C#AIc%=da;Jr%w^6Z=xru4Rn#*^FBj#<2rFoDXx);fA>1=U~T-_!)FdxO`6TM&z5wKES8qHf?>Ho zXY2SZ8rx&DM*+CM4VGP*jvuR~D_}cW;K>d(7|K^vK_lxc*kUE;P$8W*iEtw$86t4pLOKD z=iDmCe`fOeMr<|RD<=0I6ssMQ%v;}JO*C{O8&Krj0!QG)v_upgOGwYGQ;jqTMvi}l z#HU0$<#fN+&IcwQ;eXd_@6vwZS?3j2-_aP6twiY=1icc_CL%!tSd_trTX{(@sM#

!X#4BUlbg%lchT#Z-8DPC!7{2uk8mB26yDrRYfc8Wkt)Q`p6HgUZ9Mb|lk*am-V+}GtX7jTswI@RMqXLCL2eesd-1HsXA#jE3^X+{pb(qqyPtXi8 zDm5gV69frIE;?sTKnUGTuVh{~hG!?}6=%HK`0;hqLu7md(G;+)i_m^~npk@HhydD3 z0@SMwN8Y^uW)Mr`-p6(PE=1F2W>oh-OOH(jvwI{c^|Pv(hyG=?qpQjoR{mc-7oQ^V z?{t`-UN=LibP+gxj=|sDA$3wCe$Hr}rAcoU>Hq+ADpOM#i(~mzxpPX4Y9lJ?gVMdr z-s=*ZmEsE+Bd{sTz&@#MQp({z@LS?gSrOfbE9V#yZb2S}lKcwn-xpZA9Jo?8ZXHq| zH)_8sTFc^#AA<$z|J1>$N&+Q=6!UPbgrh5e?K-EG%3HDyrb^5gb0VfHr1O8uNVi91 zG=ZcWcS_~~a_CY=$@`~=Ehf`0O(V;OvJ`E(cJuZ=R4hu9N0OfXDeIdmv5n2`EJ~Cl z(-}5@+#-XHU#=MXBbCJJSDeffF+UOQFXE9b?nI==YvXQmJ1paSWrX7R}< zyv@^u{m)F|8^dph_{vnPvW`5Vp*anFy#xd^-P|_RBzi0!ow;ADdGd2`OnD5oHy}+7 z>gAnpB8?lC#X)t=9wxmc*3>qcRpJ(CsZ7F2KF?oj;VyBB(4LTH z8Z_?LtU7%`pVmk?fz>F9H7gV}*wT1)h6~Y~YM&EhuZFhtzI4xM1Rdn+s97)1JdI%Y z^Ag-nnY3J#KY70-wrd3H^%U9q#qdIDfXQ3#l_y1kdL;-z$ZRC=e#F^%Ed{#h!_6M29Q}20dAES1Ik<;P>`8Tg+wx7;{>`7L zH`IX}mh8#)SESrYAOrNl?I1y*-?gQ;B3mIbY-XnU*SZOn;2vt1lcWcYG-(z9>>cdR zya6)q&io|s&Od|3@6~9Dc!=kN;fr84-Me2b|8)7V|9YI-u3Y%^Wn|xxtO+d`L7in`o?k| zvqt<8@B@iOzbZU)I-c9V#tk&T8EFjLA@DVBJb1x!UR#7^q<2Oh`m@Clxr^{;WKp0k z(wJp;cT?3$M9PCE*I5${C2opcVH7(@&(YUAPB2C4>58P`((cCC(+k5BDY- zJAY54{$@2)Z|i32d2bTuzmd*9SogL~?i2q@vZx+F&g+o!?*TmP-DGd#{Q0Gys~GKL zOT8%Ez3=kKY|s1MAYgCnx>04(I4JGYSc3Z*5N)BP+Vz!2^;tL z?lD~<_8WjgPVa5oVumldsK>HwG!sl7_#vhTc^v0xwKKIq>A zn6}Q$xcU!9q@?PtT~Pk1LWmQF-EYId7VhuL-K4Y zX{{Cy@ehEd1=ch4xv)I7bmijqBvAIaoj}B-;ITWlwIsE8%YvnQ9iOMM3O4t>AmB*{MxMjIudzEm zNBn7MdD{mP)Dq)cLnR`!C;iLZ;b`XcT~a~?+_|Kq_X|z)fL{YbW9a&2^ypGP!d@g# zn_zjJbl~c2r1+VEj&KMl%j<9&GPkL^R6gE8>-K87xCcNK1n6HTbT_G4>pCEDx|4k^ zX??e_8rC`D5z%_>elq*dBI_7M7EJon>~H~#oN75nJU%zAU~TV(UNBOzbG5hJe1m%3 z*W~*Nze6~p?RA9Wpkxwfz766Fa*sGx+MpStV#N;r&dBbMKLuxVnnPh2WHK|3=(L+E z94hNq30kABuI)@)@F_m9!kyP`p#8BUD$;gw{*T#c(|)M8vEEG=tU^~EWf5dER4--k z^|)VmaUbYNdnCju%@v1BfgC+|9J0tmf)%d^j$8NL1XDKsmloer#f-ViNp!4@qoyVD zN|fZTZtU2nik9Xfb(|4J(GcYGkh%aH3^PR%=-f$ks zOfUVu?4)sxOMfVQfybA8L7&j@lEVE4No36KmKc7bMD%e=eA?|dFw4^a1E^`z=M%Q=))w>|P!lHP^V^`M z;9%GSZIHX=K}K59&Aq_3JUGlw$v{A8d=vtP<%zqqJBmu^<$UTgKLoo^R@+uDDVLzls4s$Z4@Rz zgnJJ#n+>Nldwb;!{OxcsS>afLjuY0F&+eWhAvo{4qKv^-tYMoecgdFS= z4ba87GX4=GKX>xA3r-0TRSg~6jz|En?=^(Wrt}x6w^?YsVNDjuzwJ$Rr`h}a?18Ji zPScNaO>Pv^_X+7gbOG*)I@71i5B@k#f{8^QAF*(ST)q1Dnw*!{TeGSMaG_zR8h&=w z8b*i`frP#3%Js1w#{w<}D|(^qt$ZEQ`!|QXV7!nMSf6J$MCXpUI<%0cA1;*CKLCTS zp2o2}x_e;WHwEnUqI^fy2sFfVl!HDlUcRhv?(zFhw3`s9#@ucWo->#Pct{-k-Hke| z^lS$C1k=la+yi%9+-#?{0s!fQzh2R}+k2m#8g;na1FvYwt1}V#m{Y6MQ=`s2A*zQj z-3V^t3qA|jZ+MbP+dr``%BgpCGqij3J#T{|$Qt^qWK0-9pl6Xq)y!zVf+);?wH_7=x7$8(|D&Bhm{ zmVd6a9>DfbR}UZ5rv+SjWdU8kAONXR_DP6C1DsY@<5mAC7}lTpDCf17>hJYW^E`9{ZdH zEsV_IRoKv~&%J&c>&CeD_(7(qCv|bSw818jGE;Q1ByF$3U7$yG(gU>CO+eWSZi5Dk z5P*#HYNCe191u$iZj6Zr9Ki@#@9cRq>Bcuk!2%Ft2M>N#4BWI}c!2GIRHy3i z$_DG=uCi+WX;DTMgu{b2=eaTIl<|vW_H5nISlW#a8#NIcr%-g@IgP`S*P98Y3S|Hu zAyb66f7>|aK0PFZ$}y2JXm;hYfFL=raO9X41pSaWef0xX zfPBERfa`603?o0lenjL$=unLJ5ssA4ZJBz$(*t|&+Bu}m zbBzneS=F%oM+OUSMK|(btu@{qxR#A{5V#9$%Qnhdmv*4Gj2CTbO*cttDs>Ll- z+q+}q{_xsh6V#098m{P)wZ~i*b;-8M1o&$B=kI2WPnCB*SDk`Ek+nnAj(Ta(OY{fDEUab!lE{uG)2j3G2zw5>u5o9#Jb=;j_{(zvxhKl)jc)e`XF zjrn+d5aILl=BT=hSgH=HU;c$xaN{Yv%EC(|eySmvgYJxO$;Us;JviSj#C!|opVK6j zZU749L}lOeF7?%f-N+~|w{Xw51?B}V((Fz)dA=dLy=dS(TM%v=>8%6J!Z13`wuOH8 zx^G;K}gT0!i+2aQh1x|)2PUf=SkWr{ub2!D+w zhdw4eUY}Gc&ObBiqVti}VkcD$jXRape7kjNc+e=Zdr1ATP8y!>RYA3iwa(H5{1%3{ zZvSbthoN<<6%qm>t(S-S4qks51cKTL4vtXURm**NCp`kk|7z<12OA1YT8p`{7LEk6 zPabD|F1@#c2Aq+(RGqcCE-+jUEOt4!LfuxpN&V+K^SFS*b$zb(c`hO?-f{YN3tK*H zG`vt&5AI>U2~W@~$Z*xu*5M7NAQ72ghy_Q|AuC??(6E}6$A5Yb{%h^}0Yot-lxG^+ zsqAZq)l`9l-n{qe&`sHU7jd#kdJ?|@*4d(PlizHUw&l7NnLk%osgcU7m?w<5XVTb+ z@S=_jL%{XkXCG4Om=84 z75Ba{tVP0h@iJwrYQ`J?9PckbyFJe2OqX!qJXdXLJg(;D_~z*xTK^>SopCLM&a;Kc z=6Bq(4GSFT7}&2bKQbB#j!Ei4rj}h~X5wR%9!D=RC@h z0OYKUhHTKv$mWaAZO#58*Fis2zQT1E-@cz|iTC<-W8+TS;3=8&J%#}G4XE6#tt)_S zOgf*v&eUo;{zB%7#%WY*3U%+{Axht2)^gn@C8BNyP$~O<2YQ3Mf|9bMiCdg~0%vV45 z9p#saSN0lz|5h{0)qh)LvEfD(TlSk78LW&KYVDWfen@AqivkPP>9 z*;PS9Pg}+eD8hn3}2+P4)D=Ri&65VvVy0<9ZIit; z{a`OgZlHu`?EW=^4y*?kEDkNaB5;3WI4g?Lc2ao%A^>z1hE~_m<0RFm zzf1U9o0ksbhe3M4dx?umsa#9{>HUa8%64esyAn0}5PL&1Nu}EV4X_FAYruB)nA&OF z(N*mVywoA8hwWf=$648Lcxtl1XGjy>)t->`oUpSWvE08f5>c5pk1*Pzi- z40ldpB5}hZNmhcrPd+=x{$RghK;0O}7w);`Clx>>Bv-gt>9?qWnS^?qpa_27f+ z(BO(DNkEtqkmDf~n%>eR$>Rq6w zaiw}^0Q-v~zSLqswxT(NJe_S*$H)txrx6dackT`kX4Q9Di4l z4aD`cbYF69t$)6nYXgNolrnWoCJUGsJ+|l?`5qMms~mB5h8!Nftj-<$WDN^CwR0EB z&+F@zg9Tj{Rm}-{4d;TBJa3LqoCr=Hgu3=kDKTY5xc7}cplD&r;&?@}0%1D9`|A^3 zM-I+Sl~imXI_Vv{Z?pK7!g!q0hHxAr!joZfncS>GWNGm{y{)Q$^z6|PZTma-YO?eE zQVlxpL{Z)LZ8TH?YU?_Dx=zDn`}9SDekzL;6M82NCe3oGF>9h1v`Tia^9=Hq0Ie>X zF*#sMo1%liHTP9YXwTQ45ndqd-mkCXu{c4tp@i!`pnDyy1yFL0zLjusgIB7#@qVuy zt=1+7HpDQ3LLEvv$v%%=`qUdAQ~_H%zHbT&w@K=U+vN*=KmMLGuwM4ribS}Ykg|c} zt<>L`r%Q^=pQDIe@6#kUa3Ii^Zc5(+iXRf(&QIWnPT_|SIKKy6*?G@D@;FHy+|+${ z&3Yw&<|Hlpji1_Fv(4iEzkr_N9%NvA)A<_LzTdO(Jfa{)1y0W(D-5nH>0g6*YXT+o zWEON^%pQYk*0Jir$WXt_fine@?W9jhXMd}R6(HJObg+^u6U)b}b(au4lmw6AmDE_y z%R4Y@W5BbA=v`&;%>7kt#%-dRLdP+B4Wql)W>tV^Js^Qt=^|t__RR;YdQ98CQq&bwK5U04>8&-b-tD7mt(X%{I-4 z|{$UQ2~`)j{w@PNp`wB`tvt$n69;1_0hMzhE)Y~-hEV6<<{R$vAk2d(cuE*Y zG45)t*pp$;KnYZcGj%t>Lie}e)Ij~M0-@$R~f zd*2Rin5Rwg=}6Ya+u%^jy)(CRTi3r!`JN=Ixt7X_8*gBIPN!iXFS|B$1&(mAT!o2we&XL?d)P2E*cQt=ZVGs z8c0JDxw@AN3+TNuWBotv zJU{a=A+Q-a4L=)#hI5Lb2@~5wD5MS#g)nPN>fET!&j7h?S%@MQSNZpfpJ)Gc!eKCH zLAfKn+H0&TxYh35f;O>w${yH;0GQMpnDFfD#GUbx#de&fMp3|S41@cgWAJ!k>kqie zV3EV4_#JB8LJ#(l#bYO1>V~ei#K@3vp=eI9mtQ*uKn8={@VaDc{3{O#Qd9;jB~j#w=*Bf@SikeculgOO8ODKmNW5(!Et zThHveEw?#Ka=8!}OfcNWGvu9b5bh1M?Lg1!0g|MY)8?LSd&BK;jhs%p9o1> zvycn32$H82A-=cscM%N@N)79=>(wN`@jAtVsPne`0#d{}$-@&xWsMn6(wjhqluM{U z1heR~ZWD^a4iV9O@M!!W8h3d{8mmzF%+T|??MRW@TG?g2OP}3uHzm8ie#pyVnUHz` zZb^i^`Oj~puDO?1<4TWB+bcox_Qxh-9BD~j#UL$ZBe}7EYAgQvE&qd(KvC>Aq z_d9B5-K8R!wT<`?yDf6q&1Y1Geyh+`qU<GSp*t;Wrrtn#W?ox`;`=yf4&^O^MZx z^2}5(dn(XuB z_1EwGAm#AGsdyfFpLNaamGd!MoL^js-S|txB&~#`)>`9CZ&rM~Q7KUNj8K7m^%H0> z;Ohgfg~d<6V-VLMC#1Q+@%q zT}kKXp)MX!2h``hN*JbQy1t4W0&$~sL`R0J%`mPKQ8*XHfT}&>5 zH~1lEs&XCQxYy*AT3SLJ^7T*3dXP1L#Y$dS--wmel1v(mHjC`9<%;b&=g$j` z>UQ@*87JpaBUiBN$u=ub`yY;%m+;n{XOXl*h%KIq+wcq87eXQadRwK$Jy{7qCqAtA zwRuRQ*n&NNo-L(Zj!=+hk7Wn4`>pk~)%evQ0WS!#EQO%~^#-B5q`$zX1R97-$I=f~ z1c8*IIXy`DeDsx>XJA?JN6eb4=tBeLyVx=-tgBnhX|FVLt=_-&kW#|Hg8ld@g?s<+ z2yslVW7&t+j+ye^bv{wpwV1vX4Koe5?>AnbTrSQnH}vpT?Pt`;ZSDV|?K^{-?7}u* zML<-70*aJ?C`gkc(nAqZ5fFm(4hl#o)IjJ0QU#><&_O_Yuc7zeArN{eB=i=-=KW@N zznR@{=i5Jm1L`{@>ZJh$!c(1R7wDs3HKkG@E{Q|zCu!-^==1x!A zy@WGcNWNYTl9|m}`tz@5Q0Wz%h-KP97|gpQ74Y14;L3fl;8-45MsUJ+f|?d0RPPC% z;2p-aKj%C^Qm6~(+qGAx893E03+Op}j#o|>f`RavOIr0nHoQ@P%R=T5HPX=Wj}}TO zQ2ls&_gFV|lU^;Qy2hQ{`s_4i^XUXoB|o~pAaT^@h2_rMW4TTxF1yR>L;p;0J*yN0 z_M*ITH~!B25JjqpL5rdch=qetIb?aAmg#nlFa`wZ zBG+&T$*aslcNG*Lz!O zRPTW`OiB-l+ujid9Fe+s6#+fM3BP?6$_ekf+vA;^ymUyFGke_xefNuB{+9hE4F(c% z52)QhYBsSUcbc_dJ;1v^uVmLmC5b&$X=5XvsH+F0qP?;=#l^EOv;7IxEjBg}Le#_N zLDIY+MJ4hFM%k`}n4VTji23U$_l7RZf7r$rkR?A^hERN_s=!`-{VKvYzOY!?TESmD zawe`j?~bqT^O@i~HJ=k4`yo_!!rI90X{B|PIzo7p(}O?86Z@L&C+^l><#X+#Z6S-! zZXC*<)q(CD$|uS%Qs&S?2&I+Y0POPQ*mjOj=ddd(8gQ(2tcu8@kM_=c%T1I2(NpX~r%|bE49mg!+e56N;WrOrBDUZsB zWn+y5Cp}GZAM)EZ+Tx`w;7K33L}XZ1IaItFtCpunDC~Et^c{%!`6T4r!yE9#asF78 z8cxMZw??~i?azp4s@q>X7IUT#y)nBDCC|a8u*_7AK0~oB5wwjl8hNRg$YSOipG%8} zkPeSOqP%v+@lBHoOM2NW*=*nNNZ|=WB)XoQbQH7el#r6Jc5iz48{Wyo(}m$T0fy@g zIitk>B#d-H6;^$hf1n|W38fU(-ur`G=lB(Si62&)3s(nnwbv8n>@LCm;8hn}cgHB1 zU^wMcR!nI0ZF_N5Uha8Gj*ILy`;f3CLS`JdvZmUBVo!7`DT)58bF3D)Yvxs_Ib%H~ zP{aFe_{!D$`EFIUr5e_wJh#!+3=R?E-rnD{Iq9tcthDNI8=;)9MFHlW>I=R0; zQD=Rnf5s#d_E)ig)oGL!5TSgrSgCx=WBRaG)jy4ZixX()h>mgvp<7K=C~esu*U(1S zyf0c_aAG@vPHm)4zO%Vl=ng5Y5acwCbIto4B0IRcGe2rgX1!1eu5p8W%tIG9>a@^( zd@uZ-+4-hcLfA@zW=2Vh5pU&@_G)AA?h^R&{cB}Hpxb~1K+E@-ltHYlUBEzE7RL)=HKOhazg*?}fc|{Rd+u6M0DtOM5+D z*LEtttnpb@vaM@y@ljnqVYP-n&Eq#?9RX^mWemRn?M5;ZKw890kEZQrJP6tCjV{sB z77I-m0Y0M9UUy$QhE(OIxDatPgO&ssP%0jK<;RM$hAuH6?`p}=>oB@>I0NP>|73vc zghAb+nADEHBil~_oH`CsIux6GqlVjl|$5m^D}@^ zQS1IRT5c`emv1|wsW3{&Sr~js+yk~*2WmYmIclc3!HZ$8ZbRaEBsM(_mr})wI?0Tj zJVlS3b{99~=Q1`vpP!An9;@43EnC>#pO!L(yS1a)Fb%tR|KvT9?Eh;2N7!fu#auIx zNO5e^tH|_T$)ND?&0}kc_fB4`sp6Bc1=%KwH|h%rj2d)QV#x|*NW{4hicVr zWF+I?+be%n$$gS^VM(YarRUc6nYZ+L8B<)mi&J|(UFEvADt>?RJW7XFcvwY=kz!I( zu|`4Snb)A+13xj+K2R)Dd)Cw2saklR0T4;ekklBQVPw1^+5GmwfTzcgiqNZb+Y@A! z@kBSx-Gx2|Jt7KBoO&guW^nVf`p@;RsKZ~$6i0F3c@N8bdykX!Xb$`b<^=54`7AEl zV!?87By>-#ppSdDG%vIM4;yg@WOJEuf$MV{b#2u{GZ;k&D}n4wI8#|Z%QKn{%xA6J z@B9&)c5dAeN-TT7GWhHDq$tPY(!`fkFY4p$)%riQT88y%tGe;KnPSb(bsUhD9qa9W z!EU85Xg^`%2|0^|KA`ejgP(agx!Q~TqjLf(_ObV;SeE(u8stw^Ge3gBv12NjTJ7me zxg;7?u@v+3pTUJu{Xchp*6f;5f&*IC*}e~5xi8H34b+M)8n3aSHp>tP&{^4S9meEM z1pk|Y4p47G?<~o=`(p1?Exd+EVUW%nQ_U?_qPV;xoasEuZ8~{$$V=H@nCNo;k-_^^ z!jaC%m)1MsKuGqd1^xL-Qaug8jx{wx%YWQ%3~wN{^yLC-vYl0t>!pdN{-d>o-gT0s zp#3A6Phq<>H6ZZuhu_b+rHv*%RKgR7x9**#L_D5Sc+-TL3l%$6uIRu)!f8+4QnA4@ z4|nTRlP%>7Bvx)qEynh458erv&*a&&4>iX8vH7|i*9}#UxmCMvZ*gfJnAMlJ=T&eE zmXHT-v+;(xUfLaO<2VR;qfPK_Hm;`Vt3L;gc?m01j=53tjh+nQ(M&%&)7Ye*V~40! zzYh@(+MT0ih39|qoddI!7y%nFcZ7^%e5E*a7Bzlid)6;c0KA3$!IZ10N$F|m9Gt9_ zkNHT#_AKr$5{f#CXh93iYE1A;w4(JjBAVp(jqXs!hey3>85e&S@JBX>|CsvX`)(Zd zB!SxGqGYoRW@Ij(H0oS5T7ZBsrIdee@1NVEif-E?)ND0x9*_|fg_oZ{x#e;$L}|l% z%jK>fX^!KadD!uKv9{KmBE-Gors+BZ7oU-xknV*p{t#a4ix()K8St(XxXB!a{u9XYPXyxcA(#2-Pe>hfd``F z+~kw@^*I?m6ccr`S~fn(wrG|9I3W9NH_N3un}rms3EX!q<#X4q@j-EP{=$gAob*X0 z`C>T_7^v=U^%%f%lD}N@|G=cm(IuIi2W>vxNEg=kfGA_60l0G(PAawI!v}7UJ_wUW z>WjxSrV>OY>Y!JiVRYtPdrAtn@=pWneB}b{Me?e@+~+#U_?+T{1V>yodWkg_2>8~w zzEq`iq;3hFOXMJTCYlg`h;^L+5e9+3m#3~nR6L8r%iz>&l-qtfeExvRFbt))#H+7L zO!0k~QsPwdes#j7T2*|?v@TDBjA@Bevtg*E6yr-;NxBaxN5Mw1L;(3it-Ts(8lmRqr(|eof#OQ$J{T54JqFYH8WJ)BL1& z?}YW<NAMV7}nEqLA`B zIPjpqlDa;kXu}iqh;aSh1O>j?ZYFO6kr^!fFOiu^lHJ?r|0FWMe*K?Z;s2V+{2y%M z{~uIl-jDpxME|8pOA=nZil!zOU*ADob^j$V3%%xlCM?RYFDd!&ivOiD6K?$PoMu50 zk^hF#9IptWe*GXIvUa_VjLcTFt&^qt$oT`c@~w;yMC-=xg-_I~KCQPcc1znZ-_kDo zI5!#&ca zedqmeSjc?*_|mWm?D+cf;6!LBEmpX!?POE2u^q#f!5ifd7mxpE6hcZinbudM>=}IP z_7!?eqW);*0E()(mSUj2#GC@hNA~6{+8r%r3se$5FCd%rK+c*^}?(T@nOyh_|^u zxP$+UN*&BHYSt3rBtCpPiWvd2rc-Cm+N%%UvGLfF%n(x()>M!Z?dgj7hbORs1$2tJnj3ioMxY0&2`VTI%3Bx%3dPOr7Bf9 z2C6lU6g@d;kX#_!-5ZMFI|dSYQAsh@vQ@poiiaH0E$ONwo`q zALFZered1EHy6m>llyxH?Kl6$zIpSX_V|Cdwy2p18>x?}KPaK7K_0dYR4p6z$@5h^9bXPu6S(3awCh zi{5y6orgjMI}jIC-ZwOh`0g61%Tq-2PbU0X&3QWpJaL120%yW6A=7Z%N9}2YX@N}G zMZ=pj#Klkq0*5c!yuLZZT-V_U(qxLhUb`-<6wEkmv{YJJ+hPDym%rpS)e(i%MLz^_ zd31xB_Bxc3{%hpd7LW(Vo*#2ArCpf46gdWq9o%$vbmKTkafXT5V-HJlthf2EQU+B^yi&fIU4?1z%iD3wiYo-?}+_A})DAH8gyqKriK7&3L{je86mF zBT&N?K(;6D{_R&sCvdKj3H2eS*38Bi~5XhMnqV7vA z*-$>CUSWgdUV}sZ+XW7Aaz}iFdEz*I`o)Q5tMWI4?KLS=n^MSgTrj|1N!5K^4)0xl za1vd(dZkLQ;Ajom*1;*-fCW900@DP&m5i<6VfoeISB>2-pyHy~`?D<7*MRux$(#@qIn((uRoH~X%tYlb&2 z-N^luLvI)H)tmkE#Wx4zH>vpTaA9@M&yQ2^tN&iaSR6DERzjR*T&GI3T31u;uEPeR zIPbg)FXsBKHdf+ynS7TkcyQ^+r0)Nlfz0&8_Pmq{Oq8oVvvSb zW{R9viOk8u!K%}3{s+FoElQBO5})p20V<@_J=?h%_z&dr250vX?Yd90e*|n9Ksq1O zixp4%4QSlX`ni4BwghoS-j;m)B?|~ay=`}bjn~aD)^|p1{Dg1hrlhf5$NP*NS+q*u zOyqmr^Yb)ft&<*aqsk>x=zrJa;E6hb3VefCx4sY`Uk+njPRz4m0$gs|7n&@7|9)au zZkj-D;E=nm9A!$1Rb%B&>y zHZ{B2RS6<4h6@mBvUiS}+f7B)su*5*;Z5$Wn&Y$c`qjhN!AYpAaTq@PH`eKGiSW-K zOF&Q89FdD{>>ZU9+-ICuj#_22VWyR;Brt7Q+dV&bHM;L;o9!Z(_c!)X&DAkBw_a+n zbtr#-S&in%Ro019bU-F)2hOnZaQQC-5SO^KJBQjnDUA-$ckb*s_l2BqXT$^1Wg_te|G-T9Z4(RqiPuCcLUoA6$}4-(aXBM+B31J7a;lX zL~v)dC)ezDvJArEK4q^luP>|~xg)|K5kJ4SZQXq%LA98b+r0tiy*$5Er00d$RGy{C zPISjBQe-|2t{Gk@qh$EDj`)177`|HXFUv%bgiubrgadcE??!{xDh5{TMb;`hGSRX5 zhOERkCB?Tgx23zKd)mZ9;BGC0MM-Q5<^yzAMj*f32^DZ{ zjon~4;D(4kZ9V+6Hmosrdf!(J?eL-) z4hv^%-Wvlk5zw&`@+npxhsCB^E3Vsfc%y57w&?naJPnGlYU^qblqt*j$l7|6xF?i3l;Y~B|Q zg#CCbLuJCIDoK1HC*X%=I7oR=<*4X)#|MgA_herFCv%!U>yD4>Wggoc@HVyT^yx*^ z6U}A~#ak~P)3Qk^nlWuR^tI?SvW#`x`>@uwYI7#oX=O#SV;`&(gr?i)liR!?qDY)#B##c%Ub#QD-OccXKU#EVY@5X~Eh)bg|Y zvqZCHhCPgb8lBmD80}nZ)-N0+>cwg9pa&CH3^%?OG!o#CE5;Mk1jH+|R~=*G5IC`B zca1MFX!Y|WPRM$@lt5YkC~9dVZ`!c~Ak1neA-iXX3`;RE03Dnj{ao|G*nu2QKmFJW zuTjM^aXef&*r?FFOA$3={++}m|Ck68Nc`?`LvJ~o{|_@+IJ`E+I!WqoDEwSOS}scW zDge>(g_Q9rv{Cq9P?L7$)@{YWJ1El^>1y%ugWTCtp@_sQ&=+vg-(dYOhfX$%JdatwSYf;? z4rIJL_M69jXQf@h6^f2K1<{PKekVv z!T5mBi@_TzZcMQ2Ah9(SV2>dPD!@54&k5C_(45YO4xxbv!W8{ zHIdKbPF0Q@MY?o~iY!}W}aQmnYqfvONVu{h1 zwymbc^@w}|P7FJ$^@b1PwgoBRXX~)aXg9J>7SGN~nb(A7c$uknw3(7m&?EQi;UeLp zu112!y)MbKBUlqzBpL7S2M538O*y7-V?wq1clFk8dHW%Qll33WkszpVo2gx)T^lrx z$zw{_JSbvH8{aQw!TYPISR)x7TX?tiRj!&>(aBsZE+;L9J8n5hGO%QUcfFs)xTaP3 z@a9Q%?K1D|6YOMxvAe?9Zq<0*7CKMTtbg{(i1E=X?nmmPpGOjrZFkjgB`P3J zTF}n1hhhv8W$c&tnzo%;%GCxmZDr=2uE%~*&7DaYH&~R8M#Lb+D*_aLX5e3AA(q|9 z&Kk@vZNE}*47Hd0s+)vy5yfq;e39DdWY-7B`*GPt!#Pmb4~g2_@p?&nT983Ww_NYd z%sf`bh(V@18sa$22R+KmD=bzCb`GOATsug9A}m7mLo@#P4jHcOiZx##Pq0y7h~D8k z9YGOadbpFIp{af8BsVV3?zX4*GhwZuzfU&_)g?063-%raEPOI+y(WdedM0Nk?d9hf zrA)^4c1#RIt=w=4MbYeX*u{@1PoGZZdeg-an(YU+?Sz<)&v6TYDA~%D(d~voaD}2wCud{x@yoEt(ZvU3FEZJ+3 zemY0NM;_rH=_(k>9@V}(aP%aT#{xRanW@xUroWY@>sl3?xwDimCG2TaN3AZEBn5rs z82MZcelxzO)?M@|q`*%`Tz6!%a`482Zi2ftoN`F_)9Icj(7U2)~ zZDvh4{Pije4)e;~f{Eb1n~-xL#sNP&V~+-lX)+34*=X-C8hq#irLgm(mZ6l&al4Bo zHK7&RJ+6Vt__@Yk8_`c2La&l1DwcWW-j4l=G_X#{yHia1>O#dt54h;9P$z_w(26~8 zihaHseGR1~*Xd2cHBNjt{nAeEEtd(iLoO^q{}!=uO9+XYHqk@Q74|GT=eE#ELq>z) zXiIGe_!fFcMXhNSy)w%4VN(3s)BK>$Wcv=`&%PODIjvkq_t6N1(2IMoG;&Y1jQdFz zqxDLF5^q<9NxifA3t`Ptl|@Z=0yA?rqbA2$HRCsi)eLiZg(SxBb4AA21ZjwDx}pE( z!7fx65$^-1I26Yb;kuXDOM}D@B{ZYi%jtPVW8aeCjGgy$*KZAn0L<*9704m{3Q4{2OR*F3BY zaUWvRBVjcu`X}CexPUvC)}ILO!bCZAwl%Y;Qz>q^!RJ)@WCam%bZwFcCtQko@mkeRN>Z7lR z3hlkmsx8hIxZWNOZ1BucQfJ!#ZX%F1_;=NASahd-0aa3i4UJ7p(WK>99M)z3=#4P( z)IuI=r$w~W^jBHxItM=__tZc>N<3Q+IY}M;$SXD!H_uw)V_*xJQ`1*TWV9*ZF*Q{; zkwai*8srx3Bm?+j1tF?C?bCiL3PUTVnD$^T402cRfY%O$sMj*o~H zL9{B88u#p;1vC#Z{2m$v;pz7C*#x1A<2xLiEfm++3j4}2?|I|SdIWtzRm;3@?rFU6 zBlq5xo@SY}YBzKU%dR*KM@(ovmTQ{DLd8jByaN2BOq;%sAF67K`=Lte4Jw3jIg=5U zQ}YM$y+mC2R!+^W-N_%Q#byJb`Q@f(nIP$nY~0mDMT!-f#Kn?x{|K1{)=BomF1E}! zWq~Q_+?!1h@LEyu`@qcAtNhx(ero_iRKg-geZCN@m$h;3r5&99x4NU8QrZHa9@L+~ z{WN42?6&v03Z}aUun9h@76~v$VEI=^3_j*tG86Qvg#mr%$ zUHxi{Dy|2S1-u$U2u)8LS5U$M;k%NPWnzse`Wf!HTdvxO`bx-8qm5K_w!wd~pGw(8 zwxqFL8C;aVf&utvH@TwCh9TAJ@k@gv$9kEs`LRix6o-%kV}vrB2H}hs=#rKk3z9$z zGNStkZ}*xO_8nn28QyWhb??998f5OjTXekkO!6;2_Aj?|U|RPwsqs>a>ct?Zm6#Ct zX2SWgb8S~Z<}ZeZ-N|H7WhD<1;P9n+XT1p>>w$|oK0VLG11bbP z=)~aVM=8qt>C>R8i-G<4W1^i#uM8&T9h}?iNHI3}4W%0=&JAJqlJH!S$cpy!is?+< zt#UVbq2auO)@q+Pb96`d=;0k~^>v=aJ8z8bdb)oeKSoI8THvQAapAdn#r!f!@M=m^ zg2nz&p1SmE)l?j2Rki%|%5T!8@|RbXjCbIJpU8u=xKY5>GiTe>=|%rc7q2=pLCmQ1 zkkgms_LOJG+10z0^7q^tc!24es^BR-xprm>&}*tTX~0<2(E8kU29|)kAlmkPndwp} zF?Vhl(h&vi;-TWzOnRjV=GAfIxegAPm>=Cs>q`I|yKaLk;lWzl(l39P<4-$!gew9C z0e{xz!^hc&+t2K=QV0sEzZE}L{_eDH%6i{KTL7%I;FG;E z67&k}mpjhM^BQnpR@Ds3W33R3OL8!piMU3FH40tRj%JkNC$b7emPI@Wt!PKL#Rw8v zbsM_fmdm^hNBFa`eDUlyBx(M4R#W0_uhT;0)!SgP^}0Peng#6Hjf8Po1<^O@@~6BO zt>#jIiy`#4)aL<>`m+98?;S@X2ud;5n!p~lnFA>N3zv?^p1Dl4r8)j8NXVqy?e)Po z23OErfZFzQI#d4GCVmd~*(&p~&1aKL^_7bk3n5@P9z}<2ox}~ZlpT8d5(MTwSJI7& z@OlR6XmD45g~^x`>CG2m=N5EF)Z>(;Syf61@?qlLQE7K>9Tyvvz_xP7k=F-0*V&Z) z7@ZRC`&uAu%EX(=$NxP_{NMXI=fX#7;KVqsjW^TRBS z1qGQ@-?!XN`jovQoflKedFDt+o-~UElPvPPKfk3tpZOd~)mJFrKV`p&Y|k1vTZtM>nRV*InSMQS8?#oh6 z>5Bd^sAey+K^ZJMYn)dUvsX`=Nx~_{qr&d15{|1vE4sK!)|uKA@hsk~h#*&{vLfIH z0un;rA4h0t8Wv8>i$m`hq;n#gARFZ9t7lH*3@aDkclOQ=s}F!bj4rQ&x}QDbLWH*% zCNFWioRUMlb-%TMaAt#cUY72ZsV^BW3T(7JZOdykqyC zIjZsN)bbZT0holh9T{6MZWZWFMqzretW7RM5BFL@+e?q{QIN`vR-2`etZVLJm7`Q$ z+6~*}cEfuQ-xNoNiF;4=eDrF{x4;`l8LvsWb{m!(Pd$!~3w+Mq2fGZdWY44choxbS z;1Q$eGWAFb`rWbN!c7h=S${Bwd8U)9lIY)0=gdWCf(!cEkW}x3KCX5$F=u*&CooODlouoJG++8}zQw{$4xp z{B6mI_LA#(xZ+R*$k7j-}30zi}hc-yMOUbWLQi0Z179j zzH%4m`h`)E{ds+@aq{JBx3SyAj(af0CC~w@ms$XU78y6e|*W{BspUX}p@I z4JsV(rw8xmi*+u~#K9&@!lQ}*cD#)&EB#JV@6a_R%yX0yAAhVdF5O*2^N2DwTh_@K-$^2q1zXe(Y&Hg$9OcX%fV6)rJI^no@| zA!C5XS6Q{$7+kO30kgHDH^g5Wg)Kc}dLcMeR4 zWsr>s{JDi0zUsEC{mRazYEZ#F%+3b}z!>F19$2`2oHQuar}5`6Ywh>;YG#1O^B2pu zW&Ra?KdXsptctbRNnJGLpz0Twa;c+^xax#i?CGD} z$#38Nk{O2^i(`mvWLY)TyGd$fSQMXg($6>dXKa}htReIK6~v|;X>kwo)K9-iAX{|1 z2Gr8RyiJPYDSsEKBKD!R_?EQa!VxJnQa$R+q`2P*Uyaz)V-h-{##!NiV5~b=@uQ3U za~9o(A9>~4pYxJh`5pTrP_4k4Sr5(onEs$ z$n~{`OLCa)XrezI>*!K~b`5OT@f_yN=#|yz?e)B(l_Uv{9ohZxL>@ZwW>9YBr_@k8 zr!1-al7VaWebaqEn(Bmx+K4@An$fpdy^@OojV+C-_WluBG^(}vSG z&t>>zIv)t{6}qXEGoh26CUP@oG`BY$_lvcWagLL=M>!e&1?x!ccdth~&QUUMhfc|{ ztYv}F!Q@N3lt%U$*u4^c_UpT0@!#hsCMCvg|GcT{UllU`Tjh|9zLOrw!sOg8^`u$+ ziy;@!pmT*#YCLuLvmeHBQmiKE3%z#Qh+{bGere$yGr#1&u!c-)yXZHbpHkaNYLfp@ z4>Zp&zclQUe}h^&qf7BvLO+kolivzhSG>z+wpX~7BsNI(hL>uxl|EbREvd!El0B>F z+Q+%wm!vKR-u~Z5t}dnD+?9LS+L~@5z(nC^KogM5)b7F0du1M7MHT%YM za0VOS5wPB7O?W)L(MT>J_h#Clf?a-T9|J+$R(9J;aS;%WSN&;%E=h*_NgzVPCLWWI z>8sVZRN*rZyYbM8w@AV@@{9|(I8070^Cz*%{|Ui+X=fPg(D4;7;hKR1f4H*3;^5W% zbLJMdT!KEic}3x+^e9^&WL6wr!Ea$ba}0;!685PAn5U^Q>_nkn&5=V4(>Jt%42Qq; z?nYpKZxG8~0HAWx9+em)!>7ivGg|>QR`>YsVF~S41xE~p#b*4x>Uvwf1m4IKY$7(d ztALl&MDI9eKP!)f5OztH-J{e#=(fvPdjzihgbgy&Ei+1z`t$oBX!EX4(;lEi)iYWK zb*Or>>>dp6Vfmco6%4)um!bs|wMv5r9Av()Ys(uj(7fP)+4nfYFHsELg7PLYb>*RA z4pSR_sKs*BzQyI@lUf0ZlhI4pUYkFcwGF>sgy=A#pD-(aYY-5<>m!oVK5tseI;`YW z>Fi2BHafLz^Jy?tM!yd^9AxSZyP_@Ic|IQG>hN-R^pHdIon!JmCA3yfE`F>IXxpb4 z&pamZT0i&Wp4~VH?bvuUUJMmY2L_dYXp?J{2>)bh0Il^*`&iy1*OWR?MwsDp0zMF+ zoH*9H_gypx$1TR7S;zaOCIa*G-bQTkpVPP*unM+vGNm@%i(~ne{MA}Nlb*nIv|91i z!LiI`Ae^wGYj{J-GzTBH;_VvsfBmN-J%>DIZp;)!cr?)QMhVo@B=?dOV zw-ii2^W5qW@Q5NfHU96ShzNDt2Sm(8KySGSc^x3{_Lswerd8f5E%W+zUKhcI*#oHC z7XvumAY5?KsvEieA;X>Z|*=w>xv9A4?RWuaqf&)LU^hXB{_u*Puc zxXVLp;WC-`HhzSrM%(6%?TY=4Vssd+yX-2^MwSTf!{!6@4pS0mv)cPs{>-Kd+PI+l zQZ3kvP=C1nB$J6APnr6=Srde6USRtblyi2E+sbW8SV4!{z1m7=mLGs)y_PRucfnPC zu(tx7{#D`ka<_U?2!`;=w};4xk7mtCd+Fj|aZ5;?_iSrN8e?qZgDD%2fBiZpHK6To zaev;VJ7$-#__t<}Z&0zfDWuV^i~We%9NHXfK=76YSzxHV+2GNQCb2Cr@P~_zm?^cJ zGgeBW<^l-mrWsx(*XCj^#4p`{Up1 z{TQ8!SI_PZ`pK@HaZ0GffiaK!8sV*&Nl>9jH`3JXpkLZ#(O`PdelCt>;O7yRO)l(^ zkf@^Z`^Ja}LI6P$z{4?C8;JOmZFHN9+=7Mf{=xb((shSJ5|q_>By|yGx^JEguEC*KqDu$&$b>`KPO;fkIxD zd^P134a0vwiF<~N?2+4t?01t0N7PTk2*KZKX7(-z0I)Jtz2fsfC zgK+#e7V8eBe_^_qJ=d$(j73fig|Pqx8|p!l98Y(h!FSYIcufNzv%y$^Uq(>8$T=DB zU(u~$e&3)t4}Z;cb$Zm$6elIs!csf{!GG{$5p@B|SoZoIGF*|T zp7Sc+yjMQS*!fHSipT@D`jz7iqs<;2?Y+te=Y~Jc@~GjD;a(PV^sWlw*pSRkIs=Qa z#S-f1sV)VYR8Fvlz_oqPE;|>+-R{~gIYQ0RjBD+$rxGYdP2=#6qBqB-QO!DOtQp|w z+45tG8>{i~4B$}v7qk(D($1EV)b}H?UuN$D8;S50P&-!nrDSJ@-?~wt67C*u4nM=< z$_eM%R#BFsCg|QXH5HT)}jvz&K+YwyPzCGo_0<_MIUBA0i(c9DNzrfT`a9Wg1=cd}X8<}CQnKp-A1Wzw(K_!e3XF@Y6uQK@ z#n@-;MJk_)$1nu`aiWmiE>r#XaV+pMC-Zw%n34KxDSpn_jp4HxN{wSgUQ8+A4PCNi z>L$VoX@9N;E3iFT%G)WxAg5Pge>4O02Sw#}E&^&)oiq?%br_YI-%vu_9`qhL` zzq+bEpIABUe*IOaj#kKhByPn70nD~U_j~pX8NEyB$TIAMlpZ>F9qQlTmO)vnn#UuU8Jz_upyPU?s31nUA;IfNV3kwV3baL4?nj)3$!689dCG zJAgv_)w&7$=J53py1e@b_(Tz46JPf+935iLAmn;!`ss-9h}~l5n8BUBb|U0RxMbpo z(fkze$=p&lx+NdxpmL5bDf61saAhU+L2e>zY~LJKdckjGXx6z1LDv*e#YHak2D#&B zh_O6rEpZY1)R%(G2lo9I^{Rxu-I7V9(lvB@SI$rpp^vloYI?D=I;~_+tB;KCXJH}p z9NFN@@U1;Me3lWhmrj}y5e--1dSqX^eI2FTB{wX{W-PL%>cCG@Vh9O-0H#O^Cg9ul zeKNb7OICk87g@X2?d~w5nsXU7CF?{n6ppshPA*&sg?KAak+0u=Kv{=dJcE!R*l(LJ+K|p;wy0<85qPG1ef-K(p2xtr68viGp$Wu|s zTWN?d=K_Qut5=mja>3nH9S|KnON!@LSjRP^;U9xB*yFrs_>BOB9wg~JdCzuPx<=Sw z;#p_i@~2H|mf$lbt{xIIY7@UV_sUyoiD#E+Xyg7a0=+pBv?NCZYD(rKOvo^}ldmyCjV{Sbr_FEknWEfZt>J4Hl?+T_(2#}Otb8=5`KV67_s+Kzhx9b#G* zM0^BQ`H_vId6Yt*OqBBTLhjcJ{j553&5PHis-DT|B6v3Mjde=Y$3b;kV>XCW4 zz3p_)T$WWDI;!KDqonz^tVY{7aIa%Nz1500N%If7UZCMO3&q@AE`OzS^M72!;d7Ix z23;hkHYvQqN3!%X?jdUNt$!*HT1$P_u-mOtm86w*b}prgjbp>}Pi$WNaUXIv zS60A5<;;F9r?dT)Rhv@h3{nyOWfR=$+|FBO0Y)huzwL(vp0_|+WR~eal;;(H$_fYC zq7c)+@c~Uv;JbyS9QU$M!#2C zC4@N9EZ)x%S`Q@TH1D8PYbC+^n{D3cvJ)hzSc zD92Nlmj`o9gy0oSK3(n~9jfNcdvqJ}%lJmXr&qHP5k@LYv5#c*Rh)X-welZSiW~h2 zHEzhg3{VB~7Kvq6OHBU{>fQnRqwrZ-YRM{d#3lE|8I9suim@Y>XkM*syRoN5anPe zYLk1s>M0($gP6dVKl1iCbxP603>ZX=RYE`wPvP$(cUu-tx^? zPab+mUw3~Z^^@xaR_fiwcuTb#@gfhw6CYNNen;ZV8-tYmSM`;shOq4R9j5&ClcUdl zsTqbvhD+v8;((Xq&Ci!w z^Ddwn;1T|94)7Fc_d>{OHWa`RsQTtq`h#BmEMk*C!8z&8LnidR@(qd1eI2qVqE%k@ zjv*7BJC*@ie=4+v!dJ()oix*?yaxq4#SAKGjz)Fk~lqcVk6f4P1eeB2?N(A zA_`ovUBRg3^NbilReN!`;2p*QVou?=y5$_EKdd9 zX1i88It8O(D@5wIioK`Ss)^mXvb6)uXyb3N3?X~WOJp$sbIPV=Rodfw z7oo|q)9(yjeq3%k-wx`Q#K!tXwP216nC*?9Wz`l&)-xPuJab`_GeTAhk|$-rzFtlC zSYshpv@EKSgM69*{*s#F(@#!KrqM`atH;eYqvtfUjc;QO#vKjkSD2H>+$JhG$k3@r2NxlE-ha!nnLY8Ilpq17+HpaL}OGP zvVT&UoW$nbX#}yhsZ?7_4WUHiy71oU*D>)_A*Ik1XiWo4C-Cu6x6pLzT!nu3>-gI8 z#2jIgx9>VN;bPmpwmmVn2Gc$5| zt%i7PvTYn15oTAr*#3Map}gbZeXt{cA;L~9Jo(2r*3?u{&)WcI>b}$4O8^Mn)t-Bf zE8rG(<54T!4c7->(;=8^OIX?IMVqyDF2g+513K5u4bllUx8Mx$z+v&HbbTjcddyqB z0)Y34c{Z>IXuK~@DXL@|#9JSC82aJ0^W%YNb_G9vh@V;Jb&A28)=FG8cpU{mi%dLs zM_@^%{RZp1MODXnye-+YiAJ%o+*T5e3#Tp@wn_q~@aE!ue=<^|Yf=%437ZsPL8l?? zj{Kbs&C1I^L`HlEYolmhatV!{j+HY#uWlsPu0KXEy^S)l;1sQ$iz=lM#I2-A3Fjwb zj;;Ly4*u@SDhS6k2T!KMBcy~+-Wh4A91s-!b>_ee?wl}VL#&-Od`l~0YPnF|!$87> zOM5eTKT3^rM!KA%ojxtW=iW(f=BtEoiGEXxSLayg_)_}TE3qPnOe|gTMwg5H%xM%j zi6X*a-%u|vP(pAwYQ0pVV%ot)COyt(zz|I2QDu z8fFHxyOBk|)}PjFvWbofg%a4xVgHu)db zwjB)RVn0=79K_ejJiwZOk^7{9LC?HB&bJnpl*m_{m60xY30S!45-dQ*m!NkD4`l&C zrq{;XuxZI)?x0BC*kyh`JJ?gN&qQQ810^7SPP=RJ$FMKRpTrKa^EutthAvN>e zKN1?i)dixdoREf*yp6ZM{R;C4Qnau!l?eH2SHKo3M-^Gm6(^m1209+}25=upooZ>8g@qG3%fiVs_spLb#252`os{^zM2(ToJbY71>F~X= z>8R7j{e9M+5#Jb~NOgNmNzzWu$kK<+>`J)1PqN_>NmZU;?w$M%sAY+wg2>U*AmV%N z+Ce5=?bpG!VMLRZi(-*x*wYfu-~ds;ZK+^(f1PS+bjFx%*krh5l;k940lQBuy_%J)s-BAXICvtIJZU!#p+Z-9l8z*fH=Cs-%8 z%;K1tC8Qf*V=t=XV)XjV)y*s+{{yUo5nr)4S{z<=QrV@sl<2h81qeskP@0Y1EOFFbSym@b6lJNHL7++Ov@%Os^dt1b-0NQ zXO4~q;SB7}LU$5q)Q@CjBg1^QTkRhn`qvkL%|&$PR2}TDjGPTdOY_>cy&bu8>~$>0 z{@c!iXE{IU=}*p=x04^y6-zw>HC%Y_=3_@*XF@!mFqmO(5rwJ?q}-48wSBE5bdUDe zSw}))!W}*}=9k-I(R*K=MA>O7H%?9!D3^my8}J_o0tqW9Vx5`rsE+a)wNp-a#YrUeGh z=sAxu-SZgd54oN-sjmpnmlc2>2+=jXmRw41rnjS0G$*$qZydVHTF_0wJ0O~KG_&Jg z=5~N+%7Omgb?<{uG(x-&r-L)iivKv@OczR=;*muxnwjtxM74X~PNHQI>$z)dfag>1 z-YF{Ae0$Sq!F|&BK??w&voDZxrC|9U5Hz3WO@A#Wo`GS_zaBe15`91?!a5 z^g(~uWJrBKL6~Go_?A@4Zoz_kf2R`8E0KPkvA1vX^v;N4hd_nO! z)ihT7Ighle&mHagjnwgXQv$hk%BLuY$GPRynnp;;lINXw$nbaxcjujYbc#G*P`)k+ zMo+Q;qoOBaqwENcr?dr1IeIkXt9oECA;m5&ogzyNXT@Z>z&vI=&=qT-NHcg`XT=x_feBylDEf4ve$jPDeebuMA@)M#A*D>h= z1VG{&t0LlNODJ(%hJFTCis!*@p7X=A zV8fyook-z~b%0qt?Y8tOeo|dERT~^44YP1q@O|;n9yUrC(MnDHlE#BZH1GRql^;(N zUd0@qM5A^~3CJ?DBh@?zmVPiz9Op4VAN-nMh!G(+KfG#@JPYaJFinoj5ttjb8yYq8 ztZXxlR!|LNt2M2g(&0)tm%nrKn*TUJwkT*g7g-5eSjMuA8N$H3XNu$ufRrc2&p}_) zHOdT38SF%Bu^}`HTwI88k{Z4)Yde@Rj-4T*fm40$52`iY@|k#3ktv36E2QpYS!7I8 z_XRP4A_bGI6iZ1fGXsBEh#F*EN#J)zMi)Ls?w_ica>+X9Da$P$%Vk(ovoknx`v!s& zs`~CgkBR_cjP#0o_Zat`kUO8h8U!!FV526@U-H+B^&XkiDaVS;M%yKr!hF_rCmT=o zZh%cEtAW;P)Et2;dn1S0BrP745@z0s8Vk&vJ?DL=^XIb-htZ)h`(E}!WE2uFO6)&^ zcR!{E{4fVJ97pH*;os)x?iqgBZxPwao^W(F<`8Cv6+SFRT9W;2EgPjck#UWIY|B%Z zbS!=^EjO0X1(5Tm-_|g1+Q2a=ZG}5JI?g^|9ll0gJN<2+sYQb~?od6PSvf>=f~f+G9Av?q_NRN5pW;(&Y2 zbgz0ycn-l%e=>B69?`i_Hli5f4wVZc$Ys$VnK&|J(I*>^hf-9Y2i~)#Wk4M}=Yf`t zxui=FaP+BZLX2$l;D=OXO0YrMp5LfR$@rzJOcHa8SOF`MG3iDZ<5{H?C6TjjA}VeKNlDEO9g3n&b$&biZ>;+g=>xDi>8=q2 zPGa>3_FLry`Zf^hUWD>(T7;Q8nKB_nR^!BZC^{yRm_BRJPBu8}adsTr0FJiDZ8Z^- zE7gbjxT0HAlTTv~JUZ>{233-0^BCn-?@#5MwO#UP+DI?oEJf7Y&HyXNJChIwH@uni z?;dr#Kd}R;p9VgM=97)lVtmeNjy$;RZ9=actX;_}4pyb3LZP&^&a^H<5w@AHR_+K@=+p0CAiWrx(rUF;Tc%)D$%Vvu)pI;}Cca zpQW=eZ%C`R1iAZtNd=hsnvMKnAv8a^%}S+252S^S4VKa!Rn}VrwIbQ<&*@nWt%Weg zvt(R6)gvZp(ob0QeI}M*BQ}aahRKgX1gef?7_eqqmPqVBLwgXnj^^l0M)!c;RB+_* z6JXZEjAsA3(yo(C(?#w|D<8bGos~YvGg6PWwNXi!RQEC>6OKj#fW98$TAo2O{*H^s zj8dJHo%^(MBF*Lk-R^^^JW%&w49**~j6UA8a^O7QuWq8XpN6I1j^){Ya5lHZB%!|^ znVu?-cQv!H2x?!CM40>hUh`oB<&NXd#?Z{e~i2~o>BDHIU6-~7=f zsoPC55E+rd;RzHt7f=Kw#yGy}obn=JY;ta1 zn#6JG6O#&vgFPyMcOFZMPk1~0W8A=s@ZO)ClK(~AKI?x4#{X~P_J4)W|KEt)|M%9rVEZqfzXSNe46F?Q zhxmO}u@bX7X#p)e>|+Qs7>*Dz+^!m09ftOajPE-iKmT_dJ!uSqWMNI%nisN5l|iUgx{LVdy6akh;a~v7^S^_3?6cet7BdYV7__>bB+TPTqX> zCiRKN?P>Qw$QM`a{hZ zho5+xud*IDVu)-#nr{vspItrP#6EmImA_KEMObiMJb5@vZFD_|eSF+YeNymy=$f%v zbo6+l@sPK#V`_UMXkU|Ed-0_E3Mg-iao>X0=uINz$0o?PT3G$gLQL#c)3h1>MJqd`+&uqE1lDZgqv4QDoWcZ%R!;8U>a zxiRI!+LLNKZQH?JadwBTUh?+3V)e*jqcc_D=+;U9_6e{yKl$9Py75Y$ip#CBL_W#3 zqvVr|g}mrJ)dGIu#eF zV{w*wuieedVGF2^(rbV5I$GcD_%Pt)J49X1umg&koE*YSN3!0}u4eBONAE^FNK!X> z=w8p9S*nzW=c2aLb}w@9`s6$B4MxEYFG+LiCEL+-4MVevJ^POwBB+f;jTgk_%)J^g zSmg6=Q=j(`Ax30Br-?v;r!4i-uC(cdz98>}!0#ygJ10Y8hM0W9tp7vU%nhY>dU_st$xuU0SYl$%qITR3kI zmU$%X)rOH&%y+LEIBTW8^0q!M^Bk0iDTmVp0iX(C7S?*QOhiC(I>dku^R?muSNzVS zGIrn&tv?2Sd8V^|v&1p9J3NjGKC|nIBBXFZi*Ibbwz&Ok^6_!E?P4Mgh6{$sX)-qk zp%898^A>Z9JbEo6GdGy!P5nn@l$r4hSok0!kl4R-Vdwi}6d9BL33w*#{Q2t6(V=2; z7vKX`?B25z@?y%DLK|eI=r@t%;Sm<^k&D!;DF;jxD^t5VdfoTtW>`~h9uJqkta?MC zJFi2av`6)zb;n1CY1>Wr{L^MpPGZVy*_bChAs#dTsN?mXQV3B%qM#hg zQ1MasgzFDymTydJFpq__2 zN+aph!-&+H|GBSn@;jx5myU3j2vGZz4;5ey^_tXff#|gYP>>LY(!&cVS?wotzE>h1 zG?-7u*id?2bB0DSas~9&Hu%h96n!TR6G;yu({48`1m^o&*MU?O`SI7gsUs!hE*4F~ z#~GQP7gMDv_SmMc7SYs9Xz&+sQBltyyHAe!)Td91_b&XByCAJv%kMtpqrT&6POLs@ zE%94hagXr@tDze>`dRT3f>kUVxkgUW?jCBXh#S?Z3vZwO41Iz3)14jX?j}Ec+8oy; zZpXI_J1xtOV34D}OWlkQ$!p43kRQ)HlK`7#2&s0`!!fOlhGRbv3zruc+R^CHwsLWF zsHxhxeC-V-zpz%f*!OYDsrOkAJbR#$FzF2W$eY(T>hg_}MfrNO>akg?>e!WuZ{6Qt zaS$^mysu#L)WiJ#=J5M1V(7z-+1YLT(buU8!{wR8quM!#sVJK&|HzR?yNAr7&gHYw z&<}2xDwDC)384=<`fA27@2KlFk`SW}LoD8^6Q}i)PGBR>;(v}XUY5nZk&#P-^%K{{NY>4o)lyC z^Y{=wXILEjN-Ir~B)zRuR>V(G-yf3phPRvD5LLosbG5z~b+QCa-yB0x-8Y>r1V|~! zpuAi%r%Om@0^g@`JbW+}Mb` zw30H%UJ-0jYWC1))&97r!`yA!78=0mE2QCK3~l)tpe=UF(l4shn4IZTDki(dHr{}{ z=x18qS?j`@f@x{OT=a6HBzgI|Z%)4N4{eZa)3RY~v-^ta&26`kL+`{)mkJNvd8SM{GA@z^Y`9o{ssI-k|6stxJWAkY0QBbuBgnr}?h z2Lz9HRtju=6hOP{;~81zb>bKdQRLv@77mb=AmY+8qC0Fe z;bVLhiNykSSh5RD)NsT3uDBl#_eL8nhwUt;hSN;8p7f`6-p+gVK=kdUJCU+mj?&e1 z;6v3>x=Qmg2%UWw%Z->pX@rsbXB&4jyebZ%4;s{VasKW-QqY05XN;$MDX4Lg_aEZH z-%lIM@VFq^F>wN%3g)0PQO;$3!l|6LHLXYpaNX(nVM}po+0rBp&$5{CSZL|ZT-((K z4ledmpI7juB4x8-AjuK-G`(aTno3k=R^D zePum+2u=KMOMm{%IU15LynnncCX(zuI{ZeBkSdkBt<ep+7W9^^vINnTj5|1~sB ze(}3*nn4<&tC+LnhylVtIMz#h;(qjpxE*&a`E7m68y>r^Bh9YzdqgeQcWSW+v2wSJ z+>4L(c*Ch9t~8*%PX_A^>}~2VfOkE#Z#0Vh zLzLr-tV~cCYD@u1R6OMVp3XLi%bsk#91LbSrpQ7F|a&l2db8{M5^xc@_hHC{qd> zyfDU=(u$0)k0?Cs!?6P5CM<7W!M&$gd0(=wT~eaV5%H*boGAWSIo5*c_-(QTzQteE zK(n;VoayNdhx=6UE$TIC=;xd7DK-VoIXfaB>2&25l5{{Ry~-&0p#VZ5a;q^vU?|W@ zee_&-+9#e6|9OELonpe1Em;R1*MvcYd-z-%#5On{qh#*hb#L!o!MqFaQQ67QLC%YM z#Zz)5(k-~tEMxwS&_Em0xH``Yu1rMFtt^RphJ~B&oF^Ejclr%Kyv`b{Po?O|3IRvRpJKD zQV7XyKT#M))nPPLZD*b#kn+$u?5C|pgNRIzzZD8OKK0g@IoJ!vtZ| zQ5DD5{Ef}tj<&R3d-LWZUVh?#r;w=jgN#J#%>z=fYY}AL$KPT=IQz?l5CAv<_+pdW(|zRvW2(2_`pb!{NkcY)OI3c` zDYR1c-}3aFo|50@$w9InU?zz%@mnm_M@G0F#$X#Ui70pTIU7Ah#1ST9bInFBqgYA% z;|mI4_&J-1;n1@K8RM_lrV+jsaLu6#sLsVzGd?*2&$(}w*XGFES}kY9og~H8q3ii% zc{NNH3rwwsZtQlkWM8w`5}4<1m`^J0xh?c>ZG_8$6D8S-Z?`EEryZK-GfBqB4l|Un z_up+sDq$C*L<(ZWw{*HhU~;qUC?33ViY(W|Ethu(`eWLvvkZrAicW^%4n`+*iRe~k zl$gE|q*bM(o4&~275a*-C>?7cy>5FHdEQPh8{ma&e!)e}bU(fKiE}e3w10GFv!~WS zeB?V|k?ZnaB*G-YKZdvM<9o`GKL+D+P4jjnf)l)Z^Nl1L{qIG|kGj*{hHE|{Le5oiLO(%!sX>lIUlaUnN?5`|f<|!sLH=8fCsq4)7 zdS1P*1R%Jz^kfq3Z)e#Fpk1%M$x?Lyqj}(C8nG#IDG~g0!A)rf}2yzZzb}jLTR-6-j=)*qPgxeGPS$UNKs$dyrl-NLEa%_O6 zbyCan!T5q;m>5xc0MBQwD54Dy^@RZo;>r%StQx6@CJXr zz|7-m;@y65t#=%`4{wZgUIKy_1u&#G;gIo`M4v*P_$04@yW)?WD0pDm+w-f9Mxt#5 zUO~9g`Mst_f(@|$iGo@+D`bbJ2b^R;s^gShEx_#tt*Wq$Neyg|KFHugogKX#3s zx_f(ALRKARckIfW55k7tTPsE?}NF+C-=J-Lr zKTlTOzi&#taN=ard1J6|g;iv{yaP;q#ZqigVEMoUn`M`K#r2SZ<yy#aZcpGdMNxHEC zOV6cDOv86+?&dOqnSNp9D$ePrTsB&G65?K=b&_gIutxh5H1{c5Estw}1qo_{U3U?m zsO#K|tEcZD&Pa$LMnE94T_WbUu8}tus-v{a!-wuLcV@w-ICpl;tJo}Nql3$-OT&dYg6HX;ad3LUa_+ zs;l(TNNNHxgcJ>;K$VGpMq)Vhin?VEgLM>F_KXErN}M*q>&j#84JLIiE8ou&3NS@cyh;S_e-Z!3j&B7HW{@B;qN6MUamo~_~ zox=CIZlTj`GK9SCIO}YNEE&g@4fWfZ(D^PV^b#rZsPLO;pOYy;C5O2*)^YUg3wGG4 za$!GFV^2A?p58B$B3;W~&n&-7@+|571P!W>r?*(3`@N95apq^DJ`}+Pg`>2%5For? zuiuQ$d;4(Rd6dWHeB9ZqGto=aI8)W?5@8|WXY)tKY;m#xQKKUFqu1FjIUIrFz1`(6z*Jeqq2fq2hep6ZjBP`LPN%LW`Uo6TU#GO{7SH z+00uU*`^2pWL$!xs9uv-^m2KBmueQyFh;uEa0xb_t3*ds?SLN@LG^X>-II_jDou*g zvUT|qWM-{V9Sl#YSihms^l-j(@I6(r#EKAD1%CXVlF$FsK$YH*@rEz)I$Qha^+SaG zQF{T#0o3Y;WV@=PZu$in;U`%y^7jE|%HGJDt$2*?kv|@H$37(9AUIeVU%kdUsPMmB zD7b91433i%(;jcmD$YULBsMw`2ZyDYQN`NuxrOW*cAobua4kh3))lRrzz;*xxlZhC zGa6+dOO4mJ__!K+wocouvi^vzna}j2AaZS1MF3^UjXI>=;-e@fifZciTLvoGAivTT#r@AUq;M#f{wP9M+ zk&#Gu?taU*n|SmMMfyEcS_%h5io>HK#?_v7P4J$77dBW&f^O9khb5#aNRW<}PD&0{ ztRLo_(zcc#J1P-NA><67JVGkr+3wXNOPz5?|K!TM@9GJSrH)2y@h^HCOgM5LMAD5J zsx4BsLvDIJlPbxt-Sh;@8P`3yrH^;jw$(4;Pv4Ul+>H0t=Ups!NaWsZAXeerxo{H5sL%kP{! z!k!COr7aPb7%1C7(jTA4fzRSS_vGg@GT|JH=XAPTEnUhC@i-xMivwpBVC~Rbl({Y+ z)#4~>y7OhUkj5&Vlt*H~)WWle;_Ws3eh5y}zSPwGqzHJqWq|qv*~fN2Q}vHflbduF}!Si14yzA%Ne0i zYNr*LVX+eN=YTWUT8;AaEBEal&XNSXaX@WR3^Iy=u=|-iIqAW7eJcwm@6ZCh`A+iy z3NS7g{j1lS7jLUyN|c=>$gP3`HN9y((yJM=y1q6%BT|{Lv{}so@b|4Fo?Wg6{3u)m z8d{|c5P9~z{3t~q+ScJ@9Dmn1Gg!-BhD<1ma6WA{33ten9MNvwvT>2pI!4jgfndjn z>-uQuH1^Qf^fFr3$}sxz;C}0_wM4SH*sPr`VL~E!`4!f&KLrlh&M}pZ4IWkG4P2GD z1r@tist+OxC?8-AZB3gBN0~6q)*Gh~+8P@Vd@zXYI8{TCAv#vGvemO<>r(%iu@2vY z$QzvG;t5684{#DUxO_nXXLORt)5MXI5(5w59b7Hlnc!>}Vd2f{?}jCU3ZIZhnn8w) z&)4MENRF$wN2BlnxveB;NaI&4u9rmx9T~XZAnb%=pw2+M?<(8O_2`1H4CU^1*}igs z57fkayT?l^lHLP(hC2-sp61B(H=o$#&!+~=b_K&hsdqQ@;y>^~0p4qP?f$y@D_^LC zkhk0Kw87JM9FXO>)jgWl#?Y-$T-qmPn-kx`0!s){fbVyE6G+Vj;hFpyeR@w5kV!ST0 zLX;GL+tr@m<_m-$I__$lWOUss7VE+mym3-V~2tw>?&+b80M^0J^ zbnj@4SSeO;@NpR(CB=NiivwPXa!qAEk|Jj-%oN|i3NX7cT2R%6He!SA)_h>w;-_5n z{7Q@5U=C$6B}F34$CVU1Ov%!&cEtIvcFmFEn~S}9TNIDCcS4;UfF#8ncWoe#=<#5? z<21Ir)|oNxD42M(M*SbG^@C74*N2(E1UrnT!O1)kX@!x>(Ea_Q+& z9yc}M!3DES5y7?{LU2#3#xF<#gj1J1(w2d~Un{dbs_GC!5nejcz4+P4rv$D%L?ES0 z(#Z5?4yttU3CDbr2r4B6Bo|#bO(U3%2zMhnG}f!jycGNbABZARSpw z3$eF#@UJB5g^^#a{Kk6^)?HzEbyYgr3Q}{32I&Ms1x#H6PL~8KMqAVDPhs!lu;E_Y zgUn>(SHRslOWEE>LdH>usQfhT-P;1+XTRimV;uT>|GHASO@xLl77j=T45Z=?*ff?k z*^)~4AUl_H3Ha=B7Z!_l?lKFXPOwlM`Tk1w+SLa7n*lB74NgX%bLF^-5*xR#DlUkgO^Z(lV&FHtXzxkN$^Z-s!BHmRApMdvl1!jUhXl>-`EhD|9LE^y%>AH& zl@oRdI^lZ{NIKS|O!IP?RT?{Wzj{*msT7HcOfb0ct zSsc5*xq>@Q7F)Gf;A-?uebnRP&S;76T1%K7g$6Axj6w(6EuGnS;!{y!>*Swp9j#@y z=0?WTLL!-W$b_Qw-Nq)&0-@{Tc6O2$Dq$aFK_?n@b-iJKKcm)t?S zJqtx)bojHR!6h$8=kl+kqfpXf@3zsL?0r!fkBd;kcT$3gWv zl|21)B;^0nb4dza48DnoOb*$JS7@MIhgWdG%9&SS;CopS8FMGTgxyFRJ@7nxwjx#q zRYrIss0`Y@D-jeYXfBDqfD|;SK8Z{#R32iWnMV)dVM~0@j5BijT$>p-QPvr`IBfo* z^4@kb3a+U)hTH@8$f)C!P@cY=aHfE@MWKbUr{3^sX9JZTW1d)LY`DJt){c0m%<37L zdz^b)zkp%!3xk~NFPTa{3y$%XY6iORt*4ALuho1S+$qn+48A z#)}2w)i&bL1=S!NWCLTtcVc~XN!v{(S1xvJgI z%-hHJkHs4BcNPvJl^AIX`!Ufk2@m428`)RoiFBnBTPa{@Ok9MSD1tM#1vL6chM9tB z{RV-d8_gv@mugWWWGEq})v9!UY^Wk%)cNkSoMAUDH?#1t!2IpVWrE#B+3V*u8Xu&Y zFobR26SyA2YGzUrC)2}EI|!~JTAK>akv3~Gq{d*zgYT9LApts8L_9+p%8VW%{wckL zz%Y>^UL(Nl{dZ(gUnrFkjN(~6oW zgc2@qgTHVu0R7jr{r|?j;Mc_d{|)zoe<>{h_`l@w|1Hx7qbl%|xs{Ht)!+6QRDmD4 zxPY=UB2;=d792nzY)fxzqG_yUXiBedZbxrp1(eja`SkVk?|*dKwpLcUW;Q@;D{Y{z zgN?40nWhQQ!dA<~P@7K2+*H%h4Cvql)G@TS0qU4*15KPvHR<#WO?2t>%&kl{ZRl+r zY^Z@>e|;k?2gp}jEgMG*U7)z3nK4jCSKCGz#6--(4x$IK5VJGTv$GPjGBVIJF#ls- zkY5=@ekBNj$^IWf^e4yPp+NKupnry9`jrFae-zZ;IDSJhGBMCIvHu0tKct%ZA5m4m zLH-vOGd=TPv_PhR$V~G;1nX}gf5&2B{OdOO4+&2GXJGva^1rZH=oy*+q7nW>VwC?O zSbqcgI~E8`&;D0E#y_~V{U5LlZ2s1>+t?awYML3+n_KDs>Y*K+{@rew4NT9*`ny|Z z0mFJ{mVfA$nf}3j?f-$E-<|4jNq=@m|0L-jO!NN>Nq?&NQxYQs_}7o@pD)wDZjb*v zs_pMGev4vcq=%)|`e#x9x=HxQP2zuxsNXVvi(+P^Xa5UL z|GGi@Z_)Ipir(w(%)fdH*bZ!rW@>0{ZD?)=+mZOD0NYYnYjS_4ur{-C;%20CZAousfZ_=}N()i)an){p;xV?IU(7J6pb&)*X`4PEa-2v-=MG>1;eoa3G`pLSpTu0ztR2#Wny5XXZx!f{kLt{ ze_Yf3JKAqh#y>f%FMt_ z&-fQL%JL6`nBRdWtSoGd|EEBc`61c{X~Cb17H`nVo`1?ze=>)?lhL}oJH63G!pN@)IWyqn5l{IIS-pHkClaDz&5WdFu4klyWT1-)N+aO0pu z3JATixLH5#>S~(gZdBcoy1G1(adCKxe0o^haHCIEgIJ!JKRF|s^Ab-C1DBc}&Ng~@ zEzNneQtv>I!$7x7o}snatFnayx1%*z`lr=vq0b{VEn;xjHK?iMU+zmDi^l#~GNo^F ztyOEj!FxI{Lgm%hO4S~ZiST%$^g5a^UQz#ajQQ@86Rp8q4de0ZRr3}dE!tu7e15kZ z(OUmhdHWM)CkBJ@sTzZ{Ew^YarD6WQ@I)*y4`g3IXBQFCXNWhoQn{gYHa7tuuE z>nGJ9XifUb6Uqs@c@_2j6>;;33s$zWK|Ms%VT`6^_GTVi9n=D(mAB5gegbs&NJO5^ zf=D3t%A;#f*lYcpk*dy~NXjFt_vUCv4>6Ta4+!1Uu!Z~{->vnPvNmve@tsvEr}E8Z zdEe||r&LEAjG<{Q=2L9h6Z3Qx(FyAd>mbj+eq5*c!H8UEQalr^Nu_xbL}cNNdGXJC0(Z>j;>0u zV4f(Y3q=1H;KWHySogTX{b^H?;Y|Zv3Jo9kxRgd zmo@ezmQ<_oUrl88ooA-mX%a#kmB$ z6s<~(d@IRGATGsaYP)QeWpk?LP&d}+ta+)AUQ^o&IX&cOIn#wz$Ge?0jUPq_-fdFp z8XB+kGz=1{qKGm9hmGjonIFl0fxA~bbY8Q40j z2sDt-4z^NzMaaZ%pVQ;pCW2zjzs2_nOHt`0?){QyHj8(+8zF}1dk;w-Se? zU9LmOcjtRv4VTqdGm=uH>8KAaCF{he9!9d|-xF@YlY%Roe5mJ7&Efni3iFHBl?!WW zcULbK3X)^p??VIa`q5NYEHZo67K>5wL*iy}T<~-O<3xVEZN-5k-y~z=y4)lAi)lyr z=LL?ix}_|UEZunxi5}3@N|L}8W>brN4J{ub8oR7f^>x(@P+SBlci$40#g|{-3FB#3 zB+l_kw-WQjJ-mfSUWJ3bjD%_>C5$O+o6CC)*^2Oxz*#?Lo!1g z-SNk|(`QjLHn7*Q*H)T9?7MAo+NXVIaz(*U-qti`6ZBj>hOx?uOXxy-%za%Wdh$Tv zd1F!_B9c4mmX-(R7PO=8UCUc|s1>80F{Hoi{942+JU@N@o`)~0QQ6m!F@gCiXM-N?vYvp%I~ihjwwnPGJFBShq`8r8#wuP%OEX739b zKd%CXU!rtli0Xf+1Sl>8sI{loTdjjXhv%!8Zuq9DCAl)Bkx~Ex&ZQ!$*kbV884cSLL zEq0;#jI>0vi1dRMi?oC!;H5>bk24zM;j)F|RkeV3%D41R3Dl697$FkT(4J@nGB|vC zW&f)r;QTwnl)^i{$4+1nQB$viZ%>2#Tybeo{Fc~!vDWtKFAq3iLB6s=G1{f{+#{;KbyKZAGiP1Ym(Zs~Y+zfVtRsI!xzU|XT|_Bu z*l@I0LNYjhDB8==9TG4lQ$gcQr8cxt*!?A96lo5dN(nD$@<`hy9JYXK2b1lP8mNe_ z)+(aC%C*e_zMMi5?+la_JXF5M7AoajRJeg5hi9>~Lj0KO8savxu2FOMj7v6DC9sls zWR$Yllm&s8u~vHd_`1d>UY1XLM#w#Jy+rEucjF$aIVvS$3sVZyt$fT^Dv2WS*dY$QDZ-#tcEft=@8DfZ+aWQ^WC;k zDyV(`=s(bb&aFcTe*#M&mPqf7FL&0Bc;Wsia-bP8hkWL=QC}3MehTK|8OYT!Em-8R zE=nI?g}-V}`c8D29Y;8JS+2p&{!D%D`9p(BP$}?8ZE8DhP+0NR6_cWGy#|0;(YIQI zusk;LjoxjAd4_G`TTnNnN_$r%N$C0gi&c?DggyT)vE3A`b`eR%laMwI5wofoRF=v_ zmuESb1}?#@B0k&hKA$>bZ7&G{0zUmr&I~+;GaFn(!k0}Hp2hz_E0A{Ow{4s5UxtsK7N2&tb*AVdz2ISP^=oQatabYd>HYoQ`hW2GpMzTob( zx=RCv2}e$={bdH~{l0-sgH*#9i9lJqtREeT-txQ5>55M5WTJz#%{AlvXWx|9i5F>^ z8i)i_y*^uwr+G?!dLLlvbe_2;wBB0fDfRxnq2Xv7Wsi-KKg9_^oDT^{kKZIKa z=4<{g;v1U+R_gFvWziixirg*(N3-46_r8_{E>FY7ot6WUsR5nhg21G3hVhgKK4i@2bCb^ISg`G#R!;J_28Rl# z721m2q}C}I|eU7b)!Ed58d}Y zvsbO@d6jxa#6r67vNGvAB#A@{)f}*7ruH`8%@q~m&M(md9io83JojSO1*Lt!D zi3$Xe3fQUW(m{np;uDViw#b-!@6aO|f#1Hv;Z#|9qvEN*p5Yn!aam|GuTTvNr(3U7 zU45yVkhNSxBf+4eGgss42l9C(9!h(;bQ5e&uHxRUbdlgEtRx4Kwd=@;gAb!BCF%~G zgZ4fbUX-jeoU!+bFZ}{b11VnBWP$@q2cHwvk|tt;w;!@{=YR}RoV7bQ97zG;Atrjy zUJD7aRcTyn1mG2KdLzEo3iDWdERj8Yb?FdC5CbVNdERY_$w7A_`MpRr-p*oU73tIeP5YC>9%*bV2M(a*REQz{wMYroAH z6Q0gWl8mobQ#?Iv4ATb%Sur^@9WN?}=!9;C9u22iblysrK0uGaUxyzCqu_`h1jVJ%w^dXGXCk6SyICaj3qKisbe8DrJ$9G8BU+4VZVuFWJ9er6lm)Aqc` zeByk0d}><=7TG7w(KUY)8KRNdAr;`AkDqDl;PUi=sLd}vWgvOg8I01^7v0&|N_a{p zB4t14z-xTDrr=AXapiq7AO421B8PzbO+~HcWSIJo)FWWY2)}ZLJE6Ih9lk|9lNnq-0++ns?WPTw$xZvT&S!j_D-}sMHh1AceGfy?@bOWwT7AKI3bFK&o56)*&q~X-u@Xc*XQr|7sTV7BoMl;Y86$^(L zMy)kG&%;q4Mh-J?`*rAL<7N+?q(e3S!>?mM?t#9*sr`Svy<>1D(Hb=x+nhKP+nm@o zCbn(cw#|uczOika6I*YRJLjDH1w>|2&f_ z-F#%{J5Fc0slmS0%R>j}?byVVa&zjdG8_-6hD-!p_RTt6LeduC-7)8s^*LyMZ^O$` zM<&Wy;c3YFb+fT}>h8q;gg(0rAo8z`v=6fYZo67W)tbZg;Fss*-H^qxde|xvg2&UX z+_dNI;*b^kc=?qX7M!yq#s}W8OLso65o&WV<_dZ7 z&J;V|NXCv@VY8S+dhx1XoJlD4huir)=q$3HZ>Ah@fo`=&0u0VEzqV7VLIHV@fwJbC z`Mh1HLH8SJ{7}7%w^fe69189*i-G_d|4LpP{iR#XZVp;b1`MJ$f-esMQ_T7jcz6V}j#swmG^~5RO#?Fxt zoOuKJh!Mz;&AYXMBC_Iymr*Xc%A>2iLZ=QJ#&lIV{{zXK))GThOr8tS~h{yV(eG01%VE` zpSt_gP;&egO4vimkFUcNe<6GC5{=@+O9{7FY}OJE(yVG?c>>4T;RNiY_ItG6io_cp z1eAd65YMlT!O6%>na6>EzJ|t!eMT#UYjn;+xH1o%)!Oi1aRP6`VTaxmX5PbmebTyn z3QoqrIQ!lbmUqN8Cx&CDU;MoMFDNzezDt(cD8Rzdr|-S@~}H+5Jq*z zdj5D9wym7O(hxSq#=!l3Y^37l!3cfdGvv)cUJ!y}H~VZjW~>BqJz-o|^w^8KH&-)! zb4?v?+~x|AW-tZ4%V8AC{{L$<)Y3ANE@LQ@@_Sqwcfa~9#<9weM zWw`bxhaWbJ&?mg$T`7-}o^F9^)}MPaPt}%a54-BEtH@SA0UECA-(wgyxYJ=_<`%^89og z;@+WeDhn2MOy3<2+Ka(W#A@%r%+F94FO7j!M;}>ae+jV<_$|m_zz5FNa|mAQhfO;4 z+jUvcAePqnBqrU*ZL@9UbZzfF&Mc%eEj$X~pdh7`H@2XK1VmXEJ>`((m0{Gaw;!`i?0A1?V{`_F;@YyVMb|F!@APl=f2KkDAU(SPla#4P_&hW?HI zhw@Kp_|NFS8vnocKa~F}+5blWLt*_N%0H_9zkB`ZphSiF#96>EJiKdWXRz09;uH1tn-PT^R2nf4s_lR zXrs}9`*1)=o$m1&XJ3TQ$%&c!q!0!-({($Z!cn$8`wi360r7mQ$A6d=x}#o3+qud^Mi9p z$i=}9SD|N6&CrmJ?GG}|VB1qYh=5KUoN|oZ(0@6}^R};_LluGo`kR>3kn}3H$PHf#RFqGC-8v5h4CF`x8hP1i?~iIJszNmgjje^9uymtx(kVH8g<-kf7S z(_f2*KD>J+;l*YgwZ0{I)$>6CL;{G-6C+JP-_o)t*&P8#vthFke$4*K^;+#}KoS9R zf8y^CAmG=Bd#(6kAd$N8)r~N6fA*Dl_?-9c8;oxdWVIo-4;oh_<^IK&V%mQ;|v8(FaHLUMMXm%wA-H znZIB7JMcA+5+F8nK);(GDkaxzNe#^eWxuO zJ6Lymch1#;&$N$#j}V@b+ziqpCAUDv(kNO+soBO+iNzOy$RaJF(a(LM& z`xUStcrI(1!=^VOg;%1xz~e;fa9TGn{|NT?Ib7gG-HEh4_smUsSYqsE>?R<;tXNZr z4^*C9`&P?|&yL)5fc-#`1tVTa;uWF!iPi+2TRhC^$%8E~;3V1ad0SNAo6W}RO~2U9 zkFk66W^ZOS;#Y5=5A9zI9`O>Wyf*y^QG6V59kz%MyiQnpVt?T);!*2) z##=f+q)r00{o^y|M+ix=P>0Yp6@8s;VtNVZxBk4y#i0-Lu|09Po$P8bSb%|XjEuPrHGul^PXdZJo#v)fB(L99eYDez_a^E%|h~bS`dcnh-p~s~C z9_*>phoYJv!ukq#k~YlE2P*FFn~6EB`ux_+{izSxchr;!`qvzbu3JO1C z{z}kT1`H{d_cJR^l(dV^@jVqw$MZbCw)v8_rk1uLvs|pD$D3Td1dSd#ybR6OAvEJ=`vZd%OVXm5$p3Y*n zm4@dm4&)z94n0M(ho$Gi=Wl`Md_l@?{PVF+Vz(V}+YPa;+h!+MWcu(*y**1|xjqN- z60n=}I5y%+x<7wWh$^8V*|#`0ji{n^JAFF_;fwyR{`@g5A6p=SdrGO5vb0{&adE;a zyehidQUG5oXBRJCvz<#+d=@d(8L6T?p4M5UIvBIxVC&a>9c1k;S}l6?$lBv=%gX0A zXy@DkA7bZ1Y3815jM0^&T+Dc8r73Hjf(wZ-pOldqkR>bC&x819__E((d#c|72gq*l zsy0b?mgq@8Q9t5(g5s6))hi~MT`|<@PqG)F`mtI@l&Qo;@@LwgL|U2u+=!j)W{!T{ zMrJlIMXbbdu1s;1b^R+~r>EA6v|>q^6%@~cpABilO?)sx+TzP3$?dkr7ONA&O)G0u zq2UGn?4L|DRyoDdoFMLHmhVi#6q#q~HskWy%?z2d6;XXH>X$jr%qFZx5ixA{{pW zyC_=9O^@E8EUG#@U|=AH%qnaKT2uQwsJqZ% zG%u+NCC-I9lM8q(*uv7cLHBr@}^LX8YADyW_`w>k-182ahN7fabjN3lb+$43SZ z{;2EdzQYP9h+F7n55i4VW0%sr9abBHER9xHuocL8x}xvm*3y!H%ISm@Z+7l>d{r?q zA%lklMVT@rFO|GM)LPvC3=Az}-u=u`Z|>xBbu6|ov~P;9der1U_>j2^V?t_6tWc+O zGV@U?`hks1sN;BN29B5gp_`LX&*rbV$hTkZNw@09wrWQ>O~AjA7mPR;uC%@X-1*F2 z%dffmbOJiA)-@u=X+}@_{xsa-|1I)Q{lriyJ6KH1>@cOWo+9Y zCnqkI>h4t&-namH6C4Q{HxwSUX(5}8ModCm0+sTD!w2SnaUxPR9A z{oP4jP0LT5II!^p>H+!Od>{NqBRTO_wm%OTAIRT^ENAm=&-o;glc_2r6Mq-7D{?yi zXsxk8cW;2NFI#3CCnN5)ckRM)Y+q*jao2LJuEsKcMdOIN+O#7~&~*D!?DeiZrlOk{ zsGx>YO_S_WJ+y9fj&nSzex0l3PbEO;AM@Sm{<3}Xr`NUU@YDW&_t><&ba(5g@>;`AtCHKC8cm;;Y>z0c_30gcjF4TCLYDun1m z9}TjEkD+zHi%!G?Uz1RuJxUZyxMnm%qUlM3C*aVE$Ek%qwPi;U5jaTbEyMZwUX)|6 z$OKVGEUjy!${>B*XQ-Ypclv%ykmEly?W<15b2wog7Q<(Mt0wbacht7S-)?kzo9V9h z(%DmH-M1lSyt?DIQ-bJAVgM7&zB7Zo@BR}Ju~m8w6Yfpuq!xutsRL~19vW0%37P@t zC+g=wMRioidvVKE%gO$Rma1oSYw@!Mpx08tNpL~sSPCkMFz7+fV{p+!q_=`#wgXA)!Un zJ0t33ertY^g0~H8d49o$lV_vQv_Py9N)-~=3<-s_;p(sz`e`lbhs3d+RS`ec4wL7N zWk>ojejH%aQ#~f!m_Yi}PDq$3Oh!W&0#5=Q*gVT7n90m9oOpM$IHWL010Cc#c*d93HWa4Sw*GzRIb1K9z4O#2*;v(6!1aE1aph>FucQ$N5G83VragTfzp()x3)r;D%t zOix;e@UL$@aXgzef$D_bso*`RkPNJj?ju3S{RQT{z%Q| zwazfoA#Y<3xahN3YKq2Nr8L$BeHN?FG0o&*pj)1=SW;&;Z;6*@H7r@=U;`ZoVW@A7 zDUws_NmQvYkr&QUF_v7ZT)hy~f&>Xe4v3qPZ3~NR4*|xle2`w91FV+k~iOozn z`#b^;dL|n4qPxv~&0~;a@FkENvb&~%kclHj*5k_uY8xysxOar-b`LGLA4j@(x>vK; z7QbCBZ7pTM?sREwIf#4PfX#`*(U`QEmDg1UB^hvrjN)|$au~(GsqkcYtMz#qyaq@Y zgY$-ArZ8zi1>}e;PuDRe|NJI)gWUMx|D--)e!I|N!;_LS#m?L~2g9`*;$*?}Ie2Sp zG4{)!D*Gu@uQD`9FF@c=whzTJ7a@9c0-3zl?ej@hD*+JnwCH}svpakG0NC-Gg@5e_GWPNXogTdHPHD?^07(sc(ED6zymoPGH`vWf zCw5R8lv{R#Qgci_DzR_><-|GFO$kgILq>w_V}M>j0BRfmC|c5z$hL@SpN`5xgWRPa z8(v}>UmhD>Li*Z?Q9W?s544k4!V`lmgY~3G@5uDQ_M=6h%s=mG`LH%Z0>XC?=I!0^kY>J zH7Jz(+mc}81@y!!EyF{x6L92fs1&MwxI7s;>k9=QvZR*}k;w=Xtc1v%X)J&lHB^ zUHBAVykNZxO56E{JZDDJPM#8_90mBqZ+ZyqYylvJ-Cr%kT3=;(;^ayE@%*uTQ@C8J zKWKWXy2*N}dT0Px$>QgT@1m<E(?wL1OH+nZ^^9s>%qEG3~*ghp=F`2_=TNwV! zo)B7h#$*9o)%qziswp`uGy`V*EJAsk4 zzk(|Nm9mhj#UBQw9>gh`P)vZNdJzQ6oq^2DWi{#Ic&Z8Hk5g|+9GZT-R_2CDP#B^~ zWjeEasK0f!J*4hyhvk-|vd!%1P9_da6Z>05L1cfx$ES$*h)17`v!Zdr`ZRCj)8&y! z3LlGKe7lZ!F6?|jZk~O=KicARKaRd6{tUO-@m0B<^x`4;c%293^VQF|pY_zW%6od< z7+ae^7Nc=>Jh1Y^bf*v3bhR^qzqNuvD;r60zOIlMM!V^8g)ybZRwMDWlavOvI*h8d zkf6lh-9=?68kQjN;e%Gu87f=KNaDCDwDYP+^}iU9e-hiv=@OhBxt#%@e^34HW5sqFIqRs5=py#WcT0!q&uMKICujep5;>U4+f zcVs+MKLzRyx!Cmef$y1u`FJ3EB8ZLY$OLM^Das9AxHPPu8`)!Hd1EUm=wuQ{GGQkE zQ)F~#xYMO|)1{+X5n5S)m`))Ca`L@{eX5xm-#FkAcJtkH>;yvx^Y5Bl>i+0y_>I@w z)JL%HHbMl+%bzvv+V3=KNP}(AtZ3HY37G)d4&DdJ$*$-D+7&0vYz$|qh<$zwZHf|^ zMx~aOxuxZ_8iYA3;N-jf=2zF+Zu2x&yigwq(9^wqW(Oq;p zybu3GPPDGg_dKjri_EQ?S?9NY2lqVybo=Um<>xC||AdP$h4Th!Lj(@kmADhO<&|C; zN5nY(2#Ky%wc#=^?c38aDK!$|p(W1*C8Q<)({8fPFOR2TR@x_>mg(sC=!k2^$G#w8BkF&45aHZ^*7N@z*E?GU(Nv)3xr_D$FU z)OX`|JYuAqBEU}`U0V;ni<`O%q(5GVRG1f953I=*hz}N54O$9_S4UY{?7oe>dx4u* zVb_Elwi9+H0ib6!pv}Ic3zb&w3p?!i`Z_u?_VXZ9AgdaF+Y45YCywl$sTK1w#`Raa zgZ0Ir=HH*lrv2$e0ad(efhpk+22SpyH1~V6dY+~10w4IqSYv+K2yIQ8y8 z{LJk5?5t(@BI@Ru@BE|XtM==ZMDs3Gm#;Wy;rCh96=>)H=t2fR``*)= zo_oh9L;mhD2Z$XVQBB10210Miq%EXFp)zB;Cy*nQM3FHqTz!^xyL&;$(2mLT;Twd; z5Q@eyX22{Xgg_D2Ue@E~0CX(&25cO!d%NYKtgrOQ#eo}9&uIx8OwjNu;h_&3<@FY~ zLqQ!RO+*%w`6@WOPr>4qdDCSS4+MwE!yX?55$=_|9)UI452yX55l_3V7U19;UuH*n zJ=ITzh=0rZC zvVYP;=^rGgW#VPwWnSiCZV1RGpH4dUHYZOTlQHI;tTMitxPjnP4sx^Uh{YlC#Zfd* zk#0ms<5S9$Bu{z_314x_5h}7` z3j)pPaRh1gk%i|C+KAZd<4CdW2sPyh)o{n5W1PAY`X{^=p$6ve=gC*725nf-V_P9{ zjb(Xk%GH>gCvGd@#f;ZgtFrL~LRLke`J-~>TxT)HE561=3hRq-N;$=YvJ9nK6z>Uf zZ;sjG^2!*C?|IC1GVg@4 z{p6+Q#`}cRKXX0fdsX{l!@jTh&I!0Qsr{S}Bz|!b*%W!<{pM{xLzuG_+LtmZ2u-^P z2=siFFwp}&77F~s*xy}*7tI|v7luD+!yhNQeQ$JpV?oEX=rXX}e4A4O z7dI2$50o2U-I)HN`n~}px|9J+qJmb!RH5%qr0&HThm{gI2r~OYml$zrji1u$&u*99 zQ4E(eIh{G4&!w_SM!FwLt@`^gdiHMm(rS(9IO-b$Wicuf3A`&UM5Z5@NR3VTtkIoG zxnm&;{XSK3Q3t-|Mv#C|*}sdU*)h?=@$IV-D$zlZNO9Ljj=|O0Mi8lTZHE?$LAfsB z+>{7o+`k=lS*BAVUA#O4wwe1(emT(aJ9ym&dQn}mv+FWPU~7npmXQ?cCJxeJ?Ym+4 z@4r3%K%uNr_DbMS`(o*9mJjGTuXu4Lgqj^l4Ta;=}F0p_XQg7A4tvQL9p}3@b5(X;1c>q{OW#n#!|Ck z&2ep%?sit2+snnVleCn>X$(GU*(sr0S-naXk9`f64P5Jvum+Lx`*Tj6BMEwZ4NUTT zTkigbXV7=n{#x_CIga0U9RCaHY~Oplz-=8Kv%zI}oL0kG>yboT*>3)I@*=R|bIwTP zMWE5uhHltxKRD@eu%*T+m)~KwJU;UtYn*Say36<(O}Ev~vg00)J#Gkxe$9 z3s&W$Jmr0_`2oqq`7<-^Z1x>FBVW2$iv0@udl56@Og&NsD}OmT(}$2^>3hGTOyEKy zzVh;mxXMfN5m=DgN#$YqSNXbe?|7cO!gT)P@S?bF&~5B?D|7juPFdNW!Pu`WHK*@nhoam1FCMU1=(nqe=A;YCam}gi0gyDshd2 zR`Il~g7u7Ltd;fbx!J*p-V#{7umKp8nAH?zQ3CW!gUQ$iZwf?)552(Me{6!l z?2X4YdF}g`E;OMAawTqw31>S+)f)m{A-)Z{2WVuH@Q_ws)i6n2(!bRVwJ@$GEtD`_+T{`)w4>SfGzJpW#gj-nMuK(p~jA#td9o)N30%Q^h!Cv3YHBN;mIU$EE<<2>YNICIj zMjRQVaEd^=PYNi4iyM3Pm^AcO1lviC^IU3#UI{1^a!iQp>`Nzda$ z%&9PVI~&*x;4ZaDRfDC|6HSvy$4-Y5c zf8|u5#HBWccjjkQNJU)30kOhT((A(HA~19=n-2LeykXE`eTV` zrv7wDfb3Z3jun$vP2CPpjf&pRpGPZhn6zyyA8@aMJn#-{57}u8#37xkN72x(X(c6$MHjSQi9j+2`c-8>IH$v{QjSNse2qGR8leZy-r-vMWPsi#Hx$MU+=bpa* z3(KZ`!0=;~=s@70BbN7Mlc}}Y@tyyiG(J*Wq=7I(Wy?#DJ7 zk$|f-?ahgarNSwyLoT3fZ6yGk{rIa`48)&WCsaiz>4BX4m&-(AH?E!iR2Yz@5S4*U0ccLogy8fUtw=vZddMuw=vr?D@Wno5C2!;Ti` zNgi9lCUgFt&(Zb8^5uT52!E?WS&QTm4Hb{_H7zUY#Tb`UiX=ajQY>pkN4Sgfol?1& zueNHsh&-q6=etT-y<&FcexLKXOavZ3B6&4qFO_A(S1eQ=!iGgg4roj<|Eb1N`Vr2( zGx1}JLe$$t+_adv<8sb&zcw*V#}+!J#dyuHhk&W&TOM+CA6^oyPg&+Fthy`=O5tja znjp2}o~#Q}T$d~~`SYsXivn_PZ8r?B;D#cT-kz@4Wo8CN+2#kMDjY z{N8^gT|Wnh!*y(^Yvr^J&KuWlw)Zu%^1f%Y&@mZ0od87Hq1>LMp;l_kTr|oWR_N zhxq5LIn9ZT-#IJSBVoFMAz%ljXm58D1gY#Sg5<|yw1ec4N~!5w`3{TVO+rechCG-b zBRkCN%BT5}|EHz*SNw}WeE8Kj{5AVyY2~MY_h0)(hHsmv;(U~an@x1aL)x8p426y7 zJG>sw-8advO&+}|{|-CGWesFdKLyA)r(z@ghVDo-UfI^;e&dmCNhEIkE#K~^3^gqe zX2|qdxR-HG8y-g@?pwiGTf_-^`L^bOgo?U{& zs>}d9e*!UVY(n|-_oMof5~=KG)9>-`O`Zyovd>ZXUp5l)<-T8sFY5!o4)-bx3(Rr7 zlL<8h>HmV_@o&vJ_Y`pB8;Zofia;#sMzJUPFOMfC6c_MFEHNk%h{2i(e?%9yN6U6^fnk5ob@z^qjX;RIxva!`v7!i4`)A)V;&8Kv`=Wov^ZyMLaU+ z%BP7EGfw{O*nZ{G2Ohn|Px`0t}+SyTTySldmO^sMI8I(DPAvu>J*)p9P zVFEpgY~d%p8FZiL-@o9)MVlmu@J}YsAZE{kwd;LQ^BUon)q`v+hFV1lrVX>og>c`H zO_PvjH(^ozK_HX}IZPusu_MC4L>nkGCs~~fw4I6z*FMB+3^F#A<7zDBLj`L>PuPLfbi~a`Fkjo$a zarS6|y$qw$T)suAXb$fo!yAD?poMQFJW%=l_u_72Eu$nZr>?>ZPp@rgA;zGrU654O=+DiBAhthn=8 zmF3K9u9^M}%%(+=1Rcj~!7&T%^;46_O#nV{GgdXwZUJD8-_CKjcJ|5 z28Kmcd{~~#`MerhGFjyZlRXd%2#&`DocHc#hm-O*zGu#EpTkM$yOZ0r<3X(5K3{j1 zh39u5a)pkvHGr}?F~F|bMOKgml8myvN+hp239Ugh));Jvd1U{~dfEMQcM9gNY${^b zsr66sdw^9)*GqC+0rYo6>dFmah$!dM?2&L9!^=_uSV-#3TqT0<(2=Se4q@0@pOPR9 zTW&dYsS6_?eY>l?P{vr)iEyK^s+`HEDb}xxSB4c$ilXAvQ1_1=&$i^6veM`ITd(b2 z-;-?n>tdlqo0SuxqmuVj$(Tqnb*JhhP3rn2mW0$I48tf4#XPGYtJL-yrlm(*lWfrw zG=@01U@PdAZ5z{YLZ>Khf$Jo}pThb%JF%#j6pTsZW6`oK>nw1%+AhCBwz1|7e4j0j zmCOLk%PSj<$rlt#vXLgy)tC|OrUKMSZ&i=W@Ad`MPfG7poWJ|aV)bgNx5R*IBkZ;8 zVb!QYwaieRBT4gH4&zA|u}!*v`Hu9i?au8y;a^I~ydpP`|I(rWh*2~-V|s%SN~-nu zdO@`J{3aWVtU$0B(xpBs<~J|Nclb=;SsVaY!oqfgpMp^ssiCBod%;=tkC?bC&wcP+ z^-#YPIo8^lorDt*^feN2$hY9-Y+4h?8OcJ#3pGJpNVMHNsC*>Si zuUfsip#6B+Qr54~A#d{DAFON5uX$|*u@pM40HR)}uzL&csOLWEo>#@%E?leNGfHx= zpB(AZ@mNk2JL{>{j!)8!-I2P%Ryv>1%ueR^Tv}tXV;ljy@mWr6^^sIZfp7S@TriYE z(R&!rTfvjJV!pwNpdP=l^rjU2_yxq)oDaHqW(eE`-0xo{zhcqBU*i?X%3b(Cv^qkx zqCM9QLkc{(=rXYyHLld8) zf+%`X{fr62sfNwkGR^xt#cS%d86f@X?nd){ zQ`t2sfAvSNvBQS`;z(z4p6J4gksz+3LUXW*uoW`LjME<&bX}2#t|&;v_IM#8>Q!;k3V65 z!YL&f={nh67@0{O;~qxX$@i#+0~Sv~X)I-xAXr>RB9qakl!YzBrQ&ANFL`0beTEBU zoJNevHbPwyz>BAc+t;R>6SD7uvbVQ#3-Jxi5m+zqBDYZ((6T)z5FPQqbbi~fese|t z!1vFOO#1ZvYsWI^kq}w=PO88TI!ZJ>WPR7ic{^sV_0XmFD`mIon6v#g-hV`F)z5SE z=H8#I?r`!h_~Rk|`?wf*k_+fp@lXB!{e@CHBF0ny+ypFZot-%p&_P={|B zaXB=SajM4=R!l~|YusOM2(3%HzW6cMtQxah=c?l-C+Ku;IWlO8DCZi-OQ6pf81q!O zH2v3e5qFRDC+mh+uY9T8{Qzoj+97-lH#y-?ClQ26OG>g8^#Vg@}XY zDF_Wodefmj;KnL445^Ha`l5#NyaS{F?-l3HDPF_nJ{99M5f4E4*B-x7vy0= z6&q6;#JDcqx{lfh@wUU;;5n>#54{9kPN*W}+gJeQS)P(4(FrGLrtp(llkJTQOy?Zs z(_Cc0U8jgwB1d+1mq~@UZ^->6)bsD^9W8m_iNDTw84m49F8+=p>V3Or26(XT{$68!=3M2!wR7yW znOg8czizYoG?4qNF`q~A6PRV!GSRKl>3<`(l^pY zS{>84;1G1uDPnI}mXc^sos5gC%2k;>YU2{f{Uoh_S$c3^KX+@d-M9-xvBPKu`~ z?BSMJ4r4#J51&daofP`Ⓢ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 }J?M4SM7pQ6`?T50! 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 -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+#include "opentype-sanitiser.h" -+#include "ots-memory-stream.h" -+ -+#include "third_party/lzma_sdk/LzmaLib.h" -+ -+namespace { -+ -+static const size_t kCompressedLengthFieldSize = 4; -+ -+int Usage(const char *argv0) { -+ std::fprintf(stderr, "Usage: %s (compress|decompress) filename\n", argv0); -+ return 1; -+} -+ -+bool ReadFile(const char *file_name, std::vector* data) { -+ const int fd = open(file_name, O_RDONLY); -+ if (fd < 0) { -+ return false; -+ } -+ -+ struct stat st; -+ fstat(fd, &st); -+ -+ data->resize(st.st_size); -+ if (read(fd, &(*data)[0], st.st_size) != st.st_size) { -+ close(fd); -+ return false; -+ } -+ close(fd); -+ return true; -+} -+ -+bool Compress(std::vector* input, std::vector* output) { -+ size_t props_size = LZMA_PROPS_SIZE; -+ size_t out_len = input->size() * 2; -+ output->resize(out_len + props_size + kCompressedLengthFieldSize); -+ -+ uint8_t* output_start = &(*output)[kCompressedLengthFieldSize]; -+ -+ int result = LzmaCompress(output_start + LZMA_PROPS_SIZE, &out_len, -+ &(*input)[0], input->size(), -+ output_start, &props_size, -+ -1, 0, -1, -1, -1, -1, 1); -+ if (props_size != LZMA_PROPS_SIZE || result != SZ_OK) -+ return false; -+ -+ output->resize(props_size + out_len + kCompressedLengthFieldSize); -+ // Store the uncompressed length at the beginning of buffer. -+ uint32_t uncompressed_length = htonl(input->size()); -+ memcpy(&(*output)[0], &uncompressed_length, kCompressedLengthFieldSize); -+ return true; -+} -+ -+bool Decompress(std::vector* input, std::vector* output) { -+ if (input->size() < kCompressedLengthFieldSize + LZMA_PROPS_SIZE) -+ return false; -+ -+ // Assume the uncompressed length is stored at the beginning of the buffer -+ // in network byte order. -+ uint32_t uncompressed_length = 0; -+ memcpy(&uncompressed_length, &(*input)[0], kCompressedLengthFieldSize); -+ uncompressed_length = ntohl(uncompressed_length); -+ -+ output->resize(uncompressed_length); -+ uint8_t* input_start = &(*input)[kCompressedLengthFieldSize]; -+ size_t in_len = input->size() - LZMA_PROPS_SIZE; -+ size_t out_len = output->size(); -+ int result = LzmaUncompress(&(*output)[0], &out_len, -+ input_start + LZMA_PROPS_SIZE, -+ &in_len, input_start, LZMA_PROPS_SIZE); -+ -+ return result == SZ_OK; -+} -+ -+bool DumpResult(std::vector* result, const std::string* file_name) { -+ int fd = open(file_name->c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0600); -+ if (fd < 0) { -+ perror("opening output file"); -+ return false; -+ } -+ if (write(fd, &(*result)[0], result->size()) < 0) { -+ perror("writing output file"); -+ close(fd); -+ return false; -+ } -+ close(fd); -+ return true; -+} -+ -+} // namespace -+ -+int main(int argc, char** argv) { -+ if (argc != 3) return Usage(argv[0]); -+ -+ std::vector in_data; -+ if (!ReadFile(argv[2], &in_data)) { -+ std::fprintf(stderr, "Failed to read file!\n"); -+ return 1; -+ } -+ -+ std::vector out_data; -+ std::string file_name; -+ if (std::strncmp("compress", argv[1], 8) == 0) { -+ if (!Compress(&in_data, &out_data)) { -+ std::fprintf(stderr, "Failed to compress file.\n"); -+ return 1; -+ } -+ file_name = "compressed.dat"; -+ } else if (std::strncmp("decompress", argv[1], 10) == 0) { -+ if (!Decompress(&in_data, &out_data)) { -+ std::fprintf(stderr, "Failed to decompress file.\n"); -+ return 1; -+ } -+ file_name = "decompressed.dat"; -+ } else { -+ std::fprintf( -+ stderr, -+ "The second argument must be either 'compress' or 'decompress'."); -+ return 1; -+ } -+ -+ if (!DumpResult(&out_data, &file_name)) { -+ std::fprintf(stderr, "Failed to write the result.\n"); -+ return 1; -+ } -+} - -Property changes on: test/lzma.cc -___________________________________________________________________ -Added: svn:eol-style - + LF - -Index: ots-common.gypi -=================================================================== ---- ots-common.gypi (revision 83) -+++ ots-common.gypi (working copy) -@@ -68,6 +68,7 @@ - ], - 'ots_include_dirs': [ - 'include', -+ '.', - ], - }, - } -Index: ots-standalone.gyp -=================================================================== ---- ots-standalone.gyp (revision 83) -+++ ots-standalone.gyp (working copy) -@@ -96,6 +96,12 @@ - '<@(ots_include_dirs)', - ], - }, -+ 'dependencies': [ -+ 'third_party/lzma_sdk/lzma_sdk.gyp:lzma_sdk', -+ ], -+ 'export_dependent_settings': [ -+ 'third_party/lzma_sdk/lzma_sdk.gyp:lzma_sdk', -+ ], - }, - { - 'target_name': 'idempotent', -@@ -117,5 +123,15 @@ - }], - ], - }, -+ { -+ 'target_name': 'lzma', -+ 'type': 'executable', -+ 'sources': [ -+ 'test/lzma.cc', -+ ], -+ 'dependencies': [ -+ 'ots', -+ ], -+ }, - ], - } -Index: third_party/lzma_sdk/LzmaEnc.h -=================================================================== ---- third_party/lzma_sdk/LzmaEnc.h (revision 0) -+++ third_party/lzma_sdk/LzmaEnc.h (revision 0) -@@ -0,0 +1,80 @@ -+/* LzmaEnc.h -- LZMA Encoder -+2009-02-07 : Igor Pavlov : Public domain */ -+ -+#ifndef __LZMA_ENC_H -+#define __LZMA_ENC_H -+ -+#include "Types.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#define LZMA_PROPS_SIZE 5 -+ -+typedef struct _CLzmaEncProps -+{ -+ int level; /* 0 <= level <= 9 */ -+ UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version -+ (1 << 12) <= dictSize <= (1 << 30) for 64-bit version -+ default = (1 << 24) */ -+ int lc; /* 0 <= lc <= 8, default = 3 */ -+ int lp; /* 0 <= lp <= 4, default = 0 */ -+ int pb; /* 0 <= pb <= 4, default = 2 */ -+ int algo; /* 0 - fast, 1 - normal, default = 1 */ -+ int fb; /* 5 <= fb <= 273, default = 32 */ -+ int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */ -+ int numHashBytes; /* 2, 3 or 4, default = 4 */ -+ UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */ -+ unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */ -+ int numThreads; /* 1 or 2, default = 2 */ -+} CLzmaEncProps; -+ -+void LzmaEncProps_Init(CLzmaEncProps *p); -+void LzmaEncProps_Normalize(CLzmaEncProps *p); -+UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2); -+ -+ -+/* ---------- CLzmaEncHandle Interface ---------- */ -+ -+/* LzmaEnc_* functions can return the following exit codes: -+Returns: -+ SZ_OK - OK -+ SZ_ERROR_MEM - Memory allocation error -+ SZ_ERROR_PARAM - Incorrect paramater in props -+ SZ_ERROR_WRITE - Write callback error. -+ SZ_ERROR_PROGRESS - some break from progress callback -+ SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) -+*/ -+ -+typedef void * CLzmaEncHandle; -+ -+CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc); -+void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig); -+SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props); -+SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size); -+SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, -+ ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); -+SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, -+ int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); -+ -+/* ---------- One Call Interface ---------- */ -+ -+/* LzmaEncode -+Return code: -+ SZ_OK - OK -+ SZ_ERROR_MEM - Memory allocation error -+ SZ_ERROR_PARAM - Incorrect paramater -+ SZ_ERROR_OUTPUT_EOF - output buffer overflow -+ SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) -+*/ -+ -+SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, -+ const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, -+ ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif - -Property changes on: third_party/lzma_sdk/LzmaEnc.h -___________________________________________________________________ -Added: svn:eol-style - + LF - -Index: third_party/lzma_sdk/LzHash.h -=================================================================== ---- third_party/lzma_sdk/LzHash.h (revision 0) -+++ third_party/lzma_sdk/LzHash.h (revision 0) -@@ -0,0 +1,54 @@ -+/* LzHash.h -- HASH functions for LZ algorithms -+2009-02-07 : Igor Pavlov : Public domain */ -+ -+#ifndef __LZ_HASH_H -+#define __LZ_HASH_H -+ -+#define kHash2Size (1 << 10) -+#define kHash3Size (1 << 16) -+#define kHash4Size (1 << 20) -+ -+#define kFix3HashSize (kHash2Size) -+#define kFix4HashSize (kHash2Size + kHash3Size) -+#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) -+ -+#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8); -+ -+#define HASH3_CALC { \ -+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ -+ hash2Value = temp & (kHash2Size - 1); \ -+ hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; } -+ -+#define HASH4_CALC { \ -+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ -+ hash2Value = temp & (kHash2Size - 1); \ -+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ -+ hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & p->hashMask; } -+ -+#define HASH5_CALC { \ -+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ -+ hash2Value = temp & (kHash2Size - 1); \ -+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ -+ hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)); \ -+ hashValue = (hash4Value ^ (p->crc[cur[4]] << 3)) & p->hashMask; \ -+ hash4Value &= (kHash4Size - 1); } -+ -+/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */ -+#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF; -+ -+ -+#define MT_HASH2_CALC \ -+ hash2Value = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1); -+ -+#define MT_HASH3_CALC { \ -+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ -+ hash2Value = temp & (kHash2Size - 1); \ -+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } -+ -+#define MT_HASH4_CALC { \ -+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ -+ hash2Value = temp & (kHash2Size - 1); \ -+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ -+ hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); } -+ -+#endif - -Property changes on: third_party/lzma_sdk/LzHash.h -___________________________________________________________________ -Added: svn:executable - + * -Added: svn:eol-style - + LF - -Index: third_party/lzma_sdk/Alloc.h -=================================================================== ---- third_party/lzma_sdk/Alloc.h (revision 0) -+++ third_party/lzma_sdk/Alloc.h (revision 0) -@@ -0,0 +1,38 @@ -+/* Alloc.h -- Memory allocation functions -+2009-02-07 : Igor Pavlov : Public domain */ -+ -+#ifndef __COMMON_ALLOC_H -+#define __COMMON_ALLOC_H -+ -+#include -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+void *MyAlloc(size_t size); -+void MyFree(void *address); -+ -+#ifdef _WIN32 -+ -+void SetLargePageSize(); -+ -+void *MidAlloc(size_t size); -+void MidFree(void *address); -+void *BigAlloc(size_t size); -+void BigFree(void *address); -+ -+#else -+ -+#define MidAlloc(size) MyAlloc(size) -+#define MidFree(address) MyFree(address) -+#define BigAlloc(size) MyAlloc(size) -+#define BigFree(address) MyFree(address) -+ -+#endif -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif - -Property changes on: third_party/lzma_sdk/Alloc.h -___________________________________________________________________ -Added: svn:eol-style - + LF - -Index: third_party/lzma_sdk/LzmaLib.h -=================================================================== ---- third_party/lzma_sdk/LzmaLib.h (revision 0) -+++ third_party/lzma_sdk/LzmaLib.h (revision 0) -@@ -0,0 +1,135 @@ -+/* LzmaLib.h -- LZMA library interface -+2009-04-07 : Igor Pavlov : Public domain */ -+ -+#ifndef __LZMA_LIB_H -+#define __LZMA_LIB_H -+ -+#include "Types.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#define MY_STDAPI int MY_STD_CALL -+ -+#define LZMA_PROPS_SIZE 5 -+ -+/* -+RAM requirements for LZMA: -+ for compression: (dictSize * 11.5 + 6 MB) + state_size -+ for decompression: dictSize + state_size -+ state_size = (4 + (1.5 << (lc + lp))) KB -+ by default (lc=3, lp=0), state_size = 16 KB. -+ -+LZMA properties (5 bytes) format -+ Offset Size Description -+ 0 1 lc, lp and pb in encoded form. -+ 1 4 dictSize (little endian). -+*/ -+ -+/* -+LzmaCompress -+------------ -+ -+outPropsSize - -+ In: the pointer to the size of outProps buffer; *outPropsSize = LZMA_PROPS_SIZE = 5. -+ Out: the pointer to the size of written properties in outProps buffer; *outPropsSize = LZMA_PROPS_SIZE = 5. -+ -+ LZMA Encoder will use defult values for any parameter, if it is -+ -1 for any from: level, loc, lp, pb, fb, numThreads -+ 0 for dictSize -+ -+level - compression level: 0 <= level <= 9; -+ -+ level dictSize algo fb -+ 0: 16 KB 0 32 -+ 1: 64 KB 0 32 -+ 2: 256 KB 0 32 -+ 3: 1 MB 0 32 -+ 4: 4 MB 0 32 -+ 5: 16 MB 1 32 -+ 6: 32 MB 1 32 -+ 7+: 64 MB 1 64 -+ -+ The default value for "level" is 5. -+ -+ algo = 0 means fast method -+ algo = 1 means normal method -+ -+dictSize - The dictionary size in bytes. The maximum value is -+ 128 MB = (1 << 27) bytes for 32-bit version -+ 1 GB = (1 << 30) bytes for 64-bit version -+ The default value is 16 MB = (1 << 24) bytes. -+ It's recommended to use the dictionary that is larger than 4 KB and -+ that can be calculated as (1 << N) or (3 << N) sizes. -+ -+lc - The number of literal context bits (high bits of previous literal). -+ It can be in the range from 0 to 8. The default value is 3. -+ Sometimes lc=4 gives the gain for big files. -+ -+lp - The number of literal pos bits (low bits of current position for literals). -+ It can be in the range from 0 to 4. The default value is 0. -+ The lp switch is intended for periodical data when the period is equal to 2^lp. -+ For example, for 32-bit (4 bytes) periodical data you can use lp=2. Often it's -+ better to set lc=0, if you change lp switch. -+ -+pb - The number of pos bits (low bits of current position). -+ It can be in the range from 0 to 4. The default value is 2. -+ The pb switch is intended for periodical data when the period is equal 2^pb. -+ -+fb - Word size (the number of fast bytes). -+ It can be in the range from 5 to 273. The default value is 32. -+ Usually, a big number gives a little bit better compression ratio and -+ slower compression process. -+ -+numThreads - The number of thereads. 1 or 2. The default value is 2. -+ Fast mode (algo = 0) can use only 1 thread. -+ -+Out: -+ destLen - processed output size -+Returns: -+ SZ_OK - OK -+ SZ_ERROR_MEM - Memory allocation error -+ SZ_ERROR_PARAM - Incorrect paramater -+ SZ_ERROR_OUTPUT_EOF - output buffer overflow -+ SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) -+*/ -+ -+MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, -+ unsigned char *outProps, size_t *outPropsSize, /* *outPropsSize must be = 5 */ -+ int level, /* 0 <= level <= 9, default = 5 */ -+ unsigned dictSize, /* default = (1 << 24) */ -+ int lc, /* 0 <= lc <= 8, default = 3 */ -+ int lp, /* 0 <= lp <= 4, default = 0 */ -+ int pb, /* 0 <= pb <= 4, default = 2 */ -+ int fb, /* 5 <= fb <= 273, default = 32 */ -+ int numThreads /* 1 or 2, default = 2 */ -+ ); -+ -+/* -+LzmaUncompress -+-------------- -+In: -+ dest - output data -+ destLen - output data size -+ src - input data -+ srcLen - input data size -+Out: -+ destLen - processed output size -+ srcLen - processed input size -+Returns: -+ SZ_OK - OK -+ SZ_ERROR_DATA - Data error -+ SZ_ERROR_MEM - Memory allocation arror -+ SZ_ERROR_UNSUPPORTED - Unsupported properties -+ SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer (src) -+*/ -+ -+MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, SizeT *srcLen, -+ const unsigned char *props, size_t propsSize); -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif - -Property changes on: third_party/lzma_sdk/LzmaLib.h -___________________________________________________________________ -Added: svn:eol-style - + LF - -Index: third_party/lzma_sdk/LICENSE -=================================================================== ---- third_party/lzma_sdk/LICENSE (revision 0) -+++ third_party/lzma_sdk/LICENSE (revision 0) -@@ -0,0 +1 @@ -+LZMA SDK is placed in the public domain. -Index: third_party/lzma_sdk/Types.h -=================================================================== ---- third_party/lzma_sdk/Types.h (revision 0) -+++ third_party/lzma_sdk/Types.h (revision 0) -@@ -0,0 +1,254 @@ -+/* Types.h -- Basic types -+2010-10-09 : Igor Pavlov : Public domain */ -+ -+#ifndef __7Z_TYPES_H -+#define __7Z_TYPES_H -+ -+#include -+ -+#ifdef _WIN32 -+#include -+#endif -+ -+#ifndef EXTERN_C_BEGIN -+#ifdef __cplusplus -+#define EXTERN_C_BEGIN extern "C" { -+#define EXTERN_C_END } -+#else -+#define EXTERN_C_BEGIN -+#define EXTERN_C_END -+#endif -+#endif -+ -+EXTERN_C_BEGIN -+ -+#define SZ_OK 0 -+ -+#define SZ_ERROR_DATA 1 -+#define SZ_ERROR_MEM 2 -+#define SZ_ERROR_CRC 3 -+#define SZ_ERROR_UNSUPPORTED 4 -+#define SZ_ERROR_PARAM 5 -+#define SZ_ERROR_INPUT_EOF 6 -+#define SZ_ERROR_OUTPUT_EOF 7 -+#define SZ_ERROR_READ 8 -+#define SZ_ERROR_WRITE 9 -+#define SZ_ERROR_PROGRESS 10 -+#define SZ_ERROR_FAIL 11 -+#define SZ_ERROR_THREAD 12 -+ -+#define SZ_ERROR_ARCHIVE 16 -+#define SZ_ERROR_NO_ARCHIVE 17 -+ -+typedef int SRes; -+ -+#ifdef _WIN32 -+typedef DWORD WRes; -+#else -+typedef int WRes; -+#endif -+ -+#ifndef RINOK -+#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } -+#endif -+ -+typedef unsigned char Byte; -+typedef short Int16; -+typedef unsigned short UInt16; -+ -+#ifdef _LZMA_UINT32_IS_ULONG -+typedef long Int32; -+typedef unsigned long UInt32; -+#else -+typedef int Int32; -+typedef unsigned int UInt32; -+#endif -+ -+#ifdef _SZ_NO_INT_64 -+ -+/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. -+ NOTES: Some code will work incorrectly in that case! */ -+ -+typedef long Int64; -+typedef unsigned long UInt64; -+ -+#else -+ -+#if defined(_MSC_VER) || defined(__BORLANDC__) -+typedef __int64 Int64; -+typedef unsigned __int64 UInt64; -+#define UINT64_CONST(n) n -+#else -+typedef long long int Int64; -+typedef unsigned long long int UInt64; -+#define UINT64_CONST(n) n ## ULL -+#endif -+ -+#endif -+ -+#ifdef _LZMA_NO_SYSTEM_SIZE_T -+typedef UInt32 SizeT; -+#else -+typedef size_t SizeT; -+#endif -+ -+typedef int Bool; -+#define True 1 -+#define False 0 -+ -+ -+#ifdef _WIN32 -+#define MY_STD_CALL __stdcall -+#else -+#define MY_STD_CALL -+#endif -+ -+#ifdef _MSC_VER -+ -+#if _MSC_VER >= 1300 -+#define MY_NO_INLINE __declspec(noinline) -+#else -+#define MY_NO_INLINE -+#endif -+ -+#define MY_CDECL __cdecl -+#define MY_FAST_CALL __fastcall -+ -+#else -+ -+#define MY_CDECL -+#define MY_FAST_CALL -+ -+#endif -+ -+ -+/* The following interfaces use first parameter as pointer to structure */ -+ -+typedef struct -+{ -+ Byte (*Read)(void *p); /* reads one byte, returns 0 in case of EOF or error */ -+} IByteIn; -+ -+typedef struct -+{ -+ void (*Write)(void *p, Byte b); -+} IByteOut; -+ -+typedef struct -+{ -+ SRes (*Read)(void *p, void *buf, size_t *size); -+ /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. -+ (output(*size) < input(*size)) is allowed */ -+} ISeqInStream; -+ -+/* it can return SZ_ERROR_INPUT_EOF */ -+SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); -+SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); -+SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); -+ -+typedef struct -+{ -+ size_t (*Write)(void *p, const void *buf, size_t size); -+ /* Returns: result - the number of actually written bytes. -+ (result < size) means error */ -+} ISeqOutStream; -+ -+typedef enum -+{ -+ SZ_SEEK_SET = 0, -+ SZ_SEEK_CUR = 1, -+ SZ_SEEK_END = 2 -+} ESzSeek; -+ -+typedef struct -+{ -+ SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ -+ SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); -+} ISeekInStream; -+ -+typedef struct -+{ -+ SRes (*Look)(void *p, const void **buf, size_t *size); -+ /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. -+ (output(*size) > input(*size)) is not allowed -+ (output(*size) < input(*size)) is allowed */ -+ SRes (*Skip)(void *p, size_t offset); -+ /* offset must be <= output(*size) of Look */ -+ -+ SRes (*Read)(void *p, void *buf, size_t *size); -+ /* reads directly (without buffer). It's same as ISeqInStream::Read */ -+ SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); -+} ILookInStream; -+ -+SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); -+SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); -+ -+/* reads via ILookInStream::Read */ -+SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); -+SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); -+ -+#define LookToRead_BUF_SIZE (1 << 14) -+ -+typedef struct -+{ -+ ILookInStream s; -+ ISeekInStream *realStream; -+ size_t pos; -+ size_t size; -+ Byte buf[LookToRead_BUF_SIZE]; -+} CLookToRead; -+ -+void LookToRead_CreateVTable(CLookToRead *p, int lookahead); -+void LookToRead_Init(CLookToRead *p); -+ -+typedef struct -+{ -+ ISeqInStream s; -+ ILookInStream *realStream; -+} CSecToLook; -+ -+void SecToLook_CreateVTable(CSecToLook *p); -+ -+typedef struct -+{ -+ ISeqInStream s; -+ ILookInStream *realStream; -+} CSecToRead; -+ -+void SecToRead_CreateVTable(CSecToRead *p); -+ -+typedef struct -+{ -+ SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); -+ /* Returns: result. (result != SZ_OK) means break. -+ Value (UInt64)(Int64)-1 for size means unknown value. */ -+} ICompressProgress; -+ -+typedef struct -+{ -+ void *(*Alloc)(void *p, size_t size); -+ void (*Free)(void *p, void *address); /* address can be 0 */ -+} ISzAlloc; -+ -+#define IAlloc_Alloc(p, size) (p)->Alloc((p), size) -+#define IAlloc_Free(p, a) (p)->Free((p), a) -+ -+#ifdef _WIN32 -+ -+#define CHAR_PATH_SEPARATOR '\\' -+#define WCHAR_PATH_SEPARATOR L'\\' -+#define STRING_PATH_SEPARATOR "\\" -+#define WSTRING_PATH_SEPARATOR L"\\" -+ -+#else -+ -+#define CHAR_PATH_SEPARATOR '/' -+#define WCHAR_PATH_SEPARATOR L'/' -+#define STRING_PATH_SEPARATOR "/" -+#define WSTRING_PATH_SEPARATOR L"/" -+ -+#endif -+ -+EXTERN_C_END -+ -+#endif - -Property changes on: third_party/lzma_sdk/Types.h -___________________________________________________________________ -Added: svn:eol-style - + LF - -Index: third_party/lzma_sdk/LzmaDec.c -=================================================================== ---- third_party/lzma_sdk/LzmaDec.c (revision 0) -+++ third_party/lzma_sdk/LzmaDec.c (revision 0) -@@ -0,0 +1,999 @@ -+/* LzmaDec.c -- LZMA Decoder -+2009-09-20 : Igor Pavlov : Public domain */ -+ -+#include "LzmaDec.h" -+ -+#include -+ -+#define kNumTopBits 24 -+#define kTopValue ((UInt32)1 << kNumTopBits) -+ -+#define kNumBitModelTotalBits 11 -+#define kBitModelTotal (1 << kNumBitModelTotalBits) -+#define kNumMoveBits 5 -+ -+#define RC_INIT_SIZE 5 -+ -+#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } -+ -+#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) -+#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); -+#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); -+#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ -+ { UPDATE_0(p); i = (i + i); A0; } else \ -+ { UPDATE_1(p); i = (i + i) + 1; A1; } -+#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;) -+ -+#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); } -+#define TREE_DECODE(probs, limit, i) \ -+ { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } -+ -+/* #define _LZMA_SIZE_OPT */ -+ -+#ifdef _LZMA_SIZE_OPT -+#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i) -+#else -+#define TREE_6_DECODE(probs, i) \ -+ { i = 1; \ -+ TREE_GET_BIT(probs, i); \ -+ TREE_GET_BIT(probs, i); \ -+ TREE_GET_BIT(probs, i); \ -+ TREE_GET_BIT(probs, i); \ -+ TREE_GET_BIT(probs, i); \ -+ TREE_GET_BIT(probs, i); \ -+ i -= 0x40; } -+#endif -+ -+#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); } -+ -+#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) -+#define UPDATE_0_CHECK range = bound; -+#define UPDATE_1_CHECK range -= bound; code -= bound; -+#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \ -+ { UPDATE_0_CHECK; i = (i + i); A0; } else \ -+ { UPDATE_1_CHECK; i = (i + i) + 1; A1; } -+#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;) -+#define TREE_DECODE_CHECK(probs, limit, i) \ -+ { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } -+ -+ -+#define kNumPosBitsMax 4 -+#define kNumPosStatesMax (1 << kNumPosBitsMax) -+ -+#define kLenNumLowBits 3 -+#define kLenNumLowSymbols (1 << kLenNumLowBits) -+#define kLenNumMidBits 3 -+#define kLenNumMidSymbols (1 << kLenNumMidBits) -+#define kLenNumHighBits 8 -+#define kLenNumHighSymbols (1 << kLenNumHighBits) -+ -+#define LenChoice 0 -+#define LenChoice2 (LenChoice + 1) -+#define LenLow (LenChoice2 + 1) -+#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) -+#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) -+#define kNumLenProbs (LenHigh + kLenNumHighSymbols) -+ -+ -+#define kNumStates 12 -+#define kNumLitStates 7 -+ -+#define kStartPosModelIndex 4 -+#define kEndPosModelIndex 14 -+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) -+ -+#define kNumPosSlotBits 6 -+#define kNumLenToPosStates 4 -+ -+#define kNumAlignBits 4 -+#define kAlignTableSize (1 << kNumAlignBits) -+ -+#define kMatchMinLen 2 -+#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) -+ -+#define IsMatch 0 -+#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) -+#define IsRepG0 (IsRep + kNumStates) -+#define IsRepG1 (IsRepG0 + kNumStates) -+#define IsRepG2 (IsRepG1 + kNumStates) -+#define IsRep0Long (IsRepG2 + kNumStates) -+#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) -+#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) -+#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) -+#define LenCoder (Align + kAlignTableSize) -+#define RepLenCoder (LenCoder + kNumLenProbs) -+#define Literal (RepLenCoder + kNumLenProbs) -+ -+#define LZMA_BASE_SIZE 1846 -+#define LZMA_LIT_SIZE 768 -+ -+#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) -+ -+#if Literal != LZMA_BASE_SIZE -+StopCompilingDueBUG -+#endif -+ -+#define LZMA_DIC_MIN (1 << 12) -+ -+/* First LZMA-symbol is always decoded. -+And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization -+Out: -+ Result: -+ SZ_OK - OK -+ SZ_ERROR_DATA - Error -+ p->remainLen: -+ < kMatchSpecLenStart : normal remain -+ = kMatchSpecLenStart : finished -+ = kMatchSpecLenStart + 1 : Flush marker -+ = kMatchSpecLenStart + 2 : State Init Marker -+*/ -+ -+static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit) -+{ -+ CLzmaProb *probs = p->probs; -+ -+ unsigned state = p->state; -+ UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3]; -+ unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1; -+ unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1; -+ unsigned lc = p->prop.lc; -+ -+ Byte *dic = p->dic; -+ SizeT dicBufSize = p->dicBufSize; -+ SizeT dicPos = p->dicPos; -+ -+ UInt32 processedPos = p->processedPos; -+ UInt32 checkDicSize = p->checkDicSize; -+ unsigned len = 0; -+ -+ const Byte *buf = p->buf; -+ UInt32 range = p->range; -+ UInt32 code = p->code; -+ -+ do -+ { -+ CLzmaProb *prob; -+ UInt32 bound; -+ unsigned ttt; -+ unsigned posState = processedPos & pbMask; -+ -+ prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; -+ IF_BIT_0(prob) -+ { -+ unsigned symbol; -+ UPDATE_0(prob); -+ prob = probs + Literal; -+ if (checkDicSize != 0 || processedPos != 0) -+ prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) + -+ (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc)))); -+ -+ if (state < kNumLitStates) -+ { -+ state -= (state < 4) ? state : 3; -+ symbol = 1; -+ do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100); -+ } -+ else -+ { -+ unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; -+ unsigned offs = 0x100; -+ state -= (state < 10) ? 3 : 6; -+ symbol = 1; -+ do -+ { -+ unsigned bit; -+ CLzmaProb *probLit; -+ matchByte <<= 1; -+ bit = (matchByte & offs); -+ probLit = prob + offs + bit + symbol; -+ GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit) -+ } -+ while (symbol < 0x100); -+ } -+ dic[dicPos++] = (Byte)symbol; -+ processedPos++; -+ continue; -+ } -+ else -+ { -+ UPDATE_1(prob); -+ prob = probs + IsRep + state; -+ IF_BIT_0(prob) -+ { -+ UPDATE_0(prob); -+ state += kNumStates; -+ prob = probs + LenCoder; -+ } -+ else -+ { -+ UPDATE_1(prob); -+ if (checkDicSize == 0 && processedPos == 0) -+ return SZ_ERROR_DATA; -+ prob = probs + IsRepG0 + state; -+ IF_BIT_0(prob) -+ { -+ UPDATE_0(prob); -+ prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; -+ IF_BIT_0(prob) -+ { -+ UPDATE_0(prob); -+ dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; -+ dicPos++; -+ processedPos++; -+ state = state < kNumLitStates ? 9 : 11; -+ continue; -+ } -+ UPDATE_1(prob); -+ } -+ else -+ { -+ UInt32 distance; -+ UPDATE_1(prob); -+ prob = probs + IsRepG1 + state; -+ IF_BIT_0(prob) -+ { -+ UPDATE_0(prob); -+ distance = rep1; -+ } -+ else -+ { -+ UPDATE_1(prob); -+ prob = probs + IsRepG2 + state; -+ IF_BIT_0(prob) -+ { -+ UPDATE_0(prob); -+ distance = rep2; -+ } -+ else -+ { -+ UPDATE_1(prob); -+ distance = rep3; -+ rep3 = rep2; -+ } -+ rep2 = rep1; -+ } -+ rep1 = rep0; -+ rep0 = distance; -+ } -+ state = state < kNumLitStates ? 8 : 11; -+ prob = probs + RepLenCoder; -+ } -+ { -+ unsigned limit, offset; -+ CLzmaProb *probLen = prob + LenChoice; -+ IF_BIT_0(probLen) -+ { -+ UPDATE_0(probLen); -+ probLen = prob + LenLow + (posState << kLenNumLowBits); -+ offset = 0; -+ limit = (1 << kLenNumLowBits); -+ } -+ else -+ { -+ UPDATE_1(probLen); -+ probLen = prob + LenChoice2; -+ IF_BIT_0(probLen) -+ { -+ UPDATE_0(probLen); -+ probLen = prob + LenMid + (posState << kLenNumMidBits); -+ offset = kLenNumLowSymbols; -+ limit = (1 << kLenNumMidBits); -+ } -+ else -+ { -+ UPDATE_1(probLen); -+ probLen = prob + LenHigh; -+ offset = kLenNumLowSymbols + kLenNumMidSymbols; -+ limit = (1 << kLenNumHighBits); -+ } -+ } -+ TREE_DECODE(probLen, limit, len); -+ len += offset; -+ } -+ -+ if (state >= kNumStates) -+ { -+ UInt32 distance; -+ prob = probs + PosSlot + -+ ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); -+ TREE_6_DECODE(prob, distance); -+ if (distance >= kStartPosModelIndex) -+ { -+ unsigned posSlot = (unsigned)distance; -+ int numDirectBits = (int)(((distance >> 1) - 1)); -+ distance = (2 | (distance & 1)); -+ if (posSlot < kEndPosModelIndex) -+ { -+ distance <<= numDirectBits; -+ prob = probs + SpecPos + distance - posSlot - 1; -+ { -+ UInt32 mask = 1; -+ unsigned i = 1; -+ do -+ { -+ GET_BIT2(prob + i, i, ; , distance |= mask); -+ mask <<= 1; -+ } -+ while (--numDirectBits != 0); -+ } -+ } -+ else -+ { -+ numDirectBits -= kNumAlignBits; -+ do -+ { -+ NORMALIZE -+ range >>= 1; -+ -+ { -+ UInt32 t; -+ code -= range; -+ t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */ -+ distance = (distance << 1) + (t + 1); -+ code += range & t; -+ } -+ /* -+ distance <<= 1; -+ if (code >= range) -+ { -+ code -= range; -+ distance |= 1; -+ } -+ */ -+ } -+ while (--numDirectBits != 0); -+ prob = probs + Align; -+ distance <<= kNumAlignBits; -+ { -+ unsigned i = 1; -+ GET_BIT2(prob + i, i, ; , distance |= 1); -+ GET_BIT2(prob + i, i, ; , distance |= 2); -+ GET_BIT2(prob + i, i, ; , distance |= 4); -+ GET_BIT2(prob + i, i, ; , distance |= 8); -+ } -+ if (distance == (UInt32)0xFFFFFFFF) -+ { -+ len += kMatchSpecLenStart; -+ state -= kNumStates; -+ break; -+ } -+ } -+ } -+ rep3 = rep2; -+ rep2 = rep1; -+ rep1 = rep0; -+ rep0 = distance + 1; -+ if (checkDicSize == 0) -+ { -+ if (distance >= processedPos) -+ return SZ_ERROR_DATA; -+ } -+ else if (distance >= checkDicSize) -+ return SZ_ERROR_DATA; -+ state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; -+ } -+ -+ len += kMatchMinLen; -+ -+ if (limit == dicPos) -+ return SZ_ERROR_DATA; -+ { -+ SizeT rem = limit - dicPos; -+ unsigned curLen = ((rem < len) ? (unsigned)rem : len); -+ SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0); -+ -+ processedPos += curLen; -+ -+ len -= curLen; -+ if (pos + curLen <= dicBufSize) -+ { -+ Byte *dest = dic + dicPos; -+ ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos; -+ const Byte *lim = dest + curLen; -+ dicPos += curLen; -+ do -+ *(dest) = (Byte)*(dest + src); -+ while (++dest != lim); -+ } -+ else -+ { -+ do -+ { -+ dic[dicPos++] = dic[pos]; -+ if (++pos == dicBufSize) -+ pos = 0; -+ } -+ while (--curLen != 0); -+ } -+ } -+ } -+ } -+ while (dicPos < limit && buf < bufLimit); -+ NORMALIZE; -+ p->buf = buf; -+ p->range = range; -+ p->code = code; -+ p->remainLen = len; -+ p->dicPos = dicPos; -+ p->processedPos = processedPos; -+ p->reps[0] = rep0; -+ p->reps[1] = rep1; -+ p->reps[2] = rep2; -+ p->reps[3] = rep3; -+ p->state = state; -+ -+ return SZ_OK; -+} -+ -+static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) -+{ -+ if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart) -+ { -+ Byte *dic = p->dic; -+ SizeT dicPos = p->dicPos; -+ SizeT dicBufSize = p->dicBufSize; -+ unsigned len = p->remainLen; -+ UInt32 rep0 = p->reps[0]; -+ if (limit - dicPos < len) -+ len = (unsigned)(limit - dicPos); -+ -+ if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len) -+ p->checkDicSize = p->prop.dicSize; -+ -+ p->processedPos += len; -+ p->remainLen -= len; -+ while (len-- != 0) -+ { -+ dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; -+ dicPos++; -+ } -+ p->dicPos = dicPos; -+ } -+} -+ -+static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) -+{ -+ do -+ { -+ SizeT limit2 = limit; -+ if (p->checkDicSize == 0) -+ { -+ UInt32 rem = p->prop.dicSize - p->processedPos; -+ if (limit - p->dicPos > rem) -+ limit2 = p->dicPos + rem; -+ } -+ RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit)); -+ if (p->processedPos >= p->prop.dicSize) -+ p->checkDicSize = p->prop.dicSize; -+ LzmaDec_WriteRem(p, limit); -+ } -+ while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart); -+ -+ if (p->remainLen > kMatchSpecLenStart) -+ { -+ p->remainLen = kMatchSpecLenStart; -+ } -+ return 0; -+} -+ -+typedef enum -+{ -+ DUMMY_ERROR, /* unexpected end of input stream */ -+ DUMMY_LIT, -+ DUMMY_MATCH, -+ DUMMY_REP -+} ELzmaDummy; -+ -+static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize) -+{ -+ UInt32 range = p->range; -+ UInt32 code = p->code; -+ const Byte *bufLimit = buf + inSize; -+ CLzmaProb *probs = p->probs; -+ unsigned state = p->state; -+ ELzmaDummy res; -+ -+ { -+ CLzmaProb *prob; -+ UInt32 bound; -+ unsigned ttt; -+ unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1); -+ -+ prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK -+ -+ /* if (bufLimit - buf >= 7) return DUMMY_LIT; */ -+ -+ prob = probs + Literal; -+ if (p->checkDicSize != 0 || p->processedPos != 0) -+ prob += (LZMA_LIT_SIZE * -+ ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) + -+ (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc)))); -+ -+ if (state < kNumLitStates) -+ { -+ unsigned symbol = 1; -+ do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100); -+ } -+ else -+ { -+ unsigned matchByte = p->dic[p->dicPos - p->reps[0] + -+ ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)]; -+ unsigned offs = 0x100; -+ unsigned symbol = 1; -+ do -+ { -+ unsigned bit; -+ CLzmaProb *probLit; -+ matchByte <<= 1; -+ bit = (matchByte & offs); -+ probLit = prob + offs + bit + symbol; -+ GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit) -+ } -+ while (symbol < 0x100); -+ } -+ res = DUMMY_LIT; -+ } -+ else -+ { -+ unsigned len; -+ UPDATE_1_CHECK; -+ -+ prob = probs + IsRep + state; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK; -+ state = 0; -+ prob = probs + LenCoder; -+ res = DUMMY_MATCH; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ res = DUMMY_REP; -+ prob = probs + IsRepG0 + state; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK; -+ prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK; -+ NORMALIZE_CHECK; -+ return DUMMY_REP; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ } -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ prob = probs + IsRepG1 + state; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ prob = probs + IsRepG2 + state; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ } -+ } -+ } -+ state = kNumStates; -+ prob = probs + RepLenCoder; -+ } -+ { -+ unsigned limit, offset; -+ CLzmaProb *probLen = prob + LenChoice; -+ IF_BIT_0_CHECK(probLen) -+ { -+ UPDATE_0_CHECK; -+ probLen = prob + LenLow + (posState << kLenNumLowBits); -+ offset = 0; -+ limit = 1 << kLenNumLowBits; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ probLen = prob + LenChoice2; -+ IF_BIT_0_CHECK(probLen) -+ { -+ UPDATE_0_CHECK; -+ probLen = prob + LenMid + (posState << kLenNumMidBits); -+ offset = kLenNumLowSymbols; -+ limit = 1 << kLenNumMidBits; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ probLen = prob + LenHigh; -+ offset = kLenNumLowSymbols + kLenNumMidSymbols; -+ limit = 1 << kLenNumHighBits; -+ } -+ } -+ TREE_DECODE_CHECK(probLen, limit, len); -+ len += offset; -+ } -+ -+ if (state < 4) -+ { -+ unsigned posSlot; -+ prob = probs + PosSlot + -+ ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << -+ kNumPosSlotBits); -+ TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot); -+ if (posSlot >= kStartPosModelIndex) -+ { -+ int numDirectBits = ((posSlot >> 1) - 1); -+ -+ /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */ -+ -+ if (posSlot < kEndPosModelIndex) -+ { -+ prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1; -+ } -+ else -+ { -+ numDirectBits -= kNumAlignBits; -+ do -+ { -+ NORMALIZE_CHECK -+ range >>= 1; -+ code -= range & (((code - range) >> 31) - 1); -+ /* if (code >= range) code -= range; */ -+ } -+ while (--numDirectBits != 0); -+ prob = probs + Align; -+ numDirectBits = kNumAlignBits; -+ } -+ { -+ unsigned i = 1; -+ do -+ { -+ GET_BIT_CHECK(prob + i, i); -+ } -+ while (--numDirectBits != 0); -+ } -+ } -+ } -+ } -+ } -+ NORMALIZE_CHECK; -+ return res; -+} -+ -+ -+static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data) -+{ -+ p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]); -+ p->range = 0xFFFFFFFF; -+ p->needFlush = 0; -+} -+ -+void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState) -+{ -+ p->needFlush = 1; -+ p->remainLen = 0; -+ p->tempBufSize = 0; -+ -+ if (initDic) -+ { -+ p->processedPos = 0; -+ p->checkDicSize = 0; -+ p->needInitState = 1; -+ } -+ if (initState) -+ p->needInitState = 1; -+} -+ -+void LzmaDec_Init(CLzmaDec *p) -+{ -+ p->dicPos = 0; -+ LzmaDec_InitDicAndState(p, True, True); -+} -+ -+static void LzmaDec_InitStateReal(CLzmaDec *p) -+{ -+ UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp)); -+ UInt32 i; -+ CLzmaProb *probs = p->probs; -+ for (i = 0; i < numProbs; i++) -+ probs[i] = kBitModelTotal >> 1; -+ p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; -+ p->state = 0; -+ p->needInitState = 0; -+} -+ -+SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, -+ ELzmaFinishMode finishMode, ELzmaStatus *status) -+{ -+ SizeT inSize = *srcLen; -+ (*srcLen) = 0; -+ LzmaDec_WriteRem(p, dicLimit); -+ -+ *status = LZMA_STATUS_NOT_SPECIFIED; -+ -+ while (p->remainLen != kMatchSpecLenStart) -+ { -+ int checkEndMarkNow; -+ -+ if (p->needFlush != 0) -+ { -+ for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) -+ p->tempBuf[p->tempBufSize++] = *src++; -+ if (p->tempBufSize < RC_INIT_SIZE) -+ { -+ *status = LZMA_STATUS_NEEDS_MORE_INPUT; -+ return SZ_OK; -+ } -+ if (p->tempBuf[0] != 0) -+ return SZ_ERROR_DATA; -+ -+ LzmaDec_InitRc(p, p->tempBuf); -+ p->tempBufSize = 0; -+ } -+ -+ checkEndMarkNow = 0; -+ if (p->dicPos >= dicLimit) -+ { -+ if (p->remainLen == 0 && p->code == 0) -+ { -+ *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK; -+ return SZ_OK; -+ } -+ if (finishMode == LZMA_FINISH_ANY) -+ { -+ *status = LZMA_STATUS_NOT_FINISHED; -+ return SZ_OK; -+ } -+ if (p->remainLen != 0) -+ { -+ *status = LZMA_STATUS_NOT_FINISHED; -+ return SZ_ERROR_DATA; -+ } -+ checkEndMarkNow = 1; -+ } -+ -+ if (p->needInitState) -+ LzmaDec_InitStateReal(p); -+ -+ if (p->tempBufSize == 0) -+ { -+ SizeT processed; -+ const Byte *bufLimit; -+ if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) -+ { -+ int dummyRes = LzmaDec_TryDummy(p, src, inSize); -+ if (dummyRes == DUMMY_ERROR) -+ { -+ memcpy(p->tempBuf, src, inSize); -+ p->tempBufSize = (unsigned)inSize; -+ (*srcLen) += inSize; -+ *status = LZMA_STATUS_NEEDS_MORE_INPUT; -+ return SZ_OK; -+ } -+ if (checkEndMarkNow && dummyRes != DUMMY_MATCH) -+ { -+ *status = LZMA_STATUS_NOT_FINISHED; -+ return SZ_ERROR_DATA; -+ } -+ bufLimit = src; -+ } -+ else -+ bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX; -+ p->buf = src; -+ if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0) -+ return SZ_ERROR_DATA; -+ processed = (SizeT)(p->buf - src); -+ (*srcLen) += processed; -+ src += processed; -+ inSize -= processed; -+ } -+ else -+ { -+ unsigned rem = p->tempBufSize, lookAhead = 0; -+ while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize) -+ p->tempBuf[rem++] = src[lookAhead++]; -+ p->tempBufSize = rem; -+ if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) -+ { -+ int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem); -+ if (dummyRes == DUMMY_ERROR) -+ { -+ (*srcLen) += lookAhead; -+ *status = LZMA_STATUS_NEEDS_MORE_INPUT; -+ return SZ_OK; -+ } -+ if (checkEndMarkNow && dummyRes != DUMMY_MATCH) -+ { -+ *status = LZMA_STATUS_NOT_FINISHED; -+ return SZ_ERROR_DATA; -+ } -+ } -+ p->buf = p->tempBuf; -+ if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0) -+ return SZ_ERROR_DATA; -+ lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf)); -+ (*srcLen) += lookAhead; -+ src += lookAhead; -+ inSize -= lookAhead; -+ p->tempBufSize = 0; -+ } -+ } -+ if (p->code == 0) -+ *status = LZMA_STATUS_FINISHED_WITH_MARK; -+ return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA; -+} -+ -+SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) -+{ -+ SizeT outSize = *destLen; -+ SizeT inSize = *srcLen; -+ *srcLen = *destLen = 0; -+ for (;;) -+ { -+ SizeT inSizeCur = inSize, outSizeCur, dicPos; -+ ELzmaFinishMode curFinishMode; -+ SRes res; -+ if (p->dicPos == p->dicBufSize) -+ p->dicPos = 0; -+ dicPos = p->dicPos; -+ if (outSize > p->dicBufSize - dicPos) -+ { -+ outSizeCur = p->dicBufSize; -+ curFinishMode = LZMA_FINISH_ANY; -+ } -+ else -+ { -+ outSizeCur = dicPos + outSize; -+ curFinishMode = finishMode; -+ } -+ -+ res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status); -+ src += inSizeCur; -+ inSize -= inSizeCur; -+ *srcLen += inSizeCur; -+ outSizeCur = p->dicPos - dicPos; -+ memcpy(dest, p->dic + dicPos, outSizeCur); -+ dest += outSizeCur; -+ outSize -= outSizeCur; -+ *destLen += outSizeCur; -+ if (res != 0) -+ return res; -+ if (outSizeCur == 0 || outSize == 0) -+ return SZ_OK; -+ } -+} -+ -+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) -+{ -+ alloc->Free(alloc, p->probs); -+ p->probs = 0; -+} -+ -+static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc) -+{ -+ alloc->Free(alloc, p->dic); -+ p->dic = 0; -+} -+ -+void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc) -+{ -+ LzmaDec_FreeProbs(p, alloc); -+ LzmaDec_FreeDict(p, alloc); -+} -+ -+SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) -+{ -+ UInt32 dicSize; -+ Byte d; -+ -+ if (size < LZMA_PROPS_SIZE) -+ return SZ_ERROR_UNSUPPORTED; -+ else -+ dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24); -+ -+ if (dicSize < LZMA_DIC_MIN) -+ dicSize = LZMA_DIC_MIN; -+ p->dicSize = dicSize; -+ -+ d = data[0]; -+ if (d >= (9 * 5 * 5)) -+ return SZ_ERROR_UNSUPPORTED; -+ -+ p->lc = d % 9; -+ d /= 9; -+ p->pb = d / 5; -+ p->lp = d % 5; -+ -+ return SZ_OK; -+} -+ -+static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc) -+{ -+ UInt32 numProbs = LzmaProps_GetNumProbs(propNew); -+ if (p->probs == 0 || numProbs != p->numProbs) -+ { -+ LzmaDec_FreeProbs(p, alloc); -+ p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb)); -+ p->numProbs = numProbs; -+ if (p->probs == 0) -+ return SZ_ERROR_MEM; -+ } -+ return SZ_OK; -+} -+ -+SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) -+{ -+ CLzmaProps propNew; -+ RINOK(LzmaProps_Decode(&propNew, props, propsSize)); -+ RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); -+ p->prop = propNew; -+ return SZ_OK; -+} -+ -+SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) -+{ -+ CLzmaProps propNew; -+ SizeT dicBufSize; -+ RINOK(LzmaProps_Decode(&propNew, props, propsSize)); -+ RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); -+ dicBufSize = propNew.dicSize; -+ if (p->dic == 0 || dicBufSize != p->dicBufSize) -+ { -+ LzmaDec_FreeDict(p, alloc); -+ p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize); -+ if (p->dic == 0) -+ { -+ LzmaDec_FreeProbs(p, alloc); -+ return SZ_ERROR_MEM; -+ } -+ } -+ p->dicBufSize = dicBufSize; -+ p->prop = propNew; -+ return SZ_OK; -+} -+ -+SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, -+ const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, -+ ELzmaStatus *status, ISzAlloc *alloc) -+{ -+ CLzmaDec p; -+ SRes res; -+ SizeT inSize = *srcLen; -+ SizeT outSize = *destLen; -+ *srcLen = *destLen = 0; -+ if (inSize < RC_INIT_SIZE) -+ return SZ_ERROR_INPUT_EOF; -+ -+ LzmaDec_Construct(&p); -+ res = LzmaDec_AllocateProbs(&p, propData, propSize, alloc); -+ if (res != 0) -+ return res; -+ p.dic = dest; -+ p.dicBufSize = outSize; -+ -+ LzmaDec_Init(&p); -+ -+ *srcLen = inSize; -+ res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); -+ -+ if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) -+ res = SZ_ERROR_INPUT_EOF; -+ -+ (*destLen) = p.dicPos; -+ LzmaDec_FreeProbs(&p, alloc); -+ return res; -+} - -Property changes on: third_party/lzma_sdk/LzmaDec.c -___________________________________________________________________ -Added: svn:eol-style - + LF - -Index: third_party/lzma_sdk/README.ots -=================================================================== ---- third_party/lzma_sdk/README.ots (revision 0) -+++ third_party/lzma_sdk/README.ots (revision 0) -@@ -0,0 +1,8 @@ -+Name: LZMA SDK -+URL: http://www.7-zip.org/sdk.html -+Version: 9.20 -+ -+Description: -+The LZMA SDK provides the documentation, samples, header files, libraries, and tools you need to develop applications that use LZMA compression. -+ -+This contains only the C code required to decompress LZMA. -Index: third_party/lzma_sdk/lzma_sdk.gyp -=================================================================== ---- third_party/lzma_sdk/lzma_sdk.gyp (revision 0) -+++ third_party/lzma_sdk/lzma_sdk.gyp (revision 0) -@@ -0,0 +1,33 @@ -+# Copyright (c) 2012 The Chromium Authors. All rights reserved. -+# Use of this source code is governed by a BSD-style license that can be -+# found in the LICENSE file. -+ -+{ -+ 'targets': [ -+ { -+ 'target_name': 'lzma_sdk', -+ 'type': 'static_library', -+ 'defines': [ -+ '_7ZIP_ST', -+ '_LZMA_PROB32', -+ ], -+ 'sources': [ -+ 'Alloc.c', -+ 'Alloc.h', -+ 'LzFind.c', -+ 'LzFind.h', -+ 'LzHash.h', -+ 'LzmaEnc.c', -+ 'LzmaEnc.h', -+ 'LzmaDec.c', -+ 'LzmaDec.h', -+ 'LzmaLib.c', -+ 'LzmaLib.h', -+ 'Types.h', -+ ], -+ 'include_dirs': [ -+ '.', -+ ], -+ }, -+ ], -+} - -Property changes on: third_party/lzma_sdk/lzma_sdk.gyp -___________________________________________________________________ -Added: svn:eol-style - + LF - -Index: third_party/lzma_sdk/LzmaDec.h -=================================================================== ---- third_party/lzma_sdk/LzmaDec.h (revision 0) -+++ third_party/lzma_sdk/LzmaDec.h (revision 0) -@@ -0,0 +1,231 @@ -+/* LzmaDec.h -- LZMA Decoder -+2009-02-07 : Igor Pavlov : Public domain */ -+ -+#ifndef __LZMA_DEC_H -+#define __LZMA_DEC_H -+ -+#include "Types.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+/* #define _LZMA_PROB32 */ -+/* _LZMA_PROB32 can increase the speed on some CPUs, -+ but memory usage for CLzmaDec::probs will be doubled in that case */ -+ -+#ifdef _LZMA_PROB32 -+#define CLzmaProb UInt32 -+#else -+#define CLzmaProb UInt16 -+#endif -+ -+ -+/* ---------- LZMA Properties ---------- */ -+ -+#define LZMA_PROPS_SIZE 5 -+ -+typedef struct _CLzmaProps -+{ -+ unsigned lc, lp, pb; -+ UInt32 dicSize; -+} CLzmaProps; -+ -+/* LzmaProps_Decode - decodes properties -+Returns: -+ SZ_OK -+ SZ_ERROR_UNSUPPORTED - Unsupported properties -+*/ -+ -+SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); -+ -+ -+/* ---------- LZMA Decoder state ---------- */ -+ -+/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. -+ Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ -+ -+#define LZMA_REQUIRED_INPUT_MAX 20 -+ -+typedef struct -+{ -+ CLzmaProps prop; -+ CLzmaProb *probs; -+ Byte *dic; -+ const Byte *buf; -+ UInt32 range, code; -+ SizeT dicPos; -+ SizeT dicBufSize; -+ UInt32 processedPos; -+ UInt32 checkDicSize; -+ unsigned state; -+ UInt32 reps[4]; -+ unsigned remainLen; -+ int needFlush; -+ int needInitState; -+ UInt32 numProbs; -+ unsigned tempBufSize; -+ Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; -+} CLzmaDec; -+ -+#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } -+ -+void LzmaDec_Init(CLzmaDec *p); -+ -+/* There are two types of LZMA streams: -+ 0) Stream with end mark. That end mark adds about 6 bytes to compressed size. -+ 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ -+ -+typedef enum -+{ -+ LZMA_FINISH_ANY, /* finish at any point */ -+ LZMA_FINISH_END /* block must be finished at the end */ -+} ELzmaFinishMode; -+ -+/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! -+ -+ You must use LZMA_FINISH_END, when you know that current output buffer -+ covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. -+ -+ If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, -+ and output value of destLen will be less than output buffer size limit. -+ You can check status result also. -+ -+ You can use multiple checks to test data integrity after full decompression: -+ 1) Check Result and "status" variable. -+ 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. -+ 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. -+ You must use correct finish mode in that case. */ -+ -+typedef enum -+{ -+ LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ -+ LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ -+ LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ -+ LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */ -+ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */ -+} ELzmaStatus; -+ -+/* ELzmaStatus is used only as output value for function call */ -+ -+ -+/* ---------- Interfaces ---------- */ -+ -+/* There are 3 levels of interfaces: -+ 1) Dictionary Interface -+ 2) Buffer Interface -+ 3) One Call Interface -+ You can select any of these interfaces, but don't mix functions from different -+ groups for same object. */ -+ -+ -+/* There are two variants to allocate state for Dictionary Interface: -+ 1) LzmaDec_Allocate / LzmaDec_Free -+ 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs -+ You can use variant 2, if you set dictionary buffer manually. -+ For Buffer Interface you must always use variant 1. -+ -+LzmaDec_Allocate* can return: -+ SZ_OK -+ SZ_ERROR_MEM - Memory allocation error -+ SZ_ERROR_UNSUPPORTED - Unsupported properties -+*/ -+ -+SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc); -+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc); -+ -+SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc); -+void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); -+ -+/* ---------- Dictionary Interface ---------- */ -+ -+/* You can use it, if you want to eliminate the overhead for data copying from -+ dictionary to some other external buffer. -+ You must work with CLzmaDec variables directly in this interface. -+ -+ STEPS: -+ LzmaDec_Constr() -+ LzmaDec_Allocate() -+ for (each new stream) -+ { -+ LzmaDec_Init() -+ while (it needs more decompression) -+ { -+ LzmaDec_DecodeToDic() -+ use data from CLzmaDec::dic and update CLzmaDec::dicPos -+ } -+ } -+ LzmaDec_Free() -+*/ -+ -+/* LzmaDec_DecodeToDic -+ -+ The decoding to internal dictionary buffer (CLzmaDec::dic). -+ You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!! -+ -+finishMode: -+ It has meaning only if the decoding reaches output limit (dicLimit). -+ LZMA_FINISH_ANY - Decode just dicLimit bytes. -+ LZMA_FINISH_END - Stream must be finished after dicLimit. -+ -+Returns: -+ SZ_OK -+ status: -+ LZMA_STATUS_FINISHED_WITH_MARK -+ LZMA_STATUS_NOT_FINISHED -+ LZMA_STATUS_NEEDS_MORE_INPUT -+ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK -+ SZ_ERROR_DATA - Data error -+*/ -+ -+SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, -+ const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); -+ -+ -+/* ---------- Buffer Interface ---------- */ -+ -+/* It's zlib-like interface. -+ See LzmaDec_DecodeToDic description for information about STEPS and return results, -+ but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need -+ to work with CLzmaDec variables manually. -+ -+finishMode: -+ It has meaning only if the decoding reaches output limit (*destLen). -+ LZMA_FINISH_ANY - Decode just destLen bytes. -+ LZMA_FINISH_END - Stream must be finished after (*destLen). -+*/ -+ -+SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, -+ const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); -+ -+ -+/* ---------- One Call Interface ---------- */ -+ -+/* LzmaDecode -+ -+finishMode: -+ It has meaning only if the decoding reaches output limit (*destLen). -+ LZMA_FINISH_ANY - Decode just destLen bytes. -+ LZMA_FINISH_END - Stream must be finished after (*destLen). -+ -+Returns: -+ SZ_OK -+ status: -+ LZMA_STATUS_FINISHED_WITH_MARK -+ LZMA_STATUS_NOT_FINISHED -+ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK -+ SZ_ERROR_DATA - Data error -+ SZ_ERROR_MEM - Memory allocation error -+ SZ_ERROR_UNSUPPORTED - Unsupported properties -+ SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). -+*/ -+ -+SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, -+ const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, -+ ELzmaStatus *status, ISzAlloc *alloc); -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif - -Property changes on: third_party/lzma_sdk/LzmaDec.h -___________________________________________________________________ -Added: svn:eol-style - + LF - -Index: third_party/lzma_sdk/LzFind.c -=================================================================== ---- third_party/lzma_sdk/LzFind.c (revision 0) -+++ third_party/lzma_sdk/LzFind.c (revision 0) -@@ -0,0 +1,761 @@ -+/* LzFind.c -- Match finder for LZ algorithms -+2009-04-22 : Igor Pavlov : Public domain */ -+ -+#include -+ -+#include "LzFind.h" -+#include "LzHash.h" -+ -+#define kEmptyHashValue 0 -+#define kMaxValForNormalize ((UInt32)0xFFFFFFFF) -+#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */ -+#define kNormalizeMask (~(kNormalizeStepMin - 1)) -+#define kMaxHistorySize ((UInt32)3 << 30) -+ -+#define kStartMaxLen 3 -+ -+static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc) -+{ -+ if (!p->directInput) -+ { -+ alloc->Free(alloc, p->bufferBase); -+ p->bufferBase = 0; -+ } -+} -+ -+/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */ -+ -+static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc) -+{ -+ UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv; -+ if (p->directInput) -+ { -+ p->blockSize = blockSize; -+ return 1; -+ } -+ if (p->bufferBase == 0 || p->blockSize != blockSize) -+ { -+ LzInWindow_Free(p, alloc); -+ p->blockSize = blockSize; -+ p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize); -+ } -+ return (p->bufferBase != 0); -+} -+ -+Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } -+Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; } -+ -+UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; } -+ -+void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue) -+{ -+ p->posLimit -= subValue; -+ p->pos -= subValue; -+ p->streamPos -= subValue; -+} -+ -+static void MatchFinder_ReadBlock(CMatchFinder *p) -+{ -+ if (p->streamEndWasReached || p->result != SZ_OK) -+ return; -+ if (p->directInput) -+ { -+ UInt32 curSize = 0xFFFFFFFF - p->streamPos; -+ if (curSize > p->directInputRem) -+ curSize = (UInt32)p->directInputRem; -+ p->directInputRem -= curSize; -+ p->streamPos += curSize; -+ if (p->directInputRem == 0) -+ p->streamEndWasReached = 1; -+ return; -+ } -+ for (;;) -+ { -+ Byte *dest = p->buffer + (p->streamPos - p->pos); -+ size_t size = (p->bufferBase + p->blockSize - dest); -+ if (size == 0) -+ return; -+ p->result = p->stream->Read(p->stream, dest, &size); -+ if (p->result != SZ_OK) -+ return; -+ if (size == 0) -+ { -+ p->streamEndWasReached = 1; -+ return; -+ } -+ p->streamPos += (UInt32)size; -+ if (p->streamPos - p->pos > p->keepSizeAfter) -+ return; -+ } -+} -+ -+void MatchFinder_MoveBlock(CMatchFinder *p) -+{ -+ memmove(p->bufferBase, -+ p->buffer - p->keepSizeBefore, -+ (size_t)(p->streamPos - p->pos + p->keepSizeBefore)); -+ p->buffer = p->bufferBase + p->keepSizeBefore; -+} -+ -+int MatchFinder_NeedMove(CMatchFinder *p) -+{ -+ if (p->directInput) -+ return 0; -+ /* if (p->streamEndWasReached) return 0; */ -+ return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter); -+} -+ -+void MatchFinder_ReadIfRequired(CMatchFinder *p) -+{ -+ if (p->streamEndWasReached) -+ return; -+ if (p->keepSizeAfter >= p->streamPos - p->pos) -+ MatchFinder_ReadBlock(p); -+} -+ -+static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p) -+{ -+ if (MatchFinder_NeedMove(p)) -+ MatchFinder_MoveBlock(p); -+ MatchFinder_ReadBlock(p); -+} -+ -+static void MatchFinder_SetDefaultSettings(CMatchFinder *p) -+{ -+ p->cutValue = 32; -+ p->btMode = 1; -+ p->numHashBytes = 4; -+ p->bigHash = 0; -+} -+ -+#define kCrcPoly 0xEDB88320 -+ -+void MatchFinder_Construct(CMatchFinder *p) -+{ -+ UInt32 i; -+ p->bufferBase = 0; -+ p->directInput = 0; -+ p->hash = 0; -+ MatchFinder_SetDefaultSettings(p); -+ -+ for (i = 0; i < 256; i++) -+ { -+ UInt32 r = i; -+ int j; -+ for (j = 0; j < 8; j++) -+ r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); -+ p->crc[i] = r; -+ } -+} -+ -+static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc) -+{ -+ alloc->Free(alloc, p->hash); -+ p->hash = 0; -+} -+ -+void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc) -+{ -+ MatchFinder_FreeThisClassMemory(p, alloc); -+ LzInWindow_Free(p, alloc); -+} -+ -+static CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc) -+{ -+ size_t sizeInBytes = (size_t)num * sizeof(CLzRef); -+ if (sizeInBytes / sizeof(CLzRef) != num) -+ return 0; -+ return (CLzRef *)alloc->Alloc(alloc, sizeInBytes); -+} -+ -+int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, -+ UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, -+ ISzAlloc *alloc) -+{ -+ UInt32 sizeReserv; -+ if (historySize > kMaxHistorySize) -+ { -+ MatchFinder_Free(p, alloc); -+ return 0; -+ } -+ sizeReserv = historySize >> 1; -+ if (historySize > ((UInt32)2 << 30)) -+ sizeReserv = historySize >> 2; -+ sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19); -+ -+ p->keepSizeBefore = historySize + keepAddBufferBefore + 1; -+ p->keepSizeAfter = matchMaxLen + keepAddBufferAfter; -+ /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */ -+ if (LzInWindow_Create(p, sizeReserv, alloc)) -+ { -+ UInt32 newCyclicBufferSize = historySize + 1; -+ UInt32 hs; -+ p->matchMaxLen = matchMaxLen; -+ { -+ p->fixedHashSize = 0; -+ if (p->numHashBytes == 2) -+ hs = (1 << 16) - 1; -+ else -+ { -+ hs = historySize - 1; -+ hs |= (hs >> 1); -+ hs |= (hs >> 2); -+ hs |= (hs >> 4); -+ hs |= (hs >> 8); -+ hs >>= 1; -+ hs |= 0xFFFF; /* don't change it! It's required for Deflate */ -+ if (hs > (1 << 24)) -+ { -+ if (p->numHashBytes == 3) -+ hs = (1 << 24) - 1; -+ else -+ hs >>= 1; -+ } -+ } -+ p->hashMask = hs; -+ hs++; -+ if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size; -+ if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size; -+ if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size; -+ hs += p->fixedHashSize; -+ } -+ -+ { -+ UInt32 prevSize = p->hashSizeSum + p->numSons; -+ UInt32 newSize; -+ p->historySize = historySize; -+ p->hashSizeSum = hs; -+ p->cyclicBufferSize = newCyclicBufferSize; -+ p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize); -+ newSize = p->hashSizeSum + p->numSons; -+ if (p->hash != 0 && prevSize == newSize) -+ return 1; -+ MatchFinder_FreeThisClassMemory(p, alloc); -+ p->hash = AllocRefs(newSize, alloc); -+ if (p->hash != 0) -+ { -+ p->son = p->hash + p->hashSizeSum; -+ return 1; -+ } -+ } -+ } -+ MatchFinder_Free(p, alloc); -+ return 0; -+} -+ -+static void MatchFinder_SetLimits(CMatchFinder *p) -+{ -+ UInt32 limit = kMaxValForNormalize - p->pos; -+ UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos; -+ if (limit2 < limit) -+ limit = limit2; -+ limit2 = p->streamPos - p->pos; -+ if (limit2 <= p->keepSizeAfter) -+ { -+ if (limit2 > 0) -+ limit2 = 1; -+ } -+ else -+ limit2 -= p->keepSizeAfter; -+ if (limit2 < limit) -+ limit = limit2; -+ { -+ UInt32 lenLimit = p->streamPos - p->pos; -+ if (lenLimit > p->matchMaxLen) -+ lenLimit = p->matchMaxLen; -+ p->lenLimit = lenLimit; -+ } -+ p->posLimit = p->pos + limit; -+} -+ -+void MatchFinder_Init(CMatchFinder *p) -+{ -+ UInt32 i; -+ for (i = 0; i < p->hashSizeSum; i++) -+ p->hash[i] = kEmptyHashValue; -+ p->cyclicBufferPos = 0; -+ p->buffer = p->bufferBase; -+ p->pos = p->streamPos = p->cyclicBufferSize; -+ p->result = SZ_OK; -+ p->streamEndWasReached = 0; -+ MatchFinder_ReadBlock(p); -+ MatchFinder_SetLimits(p); -+} -+ -+static UInt32 MatchFinder_GetSubValue(CMatchFinder *p) -+{ -+ return (p->pos - p->historySize - 1) & kNormalizeMask; -+} -+ -+void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems) -+{ -+ UInt32 i; -+ for (i = 0; i < numItems; i++) -+ { -+ UInt32 value = items[i]; -+ if (value <= subValue) -+ value = kEmptyHashValue; -+ else -+ value -= subValue; -+ items[i] = value; -+ } -+} -+ -+static void MatchFinder_Normalize(CMatchFinder *p) -+{ -+ UInt32 subValue = MatchFinder_GetSubValue(p); -+ MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons); -+ MatchFinder_ReduceOffsets(p, subValue); -+} -+ -+static void MatchFinder_CheckLimits(CMatchFinder *p) -+{ -+ if (p->pos == kMaxValForNormalize) -+ MatchFinder_Normalize(p); -+ if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos) -+ MatchFinder_CheckAndMoveAndRead(p); -+ if (p->cyclicBufferPos == p->cyclicBufferSize) -+ p->cyclicBufferPos = 0; -+ MatchFinder_SetLimits(p); -+} -+ -+static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, -+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, -+ UInt32 *distances, UInt32 maxLen) -+{ -+ son[_cyclicBufferPos] = curMatch; -+ for (;;) -+ { -+ UInt32 delta = pos - curMatch; -+ if (cutValue-- == 0 || delta >= _cyclicBufferSize) -+ return distances; -+ { -+ const Byte *pb = cur - delta; -+ curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; -+ if (pb[maxLen] == cur[maxLen] && *pb == *cur) -+ { -+ UInt32 len = 0; -+ while (++len != lenLimit) -+ if (pb[len] != cur[len]) -+ break; -+ if (maxLen < len) -+ { -+ *distances++ = maxLen = len; -+ *distances++ = delta - 1; -+ if (len == lenLimit) -+ return distances; -+ } -+ } -+ } -+ } -+} -+ -+UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, -+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, -+ UInt32 *distances, UInt32 maxLen) -+{ -+ CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; -+ CLzRef *ptr1 = son + (_cyclicBufferPos << 1); -+ UInt32 len0 = 0, len1 = 0; -+ for (;;) -+ { -+ UInt32 delta = pos - curMatch; -+ if (cutValue-- == 0 || delta >= _cyclicBufferSize) -+ { -+ *ptr0 = *ptr1 = kEmptyHashValue; -+ return distances; -+ } -+ { -+ CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); -+ const Byte *pb = cur - delta; -+ UInt32 len = (len0 < len1 ? len0 : len1); -+ if (pb[len] == cur[len]) -+ { -+ if (++len != lenLimit && pb[len] == cur[len]) -+ while (++len != lenLimit) -+ if (pb[len] != cur[len]) -+ break; -+ if (maxLen < len) -+ { -+ *distances++ = maxLen = len; -+ *distances++ = delta - 1; -+ if (len == lenLimit) -+ { -+ *ptr1 = pair[0]; -+ *ptr0 = pair[1]; -+ return distances; -+ } -+ } -+ } -+ if (pb[len] < cur[len]) -+ { -+ *ptr1 = curMatch; -+ ptr1 = pair + 1; -+ curMatch = *ptr1; -+ len1 = len; -+ } -+ else -+ { -+ *ptr0 = curMatch; -+ ptr0 = pair; -+ curMatch = *ptr0; -+ len0 = len; -+ } -+ } -+ } -+} -+ -+static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, -+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue) -+{ -+ CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; -+ CLzRef *ptr1 = son + (_cyclicBufferPos << 1); -+ UInt32 len0 = 0, len1 = 0; -+ for (;;) -+ { -+ UInt32 delta = pos - curMatch; -+ if (cutValue-- == 0 || delta >= _cyclicBufferSize) -+ { -+ *ptr0 = *ptr1 = kEmptyHashValue; -+ return; -+ } -+ { -+ CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); -+ const Byte *pb = cur - delta; -+ UInt32 len = (len0 < len1 ? len0 : len1); -+ if (pb[len] == cur[len]) -+ { -+ while (++len != lenLimit) -+ if (pb[len] != cur[len]) -+ break; -+ { -+ if (len == lenLimit) -+ { -+ *ptr1 = pair[0]; -+ *ptr0 = pair[1]; -+ return; -+ } -+ } -+ } -+ if (pb[len] < cur[len]) -+ { -+ *ptr1 = curMatch; -+ ptr1 = pair + 1; -+ curMatch = *ptr1; -+ len1 = len; -+ } -+ else -+ { -+ *ptr0 = curMatch; -+ ptr0 = pair; -+ curMatch = *ptr0; -+ len0 = len; -+ } -+ } -+ } -+} -+ -+#define MOVE_POS \ -+ ++p->cyclicBufferPos; \ -+ p->buffer++; \ -+ if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p); -+ -+#define MOVE_POS_RET MOVE_POS return offset; -+ -+static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; } -+ -+#define GET_MATCHES_HEADER2(minLen, ret_op) \ -+ UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \ -+ lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ -+ cur = p->buffer; -+ -+#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0) -+#define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue) -+ -+#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue -+ -+#define GET_MATCHES_FOOTER(offset, maxLen) \ -+ offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \ -+ distances + offset, maxLen) - distances); MOVE_POS_RET; -+ -+#define SKIP_FOOTER \ -+ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS; -+ -+static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -+{ -+ UInt32 offset; -+ GET_MATCHES_HEADER(2) -+ HASH2_CALC; -+ curMatch = p->hash[hashValue]; -+ p->hash[hashValue] = p->pos; -+ offset = 0; -+ GET_MATCHES_FOOTER(offset, 1) -+} -+ -+UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -+{ -+ UInt32 offset; -+ GET_MATCHES_HEADER(3) -+ HASH_ZIP_CALC; -+ curMatch = p->hash[hashValue]; -+ p->hash[hashValue] = p->pos; -+ offset = 0; -+ GET_MATCHES_FOOTER(offset, 2) -+} -+ -+static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -+{ -+ UInt32 hash2Value, delta2, maxLen, offset; -+ GET_MATCHES_HEADER(3) -+ -+ HASH3_CALC; -+ -+ delta2 = p->pos - p->hash[hash2Value]; -+ curMatch = p->hash[kFix3HashSize + hashValue]; -+ -+ p->hash[hash2Value] = -+ p->hash[kFix3HashSize + hashValue] = p->pos; -+ -+ -+ maxLen = 2; -+ offset = 0; -+ if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) -+ { -+ for (; maxLen != lenLimit; maxLen++) -+ if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) -+ break; -+ distances[0] = maxLen; -+ distances[1] = delta2 - 1; -+ offset = 2; -+ if (maxLen == lenLimit) -+ { -+ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); -+ MOVE_POS_RET; -+ } -+ } -+ GET_MATCHES_FOOTER(offset, maxLen) -+} -+ -+static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -+{ -+ UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset; -+ GET_MATCHES_HEADER(4) -+ -+ HASH4_CALC; -+ -+ delta2 = p->pos - p->hash[ hash2Value]; -+ delta3 = p->pos - p->hash[kFix3HashSize + hash3Value]; -+ curMatch = p->hash[kFix4HashSize + hashValue]; -+ -+ p->hash[ hash2Value] = -+ p->hash[kFix3HashSize + hash3Value] = -+ p->hash[kFix4HashSize + hashValue] = p->pos; -+ -+ maxLen = 1; -+ offset = 0; -+ if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) -+ { -+ distances[0] = maxLen = 2; -+ distances[1] = delta2 - 1; -+ offset = 2; -+ } -+ if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur) -+ { -+ maxLen = 3; -+ distances[offset + 1] = delta3 - 1; -+ offset += 2; -+ delta2 = delta3; -+ } -+ if (offset != 0) -+ { -+ for (; maxLen != lenLimit; maxLen++) -+ if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) -+ break; -+ distances[offset - 2] = maxLen; -+ if (maxLen == lenLimit) -+ { -+ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); -+ MOVE_POS_RET; -+ } -+ } -+ if (maxLen < 3) -+ maxLen = 3; -+ GET_MATCHES_FOOTER(offset, maxLen) -+} -+ -+static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -+{ -+ UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset; -+ GET_MATCHES_HEADER(4) -+ -+ HASH4_CALC; -+ -+ delta2 = p->pos - p->hash[ hash2Value]; -+ delta3 = p->pos - p->hash[kFix3HashSize + hash3Value]; -+ curMatch = p->hash[kFix4HashSize + hashValue]; -+ -+ p->hash[ hash2Value] = -+ p->hash[kFix3HashSize + hash3Value] = -+ p->hash[kFix4HashSize + hashValue] = p->pos; -+ -+ maxLen = 1; -+ offset = 0; -+ if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) -+ { -+ distances[0] = maxLen = 2; -+ distances[1] = delta2 - 1; -+ offset = 2; -+ } -+ if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur) -+ { -+ maxLen = 3; -+ distances[offset + 1] = delta3 - 1; -+ offset += 2; -+ delta2 = delta3; -+ } -+ if (offset != 0) -+ { -+ for (; maxLen != lenLimit; maxLen++) -+ if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) -+ break; -+ distances[offset - 2] = maxLen; -+ if (maxLen == lenLimit) -+ { -+ p->son[p->cyclicBufferPos] = curMatch; -+ MOVE_POS_RET; -+ } -+ } -+ if (maxLen < 3) -+ maxLen = 3; -+ offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), -+ distances + offset, maxLen) - (distances)); -+ MOVE_POS_RET -+} -+ -+UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -+{ -+ UInt32 offset; -+ GET_MATCHES_HEADER(3) -+ HASH_ZIP_CALC; -+ curMatch = p->hash[hashValue]; -+ p->hash[hashValue] = p->pos; -+ offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), -+ distances, 2) - (distances)); -+ MOVE_POS_RET -+} -+ -+static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -+{ -+ do -+ { -+ SKIP_HEADER(2) -+ HASH2_CALC; -+ curMatch = p->hash[hashValue]; -+ p->hash[hashValue] = p->pos; -+ SKIP_FOOTER -+ } -+ while (--num != 0); -+} -+ -+void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -+{ -+ do -+ { -+ SKIP_HEADER(3) -+ HASH_ZIP_CALC; -+ curMatch = p->hash[hashValue]; -+ p->hash[hashValue] = p->pos; -+ SKIP_FOOTER -+ } -+ while (--num != 0); -+} -+ -+static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -+{ -+ do -+ { -+ UInt32 hash2Value; -+ SKIP_HEADER(3) -+ HASH3_CALC; -+ curMatch = p->hash[kFix3HashSize + hashValue]; -+ p->hash[hash2Value] = -+ p->hash[kFix3HashSize + hashValue] = p->pos; -+ SKIP_FOOTER -+ } -+ while (--num != 0); -+} -+ -+static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -+{ -+ do -+ { -+ UInt32 hash2Value, hash3Value; -+ SKIP_HEADER(4) -+ HASH4_CALC; -+ curMatch = p->hash[kFix4HashSize + hashValue]; -+ p->hash[ hash2Value] = -+ p->hash[kFix3HashSize + hash3Value] = p->pos; -+ p->hash[kFix4HashSize + hashValue] = p->pos; -+ SKIP_FOOTER -+ } -+ while (--num != 0); -+} -+ -+static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -+{ -+ do -+ { -+ UInt32 hash2Value, hash3Value; -+ SKIP_HEADER(4) -+ HASH4_CALC; -+ curMatch = p->hash[kFix4HashSize + hashValue]; -+ p->hash[ hash2Value] = -+ p->hash[kFix3HashSize + hash3Value] = -+ p->hash[kFix4HashSize + hashValue] = p->pos; -+ p->son[p->cyclicBufferPos] = curMatch; -+ MOVE_POS -+ } -+ while (--num != 0); -+} -+ -+void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -+{ -+ do -+ { -+ SKIP_HEADER(3) -+ HASH_ZIP_CALC; -+ curMatch = p->hash[hashValue]; -+ p->hash[hashValue] = p->pos; -+ p->son[p->cyclicBufferPos] = curMatch; -+ MOVE_POS -+ } -+ while (--num != 0); -+} -+ -+void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable) -+{ -+ vTable->Init = (Mf_Init_Func)MatchFinder_Init; -+ vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte; -+ vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes; -+ vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos; -+ if (!p->btMode) -+ { -+ vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches; -+ vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip; -+ } -+ else if (p->numHashBytes == 2) -+ { -+ vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches; -+ vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip; -+ } -+ else if (p->numHashBytes == 3) -+ { -+ vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches; -+ vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip; -+ } -+ else -+ { -+ vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; -+ vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; -+ } -+} - -Property changes on: third_party/lzma_sdk/LzFind.c -___________________________________________________________________ -Added: svn:eol-style - + LF - -Index: third_party/lzma_sdk/LzmaEnc.c -=================================================================== ---- third_party/lzma_sdk/LzmaEnc.c (revision 0) -+++ third_party/lzma_sdk/LzmaEnc.c (revision 0) -@@ -0,0 +1,2268 @@ -+/* LzmaEnc.c -- LZMA Encoder -+2010-04-16 : Igor Pavlov : Public domain */ -+ -+#include -+ -+/* #define SHOW_STAT */ -+/* #define SHOW_STAT2 */ -+ -+#if defined(SHOW_STAT) || defined(SHOW_STAT2) -+#include -+#endif -+ -+#include "LzmaEnc.h" -+ -+#include "LzFind.h" -+#ifndef _7ZIP_ST -+#include "LzFindMt.h" -+#endif -+ -+#ifdef SHOW_STAT -+static int ttt = 0; -+#endif -+ -+#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1) -+ -+#define kBlockSize (9 << 10) -+#define kUnpackBlockSize (1 << 18) -+#define kMatchArraySize (1 << 21) -+#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX) -+ -+#define kNumMaxDirectBits (31) -+ -+#define kNumTopBits 24 -+#define kTopValue ((UInt32)1 << kNumTopBits) -+ -+#define kNumBitModelTotalBits 11 -+#define kBitModelTotal (1 << kNumBitModelTotalBits) -+#define kNumMoveBits 5 -+#define kProbInitValue (kBitModelTotal >> 1) -+ -+#define kNumMoveReducingBits 4 -+#define kNumBitPriceShiftBits 4 -+#define kBitPrice (1 << kNumBitPriceShiftBits) -+ -+void LzmaEncProps_Init(CLzmaEncProps *p) -+{ -+ p->level = 5; -+ p->dictSize = p->mc = 0; -+ p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1; -+ p->writeEndMark = 0; -+} -+ -+void LzmaEncProps_Normalize(CLzmaEncProps *p) -+{ -+ int level = p->level; -+ if (level < 0) level = 5; -+ p->level = level; -+ if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26))); -+ if (p->lc < 0) p->lc = 3; -+ if (p->lp < 0) p->lp = 0; -+ if (p->pb < 0) p->pb = 2; -+ if (p->algo < 0) p->algo = (level < 5 ? 0 : 1); -+ if (p->fb < 0) p->fb = (level < 7 ? 32 : 64); -+ if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1); -+ if (p->numHashBytes < 0) p->numHashBytes = 4; -+ if (p->mc == 0) p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1); -+ if (p->numThreads < 0) -+ p->numThreads = -+ #ifndef _7ZIP_ST -+ ((p->btMode && p->algo) ? 2 : 1); -+ #else -+ 1; -+ #endif -+} -+ -+UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2) -+{ -+ CLzmaEncProps props = *props2; -+ LzmaEncProps_Normalize(&props); -+ return props.dictSize; -+} -+ -+/* #define LZMA_LOG_BSR */ -+/* Define it for Intel's CPU */ -+ -+ -+#ifdef LZMA_LOG_BSR -+ -+#define kDicLogSizeMaxCompress 30 -+ -+#define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); } -+ -+UInt32 GetPosSlot1(UInt32 pos) -+{ -+ UInt32 res; -+ BSR2_RET(pos, res); -+ return res; -+} -+#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } -+#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); } -+ -+#else -+ -+#define kNumLogBits (9 + (int)sizeof(size_t) / 2) -+#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7) -+ -+void LzmaEnc_FastPosInit(Byte *g_FastPos) -+{ -+ int c = 2, slotFast; -+ g_FastPos[0] = 0; -+ g_FastPos[1] = 1; -+ -+ for (slotFast = 2; slotFast < kNumLogBits * 2; slotFast++) -+ { -+ UInt32 k = (1 << ((slotFast >> 1) - 1)); -+ UInt32 j; -+ for (j = 0; j < k; j++, c++) -+ g_FastPos[c] = (Byte)slotFast; -+ } -+} -+ -+#define BSR2_RET(pos, res) { UInt32 i = 6 + ((kNumLogBits - 1) & \ -+ (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \ -+ res = p->g_FastPos[pos >> i] + (i * 2); } -+/* -+#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \ -+ p->g_FastPos[pos >> 6] + 12 : \ -+ p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; } -+*/ -+ -+#define GetPosSlot1(pos) p->g_FastPos[pos] -+#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } -+#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); } -+ -+#endif -+ -+ -+#define LZMA_NUM_REPS 4 -+ -+typedef unsigned CState; -+ -+typedef struct -+{ -+ UInt32 price; -+ -+ CState state; -+ int prev1IsChar; -+ int prev2; -+ -+ UInt32 posPrev2; -+ UInt32 backPrev2; -+ -+ UInt32 posPrev; -+ UInt32 backPrev; -+ UInt32 backs[LZMA_NUM_REPS]; -+} COptimal; -+ -+#define kNumOpts (1 << 12) -+ -+#define kNumLenToPosStates 4 -+#define kNumPosSlotBits 6 -+#define kDicLogSizeMin 0 -+#define kDicLogSizeMax 32 -+#define kDistTableSizeMax (kDicLogSizeMax * 2) -+ -+ -+#define kNumAlignBits 4 -+#define kAlignTableSize (1 << kNumAlignBits) -+#define kAlignMask (kAlignTableSize - 1) -+ -+#define kStartPosModelIndex 4 -+#define kEndPosModelIndex 14 -+#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex) -+ -+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) -+ -+#ifdef _LZMA_PROB32 -+#define CLzmaProb UInt32 -+#else -+#define CLzmaProb UInt16 -+#endif -+ -+#define LZMA_PB_MAX 4 -+#define LZMA_LC_MAX 8 -+#define LZMA_LP_MAX 4 -+ -+#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX) -+ -+ -+#define kLenNumLowBits 3 -+#define kLenNumLowSymbols (1 << kLenNumLowBits) -+#define kLenNumMidBits 3 -+#define kLenNumMidSymbols (1 << kLenNumMidBits) -+#define kLenNumHighBits 8 -+#define kLenNumHighSymbols (1 << kLenNumHighBits) -+ -+#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) -+ -+#define LZMA_MATCH_LEN_MIN 2 -+#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1) -+ -+#define kNumStates 12 -+ -+typedef struct -+{ -+ CLzmaProb choice; -+ CLzmaProb choice2; -+ CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits]; -+ CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits]; -+ CLzmaProb high[kLenNumHighSymbols]; -+} CLenEnc; -+ -+typedef struct -+{ -+ CLenEnc p; -+ UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal]; -+ UInt32 tableSize; -+ UInt32 counters[LZMA_NUM_PB_STATES_MAX]; -+} CLenPriceEnc; -+ -+typedef struct -+{ -+ UInt32 range; -+ Byte cache; -+ UInt64 low; -+ UInt64 cacheSize; -+ Byte *buf; -+ Byte *bufLim; -+ Byte *bufBase; -+ ISeqOutStream *outStream; -+ UInt64 processed; -+ SRes res; -+} CRangeEnc; -+ -+typedef struct -+{ -+ CLzmaProb *litProbs; -+ -+ CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; -+ CLzmaProb isRep[kNumStates]; -+ CLzmaProb isRepG0[kNumStates]; -+ CLzmaProb isRepG1[kNumStates]; -+ CLzmaProb isRepG2[kNumStates]; -+ CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; -+ -+ CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; -+ CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; -+ CLzmaProb posAlignEncoder[1 << kNumAlignBits]; -+ -+ CLenPriceEnc lenEnc; -+ CLenPriceEnc repLenEnc; -+ -+ UInt32 reps[LZMA_NUM_REPS]; -+ UInt32 state; -+} CSaveState; -+ -+typedef struct -+{ -+ IMatchFinder matchFinder; -+ void *matchFinderObj; -+ -+ #ifndef _7ZIP_ST -+ Bool mtMode; -+ CMatchFinderMt matchFinderMt; -+ #endif -+ -+ CMatchFinder matchFinderBase; -+ -+ #ifndef _7ZIP_ST -+ Byte pad[128]; -+ #endif -+ -+ UInt32 optimumEndIndex; -+ UInt32 optimumCurrentIndex; -+ -+ UInt32 longestMatchLength; -+ UInt32 numPairs; -+ UInt32 numAvail; -+ COptimal opt[kNumOpts]; -+ -+ #ifndef LZMA_LOG_BSR -+ Byte g_FastPos[1 << kNumLogBits]; -+ #endif -+ -+ UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; -+ UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1]; -+ UInt32 numFastBytes; -+ UInt32 additionalOffset; -+ UInt32 reps[LZMA_NUM_REPS]; -+ UInt32 state; -+ -+ UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; -+ UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances]; -+ UInt32 alignPrices[kAlignTableSize]; -+ UInt32 alignPriceCount; -+ -+ UInt32 distTableSize; -+ -+ unsigned lc, lp, pb; -+ unsigned lpMask, pbMask; -+ -+ CLzmaProb *litProbs; -+ -+ CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; -+ CLzmaProb isRep[kNumStates]; -+ CLzmaProb isRepG0[kNumStates]; -+ CLzmaProb isRepG1[kNumStates]; -+ CLzmaProb isRepG2[kNumStates]; -+ CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; -+ -+ CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; -+ CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; -+ CLzmaProb posAlignEncoder[1 << kNumAlignBits]; -+ -+ CLenPriceEnc lenEnc; -+ CLenPriceEnc repLenEnc; -+ -+ unsigned lclp; -+ -+ Bool fastMode; -+ -+ CRangeEnc rc; -+ -+ Bool writeEndMark; -+ UInt64 nowPos64; -+ UInt32 matchPriceCount; -+ Bool finished; -+ Bool multiThread; -+ -+ SRes result; -+ UInt32 dictSize; -+ UInt32 matchFinderCycles; -+ -+ int needInit; -+ -+ CSaveState saveState; -+} CLzmaEnc; -+ -+void LzmaEnc_SaveState(CLzmaEncHandle pp) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ CSaveState *dest = &p->saveState; -+ int i; -+ dest->lenEnc = p->lenEnc; -+ dest->repLenEnc = p->repLenEnc; -+ dest->state = p->state; -+ -+ for (i = 0; i < kNumStates; i++) -+ { -+ memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); -+ memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); -+ } -+ for (i = 0; i < kNumLenToPosStates; i++) -+ memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); -+ memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); -+ memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); -+ memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); -+ memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); -+ memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); -+ memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); -+ memcpy(dest->reps, p->reps, sizeof(p->reps)); -+ memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb)); -+} -+ -+void LzmaEnc_RestoreState(CLzmaEncHandle pp) -+{ -+ CLzmaEnc *dest = (CLzmaEnc *)pp; -+ const CSaveState *p = &dest->saveState; -+ int i; -+ dest->lenEnc = p->lenEnc; -+ dest->repLenEnc = p->repLenEnc; -+ dest->state = p->state; -+ -+ for (i = 0; i < kNumStates; i++) -+ { -+ memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); -+ memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); -+ } -+ for (i = 0; i < kNumLenToPosStates; i++) -+ memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); -+ memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); -+ memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); -+ memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); -+ memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); -+ memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); -+ memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); -+ memcpy(dest->reps, p->reps, sizeof(p->reps)); -+ memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb)); -+} -+ -+SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ CLzmaEncProps props = *props2; -+ LzmaEncProps_Normalize(&props); -+ -+ if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX || -+ props.dictSize > ((UInt32)1 << kDicLogSizeMaxCompress) || props.dictSize > ((UInt32)1 << 30)) -+ return SZ_ERROR_PARAM; -+ p->dictSize = props.dictSize; -+ p->matchFinderCycles = props.mc; -+ { -+ unsigned fb = props.fb; -+ if (fb < 5) -+ fb = 5; -+ if (fb > LZMA_MATCH_LEN_MAX) -+ fb = LZMA_MATCH_LEN_MAX; -+ p->numFastBytes = fb; -+ } -+ p->lc = props.lc; -+ p->lp = props.lp; -+ p->pb = props.pb; -+ p->fastMode = (props.algo == 0); -+ p->matchFinderBase.btMode = props.btMode; -+ { -+ UInt32 numHashBytes = 4; -+ if (props.btMode) -+ { -+ if (props.numHashBytes < 2) -+ numHashBytes = 2; -+ else if (props.numHashBytes < 4) -+ numHashBytes = props.numHashBytes; -+ } -+ p->matchFinderBase.numHashBytes = numHashBytes; -+ } -+ -+ p->matchFinderBase.cutValue = props.mc; -+ -+ p->writeEndMark = props.writeEndMark; -+ -+ #ifndef _7ZIP_ST -+ /* -+ if (newMultiThread != _multiThread) -+ { -+ ReleaseMatchFinder(); -+ _multiThread = newMultiThread; -+ } -+ */ -+ p->multiThread = (props.numThreads > 1); -+ #endif -+ -+ return SZ_OK; -+} -+ -+static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; -+static const int kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; -+static const int kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; -+static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; -+ -+#define IsCharState(s) ((s) < 7) -+ -+#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1) -+ -+#define kInfinityPrice (1 << 30) -+ -+static void RangeEnc_Construct(CRangeEnc *p) -+{ -+ p->outStream = 0; -+ p->bufBase = 0; -+} -+ -+#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize) -+ -+#define RC_BUF_SIZE (1 << 16) -+static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc) -+{ -+ if (p->bufBase == 0) -+ { -+ p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE); -+ if (p->bufBase == 0) -+ return 0; -+ p->bufLim = p->bufBase + RC_BUF_SIZE; -+ } -+ return 1; -+} -+ -+static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc) -+{ -+ alloc->Free(alloc, p->bufBase); -+ p->bufBase = 0; -+} -+ -+static void RangeEnc_Init(CRangeEnc *p) -+{ -+ /* Stream.Init(); */ -+ p->low = 0; -+ p->range = 0xFFFFFFFF; -+ p->cacheSize = 1; -+ p->cache = 0; -+ -+ p->buf = p->bufBase; -+ -+ p->processed = 0; -+ p->res = SZ_OK; -+} -+ -+static void RangeEnc_FlushStream(CRangeEnc *p) -+{ -+ size_t num; -+ if (p->res != SZ_OK) -+ return; -+ num = p->buf - p->bufBase; -+ if (num != p->outStream->Write(p->outStream, p->bufBase, num)) -+ p->res = SZ_ERROR_WRITE; -+ p->processed += num; -+ p->buf = p->bufBase; -+} -+ -+static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p) -+{ -+ if ((UInt32)p->low < (UInt32)0xFF000000 || (int)(p->low >> 32) != 0) -+ { -+ Byte temp = p->cache; -+ do -+ { -+ Byte *buf = p->buf; -+ *buf++ = (Byte)(temp + (Byte)(p->low >> 32)); -+ p->buf = buf; -+ if (buf == p->bufLim) -+ RangeEnc_FlushStream(p); -+ temp = 0xFF; -+ } -+ while (--p->cacheSize != 0); -+ p->cache = (Byte)((UInt32)p->low >> 24); -+ } -+ p->cacheSize++; -+ p->low = (UInt32)p->low << 8; -+} -+ -+static void RangeEnc_FlushData(CRangeEnc *p) -+{ -+ int i; -+ for (i = 0; i < 5; i++) -+ RangeEnc_ShiftLow(p); -+} -+ -+static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, int numBits) -+{ -+ do -+ { -+ p->range >>= 1; -+ p->low += p->range & (0 - ((value >> --numBits) & 1)); -+ if (p->range < kTopValue) -+ { -+ p->range <<= 8; -+ RangeEnc_ShiftLow(p); -+ } -+ } -+ while (numBits != 0); -+} -+ -+static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol) -+{ -+ UInt32 ttt = *prob; -+ UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt; -+ if (symbol == 0) -+ { -+ p->range = newBound; -+ ttt += (kBitModelTotal - ttt) >> kNumMoveBits; -+ } -+ else -+ { -+ p->low += newBound; -+ p->range -= newBound; -+ ttt -= ttt >> kNumMoveBits; -+ } -+ *prob = (CLzmaProb)ttt; -+ if (p->range < kTopValue) -+ { -+ p->range <<= 8; -+ RangeEnc_ShiftLow(p); -+ } -+} -+ -+static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol) -+{ -+ symbol |= 0x100; -+ do -+ { -+ RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1); -+ symbol <<= 1; -+ } -+ while (symbol < 0x10000); -+} -+ -+static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte) -+{ -+ UInt32 offs = 0x100; -+ symbol |= 0x100; -+ do -+ { -+ matchByte <<= 1; -+ RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1); -+ symbol <<= 1; -+ offs &= ~(matchByte ^ symbol); -+ } -+ while (symbol < 0x10000); -+} -+ -+void LzmaEnc_InitPriceTables(UInt32 *ProbPrices) -+{ -+ UInt32 i; -+ for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits)) -+ { -+ const int kCyclesBits = kNumBitPriceShiftBits; -+ UInt32 w = i; -+ UInt32 bitCount = 0; -+ int j; -+ for (j = 0; j < kCyclesBits; j++) -+ { -+ w = w * w; -+ bitCount <<= 1; -+ while (w >= ((UInt32)1 << 16)) -+ { -+ w >>= 1; -+ bitCount++; -+ } -+ } -+ ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount); -+ } -+} -+ -+ -+#define GET_PRICE(prob, symbol) \ -+ p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; -+ -+#define GET_PRICEa(prob, symbol) \ -+ ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; -+ -+#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits] -+#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] -+ -+#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits] -+#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] -+ -+static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 *ProbPrices) -+{ -+ UInt32 price = 0; -+ symbol |= 0x100; -+ do -+ { -+ price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1); -+ symbol <<= 1; -+ } -+ while (symbol < 0x10000); -+ return price; -+} -+ -+static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, UInt32 *ProbPrices) -+{ -+ UInt32 price = 0; -+ UInt32 offs = 0x100; -+ symbol |= 0x100; -+ do -+ { -+ matchByte <<= 1; -+ price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1); -+ symbol <<= 1; -+ offs &= ~(matchByte ^ symbol); -+ } -+ while (symbol < 0x10000); -+ return price; -+} -+ -+ -+static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) -+{ -+ UInt32 m = 1; -+ int i; -+ for (i = numBitLevels; i != 0;) -+ { -+ UInt32 bit; -+ i--; -+ bit = (symbol >> i) & 1; -+ RangeEnc_EncodeBit(rc, probs + m, bit); -+ m = (m << 1) | bit; -+ } -+} -+ -+static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) -+{ -+ UInt32 m = 1; -+ int i; -+ for (i = 0; i < numBitLevels; i++) -+ { -+ UInt32 bit = symbol & 1; -+ RangeEnc_EncodeBit(rc, probs + m, bit); -+ m = (m << 1) | bit; -+ symbol >>= 1; -+ } -+} -+ -+static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) -+{ -+ UInt32 price = 0; -+ symbol |= (1 << numBitLevels); -+ while (symbol != 1) -+ { -+ price += GET_PRICEa(probs[symbol >> 1], symbol & 1); -+ symbol >>= 1; -+ } -+ return price; -+} -+ -+static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) -+{ -+ UInt32 price = 0; -+ UInt32 m = 1; -+ int i; -+ for (i = numBitLevels; i != 0; i--) -+ { -+ UInt32 bit = symbol & 1; -+ symbol >>= 1; -+ price += GET_PRICEa(probs[m], bit); -+ m = (m << 1) | bit; -+ } -+ return price; -+} -+ -+ -+static void LenEnc_Init(CLenEnc *p) -+{ -+ unsigned i; -+ p->choice = p->choice2 = kProbInitValue; -+ for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++) -+ p->low[i] = kProbInitValue; -+ for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++) -+ p->mid[i] = kProbInitValue; -+ for (i = 0; i < kLenNumHighSymbols; i++) -+ p->high[i] = kProbInitValue; -+} -+ -+static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState) -+{ -+ if (symbol < kLenNumLowSymbols) -+ { -+ RangeEnc_EncodeBit(rc, &p->choice, 0); -+ RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol); -+ } -+ else -+ { -+ RangeEnc_EncodeBit(rc, &p->choice, 1); -+ if (symbol < kLenNumLowSymbols + kLenNumMidSymbols) -+ { -+ RangeEnc_EncodeBit(rc, &p->choice2, 0); -+ RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols); -+ } -+ else -+ { -+ RangeEnc_EncodeBit(rc, &p->choice2, 1); -+ RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols); -+ } -+ } -+} -+ -+static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, UInt32 *ProbPrices) -+{ -+ UInt32 a0 = GET_PRICE_0a(p->choice); -+ UInt32 a1 = GET_PRICE_1a(p->choice); -+ UInt32 b0 = a1 + GET_PRICE_0a(p->choice2); -+ UInt32 b1 = a1 + GET_PRICE_1a(p->choice2); -+ UInt32 i = 0; -+ for (i = 0; i < kLenNumLowSymbols; i++) -+ { -+ if (i >= numSymbols) -+ return; -+ prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices); -+ } -+ for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++) -+ { -+ if (i >= numSymbols) -+ return; -+ prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices); -+ } -+ for (; i < numSymbols; i++) -+ prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices); -+} -+ -+static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, UInt32 *ProbPrices) -+{ -+ LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices); -+ p->counters[posState] = p->tableSize; -+} -+ -+static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, UInt32 *ProbPrices) -+{ -+ UInt32 posState; -+ for (posState = 0; posState < numPosStates; posState++) -+ LenPriceEnc_UpdateTable(p, posState, ProbPrices); -+} -+ -+static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, UInt32 *ProbPrices) -+{ -+ LenEnc_Encode(&p->p, rc, symbol, posState); -+ if (updatePrice) -+ if (--p->counters[posState] == 0) -+ LenPriceEnc_UpdateTable(p, posState, ProbPrices); -+} -+ -+ -+ -+ -+static void MovePos(CLzmaEnc *p, UInt32 num) -+{ -+ #ifdef SHOW_STAT -+ ttt += num; -+ printf("\n MovePos %d", num); -+ #endif -+ if (num != 0) -+ { -+ p->additionalOffset += num; -+ p->matchFinder.Skip(p->matchFinderObj, num); -+ } -+} -+ -+static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes) -+{ -+ UInt32 lenRes = 0, numPairs; -+ p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); -+ numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches); -+ #ifdef SHOW_STAT -+ printf("\n i = %d numPairs = %d ", ttt, numPairs / 2); -+ ttt++; -+ { -+ UInt32 i; -+ for (i = 0; i < numPairs; i += 2) -+ printf("%2d %6d | ", p->matches[i], p->matches[i + 1]); -+ } -+ #endif -+ if (numPairs > 0) -+ { -+ lenRes = p->matches[numPairs - 2]; -+ if (lenRes == p->numFastBytes) -+ { -+ const Byte *pby = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; -+ UInt32 distance = p->matches[numPairs - 1] + 1; -+ UInt32 numAvail = p->numAvail; -+ if (numAvail > LZMA_MATCH_LEN_MAX) -+ numAvail = LZMA_MATCH_LEN_MAX; -+ { -+ const Byte *pby2 = pby - distance; -+ for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++); -+ } -+ } -+ } -+ p->additionalOffset++; -+ *numDistancePairsRes = numPairs; -+ return lenRes; -+} -+ -+ -+#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False; -+#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False; -+#define IsShortRep(p) ((p)->backPrev == 0) -+ -+static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState) -+{ -+ return -+ GET_PRICE_0(p->isRepG0[state]) + -+ GET_PRICE_0(p->isRep0Long[state][posState]); -+} -+ -+static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState) -+{ -+ UInt32 price; -+ if (repIndex == 0) -+ { -+ price = GET_PRICE_0(p->isRepG0[state]); -+ price += GET_PRICE_1(p->isRep0Long[state][posState]); -+ } -+ else -+ { -+ price = GET_PRICE_1(p->isRepG0[state]); -+ if (repIndex == 1) -+ price += GET_PRICE_0(p->isRepG1[state]); -+ else -+ { -+ price += GET_PRICE_1(p->isRepG1[state]); -+ price += GET_PRICE(p->isRepG2[state], repIndex - 2); -+ } -+ } -+ return price; -+} -+ -+static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState) -+{ -+ return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] + -+ GetPureRepPrice(p, repIndex, state, posState); -+} -+ -+static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur) -+{ -+ UInt32 posMem = p->opt[cur].posPrev; -+ UInt32 backMem = p->opt[cur].backPrev; -+ p->optimumEndIndex = cur; -+ do -+ { -+ if (p->opt[cur].prev1IsChar) -+ { -+ MakeAsChar(&p->opt[posMem]) -+ p->opt[posMem].posPrev = posMem - 1; -+ if (p->opt[cur].prev2) -+ { -+ p->opt[posMem - 1].prev1IsChar = False; -+ p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2; -+ p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2; -+ } -+ } -+ { -+ UInt32 posPrev = posMem; -+ UInt32 backCur = backMem; -+ -+ backMem = p->opt[posPrev].backPrev; -+ posMem = p->opt[posPrev].posPrev; -+ -+ p->opt[posPrev].backPrev = backCur; -+ p->opt[posPrev].posPrev = cur; -+ cur = posPrev; -+ } -+ } -+ while (cur != 0); -+ *backRes = p->opt[0].backPrev; -+ p->optimumCurrentIndex = p->opt[0].posPrev; -+ return p->optimumCurrentIndex; -+} -+ -+#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * 0x300) -+ -+static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes) -+{ -+ UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, lenEnd, len, cur; -+ UInt32 matchPrice, repMatchPrice, normalMatchPrice; -+ UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS]; -+ UInt32 *matches; -+ const Byte *data; -+ Byte curByte, matchByte; -+ if (p->optimumEndIndex != p->optimumCurrentIndex) -+ { -+ const COptimal *opt = &p->opt[p->optimumCurrentIndex]; -+ UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex; -+ *backRes = opt->backPrev; -+ p->optimumCurrentIndex = opt->posPrev; -+ return lenRes; -+ } -+ p->optimumCurrentIndex = p->optimumEndIndex = 0; -+ -+ if (p->additionalOffset == 0) -+ mainLen = ReadMatchDistances(p, &numPairs); -+ else -+ { -+ mainLen = p->longestMatchLength; -+ numPairs = p->numPairs; -+ } -+ -+ numAvail = p->numAvail; -+ if (numAvail < 2) -+ { -+ *backRes = (UInt32)(-1); -+ return 1; -+ } -+ if (numAvail > LZMA_MATCH_LEN_MAX) -+ numAvail = LZMA_MATCH_LEN_MAX; -+ -+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; -+ repMaxIndex = 0; -+ for (i = 0; i < LZMA_NUM_REPS; i++) -+ { -+ UInt32 lenTest; -+ const Byte *data2; -+ reps[i] = p->reps[i]; -+ data2 = data - (reps[i] + 1); -+ if (data[0] != data2[0] || data[1] != data2[1]) -+ { -+ repLens[i] = 0; -+ continue; -+ } -+ for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); -+ repLens[i] = lenTest; -+ if (lenTest > repLens[repMaxIndex]) -+ repMaxIndex = i; -+ } -+ if (repLens[repMaxIndex] >= p->numFastBytes) -+ { -+ UInt32 lenRes; -+ *backRes = repMaxIndex; -+ lenRes = repLens[repMaxIndex]; -+ MovePos(p, lenRes - 1); -+ return lenRes; -+ } -+ -+ matches = p->matches; -+ if (mainLen >= p->numFastBytes) -+ { -+ *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; -+ MovePos(p, mainLen - 1); -+ return mainLen; -+ } -+ curByte = *data; -+ matchByte = *(data - (reps[0] + 1)); -+ -+ if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2) -+ { -+ *backRes = (UInt32)-1; -+ return 1; -+ } -+ -+ p->opt[0].state = (CState)p->state; -+ -+ posState = (position & p->pbMask); -+ -+ { -+ const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); -+ p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) + -+ (!IsCharState(p->state) ? -+ LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : -+ LitEnc_GetPrice(probs, curByte, p->ProbPrices)); -+ } -+ -+ MakeAsChar(&p->opt[1]); -+ -+ matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); -+ repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); -+ -+ if (matchByte == curByte) -+ { -+ UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState); -+ if (shortRepPrice < p->opt[1].price) -+ { -+ p->opt[1].price = shortRepPrice; -+ MakeAsShortRep(&p->opt[1]); -+ } -+ } -+ lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]); -+ -+ if (lenEnd < 2) -+ { -+ *backRes = p->opt[1].backPrev; -+ return 1; -+ } -+ -+ p->opt[1].posPrev = 0; -+ for (i = 0; i < LZMA_NUM_REPS; i++) -+ p->opt[0].backs[i] = reps[i]; -+ -+ len = lenEnd; -+ do -+ p->opt[len--].price = kInfinityPrice; -+ while (len >= 2); -+ -+ for (i = 0; i < LZMA_NUM_REPS; i++) -+ { -+ UInt32 repLen = repLens[i]; -+ UInt32 price; -+ if (repLen < 2) -+ continue; -+ price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState); -+ do -+ { -+ UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2]; -+ COptimal *opt = &p->opt[repLen]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = 0; -+ opt->backPrev = i; -+ opt->prev1IsChar = False; -+ } -+ } -+ while (--repLen >= 2); -+ } -+ -+ normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); -+ -+ len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); -+ if (len <= mainLen) -+ { -+ UInt32 offs = 0; -+ while (len > matches[offs]) -+ offs += 2; -+ for (; ; len++) -+ { -+ COptimal *opt; -+ UInt32 distance = matches[offs + 1]; -+ -+ UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN]; -+ UInt32 lenToPosState = GetLenToPosState(len); -+ if (distance < kNumFullDistances) -+ curAndLenPrice += p->distancesPrices[lenToPosState][distance]; -+ else -+ { -+ UInt32 slot; -+ GetPosSlot2(distance, slot); -+ curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot]; -+ } -+ opt = &p->opt[len]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = 0; -+ opt->backPrev = distance + LZMA_NUM_REPS; -+ opt->prev1IsChar = False; -+ } -+ if (len == matches[offs]) -+ { -+ offs += 2; -+ if (offs == numPairs) -+ break; -+ } -+ } -+ } -+ -+ cur = 0; -+ -+ #ifdef SHOW_STAT2 -+ if (position >= 0) -+ { -+ unsigned i; -+ printf("\n pos = %4X", position); -+ for (i = cur; i <= lenEnd; i++) -+ printf("\nprice[%4X] = %d", position - cur + i, p->opt[i].price); -+ } -+ #endif -+ -+ for (;;) -+ { -+ UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen; -+ UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice; -+ Bool nextIsChar; -+ Byte curByte, matchByte; -+ const Byte *data; -+ COptimal *curOpt; -+ COptimal *nextOpt; -+ -+ cur++; -+ if (cur == lenEnd) -+ return Backward(p, backRes, cur); -+ -+ newLen = ReadMatchDistances(p, &numPairs); -+ if (newLen >= p->numFastBytes) -+ { -+ p->numPairs = numPairs; -+ p->longestMatchLength = newLen; -+ return Backward(p, backRes, cur); -+ } -+ position++; -+ curOpt = &p->opt[cur]; -+ posPrev = curOpt->posPrev; -+ if (curOpt->prev1IsChar) -+ { -+ posPrev--; -+ if (curOpt->prev2) -+ { -+ state = p->opt[curOpt->posPrev2].state; -+ if (curOpt->backPrev2 < LZMA_NUM_REPS) -+ state = kRepNextStates[state]; -+ else -+ state = kMatchNextStates[state]; -+ } -+ else -+ state = p->opt[posPrev].state; -+ state = kLiteralNextStates[state]; -+ } -+ else -+ state = p->opt[posPrev].state; -+ if (posPrev == cur - 1) -+ { -+ if (IsShortRep(curOpt)) -+ state = kShortRepNextStates[state]; -+ else -+ state = kLiteralNextStates[state]; -+ } -+ else -+ { -+ UInt32 pos; -+ const COptimal *prevOpt; -+ if (curOpt->prev1IsChar && curOpt->prev2) -+ { -+ posPrev = curOpt->posPrev2; -+ pos = curOpt->backPrev2; -+ state = kRepNextStates[state]; -+ } -+ else -+ { -+ pos = curOpt->backPrev; -+ if (pos < LZMA_NUM_REPS) -+ state = kRepNextStates[state]; -+ else -+ state = kMatchNextStates[state]; -+ } -+ prevOpt = &p->opt[posPrev]; -+ if (pos < LZMA_NUM_REPS) -+ { -+ UInt32 i; -+ reps[0] = prevOpt->backs[pos]; -+ for (i = 1; i <= pos; i++) -+ reps[i] = prevOpt->backs[i - 1]; -+ for (; i < LZMA_NUM_REPS; i++) -+ reps[i] = prevOpt->backs[i]; -+ } -+ else -+ { -+ UInt32 i; -+ reps[0] = (pos - LZMA_NUM_REPS); -+ for (i = 1; i < LZMA_NUM_REPS; i++) -+ reps[i] = prevOpt->backs[i - 1]; -+ } -+ } -+ curOpt->state = (CState)state; -+ -+ curOpt->backs[0] = reps[0]; -+ curOpt->backs[1] = reps[1]; -+ curOpt->backs[2] = reps[2]; -+ curOpt->backs[3] = reps[3]; -+ -+ curPrice = curOpt->price; -+ nextIsChar = False; -+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; -+ curByte = *data; -+ matchByte = *(data - (reps[0] + 1)); -+ -+ posState = (position & p->pbMask); -+ -+ curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]); -+ { -+ const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); -+ curAnd1Price += -+ (!IsCharState(state) ? -+ LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : -+ LitEnc_GetPrice(probs, curByte, p->ProbPrices)); -+ } -+ -+ nextOpt = &p->opt[cur + 1]; -+ -+ if (curAnd1Price < nextOpt->price) -+ { -+ nextOpt->price = curAnd1Price; -+ nextOpt->posPrev = cur; -+ MakeAsChar(nextOpt); -+ nextIsChar = True; -+ } -+ -+ matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]); -+ repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]); -+ -+ if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0)) -+ { -+ UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState); -+ if (shortRepPrice <= nextOpt->price) -+ { -+ nextOpt->price = shortRepPrice; -+ nextOpt->posPrev = cur; -+ MakeAsShortRep(nextOpt); -+ nextIsChar = True; -+ } -+ } -+ numAvailFull = p->numAvail; -+ { -+ UInt32 temp = kNumOpts - 1 - cur; -+ if (temp < numAvailFull) -+ numAvailFull = temp; -+ } -+ -+ if (numAvailFull < 2) -+ continue; -+ numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes); -+ -+ if (!nextIsChar && matchByte != curByte) /* speed optimization */ -+ { -+ /* try Literal + rep0 */ -+ UInt32 temp; -+ UInt32 lenTest2; -+ const Byte *data2 = data - (reps[0] + 1); -+ UInt32 limit = p->numFastBytes + 1; -+ if (limit > numAvailFull) -+ limit = numAvailFull; -+ -+ for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++); -+ lenTest2 = temp - 1; -+ if (lenTest2 >= 2) -+ { -+ UInt32 state2 = kLiteralNextStates[state]; -+ UInt32 posStateNext = (position + 1) & p->pbMask; -+ UInt32 nextRepMatchPrice = curAnd1Price + -+ GET_PRICE_1(p->isMatch[state2][posStateNext]) + -+ GET_PRICE_1(p->isRep[state2]); -+ /* for (; lenTest2 >= 2; lenTest2--) */ -+ { -+ UInt32 curAndLenPrice; -+ COptimal *opt; -+ UInt32 offset = cur + 1 + lenTest2; -+ while (lenEnd < offset) -+ p->opt[++lenEnd].price = kInfinityPrice; -+ curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); -+ opt = &p->opt[offset]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = cur + 1; -+ opt->backPrev = 0; -+ opt->prev1IsChar = True; -+ opt->prev2 = False; -+ } -+ } -+ } -+ } -+ -+ startLen = 2; /* speed optimization */ -+ { -+ UInt32 repIndex; -+ for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++) -+ { -+ UInt32 lenTest; -+ UInt32 lenTestTemp; -+ UInt32 price; -+ const Byte *data2 = data - (reps[repIndex] + 1); -+ if (data[0] != data2[0] || data[1] != data2[1]) -+ continue; -+ for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); -+ while (lenEnd < cur + lenTest) -+ p->opt[++lenEnd].price = kInfinityPrice; -+ lenTestTemp = lenTest; -+ price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState); -+ do -+ { -+ UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2]; -+ COptimal *opt = &p->opt[cur + lenTest]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = cur; -+ opt->backPrev = repIndex; -+ opt->prev1IsChar = False; -+ } -+ } -+ while (--lenTest >= 2); -+ lenTest = lenTestTemp; -+ -+ if (repIndex == 0) -+ startLen = lenTest + 1; -+ -+ /* if (_maxMode) */ -+ { -+ UInt32 lenTest2 = lenTest + 1; -+ UInt32 limit = lenTest2 + p->numFastBytes; -+ UInt32 nextRepMatchPrice; -+ if (limit > numAvailFull) -+ limit = numAvailFull; -+ for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); -+ lenTest2 -= lenTest + 1; -+ if (lenTest2 >= 2) -+ { -+ UInt32 state2 = kRepNextStates[state]; -+ UInt32 posStateNext = (position + lenTest) & p->pbMask; -+ UInt32 curAndLenCharPrice = -+ price + p->repLenEnc.prices[posState][lenTest - 2] + -+ GET_PRICE_0(p->isMatch[state2][posStateNext]) + -+ LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), -+ data[lenTest], data2[lenTest], p->ProbPrices); -+ state2 = kLiteralNextStates[state2]; -+ posStateNext = (position + lenTest + 1) & p->pbMask; -+ nextRepMatchPrice = curAndLenCharPrice + -+ GET_PRICE_1(p->isMatch[state2][posStateNext]) + -+ GET_PRICE_1(p->isRep[state2]); -+ -+ /* for (; lenTest2 >= 2; lenTest2--) */ -+ { -+ UInt32 curAndLenPrice; -+ COptimal *opt; -+ UInt32 offset = cur + lenTest + 1 + lenTest2; -+ while (lenEnd < offset) -+ p->opt[++lenEnd].price = kInfinityPrice; -+ curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); -+ opt = &p->opt[offset]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = cur + lenTest + 1; -+ opt->backPrev = 0; -+ opt->prev1IsChar = True; -+ opt->prev2 = True; -+ opt->posPrev2 = cur; -+ opt->backPrev2 = repIndex; -+ } -+ } -+ } -+ } -+ } -+ } -+ /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */ -+ if (newLen > numAvail) -+ { -+ newLen = numAvail; -+ for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2); -+ matches[numPairs] = newLen; -+ numPairs += 2; -+ } -+ if (newLen >= startLen) -+ { -+ UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]); -+ UInt32 offs, curBack, posSlot; -+ UInt32 lenTest; -+ while (lenEnd < cur + newLen) -+ p->opt[++lenEnd].price = kInfinityPrice; -+ -+ offs = 0; -+ while (startLen > matches[offs]) -+ offs += 2; -+ curBack = matches[offs + 1]; -+ GetPosSlot2(curBack, posSlot); -+ for (lenTest = /*2*/ startLen; ; lenTest++) -+ { -+ UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN]; -+ UInt32 lenToPosState = GetLenToPosState(lenTest); -+ COptimal *opt; -+ if (curBack < kNumFullDistances) -+ curAndLenPrice += p->distancesPrices[lenToPosState][curBack]; -+ else -+ curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask]; -+ -+ opt = &p->opt[cur + lenTest]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = cur; -+ opt->backPrev = curBack + LZMA_NUM_REPS; -+ opt->prev1IsChar = False; -+ } -+ -+ if (/*_maxMode && */lenTest == matches[offs]) -+ { -+ /* Try Match + Literal + Rep0 */ -+ const Byte *data2 = data - (curBack + 1); -+ UInt32 lenTest2 = lenTest + 1; -+ UInt32 limit = lenTest2 + p->numFastBytes; -+ UInt32 nextRepMatchPrice; -+ if (limit > numAvailFull) -+ limit = numAvailFull; -+ for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); -+ lenTest2 -= lenTest + 1; -+ if (lenTest2 >= 2) -+ { -+ UInt32 state2 = kMatchNextStates[state]; -+ UInt32 posStateNext = (position + lenTest) & p->pbMask; -+ UInt32 curAndLenCharPrice = curAndLenPrice + -+ GET_PRICE_0(p->isMatch[state2][posStateNext]) + -+ LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), -+ data[lenTest], data2[lenTest], p->ProbPrices); -+ state2 = kLiteralNextStates[state2]; -+ posStateNext = (posStateNext + 1) & p->pbMask; -+ nextRepMatchPrice = curAndLenCharPrice + -+ GET_PRICE_1(p->isMatch[state2][posStateNext]) + -+ GET_PRICE_1(p->isRep[state2]); -+ -+ /* for (; lenTest2 >= 2; lenTest2--) */ -+ { -+ UInt32 offset = cur + lenTest + 1 + lenTest2; -+ UInt32 curAndLenPrice; -+ COptimal *opt; -+ while (lenEnd < offset) -+ p->opt[++lenEnd].price = kInfinityPrice; -+ curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); -+ opt = &p->opt[offset]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = cur + lenTest + 1; -+ opt->backPrev = 0; -+ opt->prev1IsChar = True; -+ opt->prev2 = True; -+ opt->posPrev2 = cur; -+ opt->backPrev2 = curBack + LZMA_NUM_REPS; -+ } -+ } -+ } -+ offs += 2; -+ if (offs == numPairs) -+ break; -+ curBack = matches[offs + 1]; -+ if (curBack >= kNumFullDistances) -+ GetPosSlot2(curBack, posSlot); -+ } -+ } -+ } -+ } -+} -+ -+#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist)) -+ -+static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes) -+{ -+ UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i; -+ const Byte *data; -+ const UInt32 *matches; -+ -+ if (p->additionalOffset == 0) -+ mainLen = ReadMatchDistances(p, &numPairs); -+ else -+ { -+ mainLen = p->longestMatchLength; -+ numPairs = p->numPairs; -+ } -+ -+ numAvail = p->numAvail; -+ *backRes = (UInt32)-1; -+ if (numAvail < 2) -+ return 1; -+ if (numAvail > LZMA_MATCH_LEN_MAX) -+ numAvail = LZMA_MATCH_LEN_MAX; -+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; -+ -+ repLen = repIndex = 0; -+ for (i = 0; i < LZMA_NUM_REPS; i++) -+ { -+ UInt32 len; -+ const Byte *data2 = data - (p->reps[i] + 1); -+ if (data[0] != data2[0] || data[1] != data2[1]) -+ continue; -+ for (len = 2; len < numAvail && data[len] == data2[len]; len++); -+ if (len >= p->numFastBytes) -+ { -+ *backRes = i; -+ MovePos(p, len - 1); -+ return len; -+ } -+ if (len > repLen) -+ { -+ repIndex = i; -+ repLen = len; -+ } -+ } -+ -+ matches = p->matches; -+ if (mainLen >= p->numFastBytes) -+ { -+ *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; -+ MovePos(p, mainLen - 1); -+ return mainLen; -+ } -+ -+ mainDist = 0; /* for GCC */ -+ if (mainLen >= 2) -+ { -+ mainDist = matches[numPairs - 1]; -+ while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1) -+ { -+ if (!ChangePair(matches[numPairs - 3], mainDist)) -+ break; -+ numPairs -= 2; -+ mainLen = matches[numPairs - 2]; -+ mainDist = matches[numPairs - 1]; -+ } -+ if (mainLen == 2 && mainDist >= 0x80) -+ mainLen = 1; -+ } -+ -+ if (repLen >= 2 && ( -+ (repLen + 1 >= mainLen) || -+ (repLen + 2 >= mainLen && mainDist >= (1 << 9)) || -+ (repLen + 3 >= mainLen && mainDist >= (1 << 15)))) -+ { -+ *backRes = repIndex; -+ MovePos(p, repLen - 1); -+ return repLen; -+ } -+ -+ if (mainLen < 2 || numAvail <= 2) -+ return 1; -+ -+ p->longestMatchLength = ReadMatchDistances(p, &p->numPairs); -+ if (p->longestMatchLength >= 2) -+ { -+ UInt32 newDistance = matches[p->numPairs - 1]; -+ if ((p->longestMatchLength >= mainLen && newDistance < mainDist) || -+ (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) || -+ (p->longestMatchLength > mainLen + 1) || -+ (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist))) -+ return 1; -+ } -+ -+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; -+ for (i = 0; i < LZMA_NUM_REPS; i++) -+ { -+ UInt32 len, limit; -+ const Byte *data2 = data - (p->reps[i] + 1); -+ if (data[0] != data2[0] || data[1] != data2[1]) -+ continue; -+ limit = mainLen - 1; -+ for (len = 2; len < limit && data[len] == data2[len]; len++); -+ if (len >= limit) -+ return 1; -+ } -+ *backRes = mainDist + LZMA_NUM_REPS; -+ MovePos(p, mainLen - 2); -+ return mainLen; -+} -+ -+static void WriteEndMarker(CLzmaEnc *p, UInt32 posState) -+{ -+ UInt32 len; -+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); -+ RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); -+ p->state = kMatchNextStates[p->state]; -+ len = LZMA_MATCH_LEN_MIN; -+ LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); -+ RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1); -+ RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits); -+ RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask); -+} -+ -+static SRes CheckErrors(CLzmaEnc *p) -+{ -+ if (p->result != SZ_OK) -+ return p->result; -+ if (p->rc.res != SZ_OK) -+ p->result = SZ_ERROR_WRITE; -+ if (p->matchFinderBase.result != SZ_OK) -+ p->result = SZ_ERROR_READ; -+ if (p->result != SZ_OK) -+ p->finished = True; -+ return p->result; -+} -+ -+static SRes Flush(CLzmaEnc *p, UInt32 nowPos) -+{ -+ /* ReleaseMFStream(); */ -+ p->finished = True; -+ if (p->writeEndMark) -+ WriteEndMarker(p, nowPos & p->pbMask); -+ RangeEnc_FlushData(&p->rc); -+ RangeEnc_FlushStream(&p->rc); -+ return CheckErrors(p); -+} -+ -+static void FillAlignPrices(CLzmaEnc *p) -+{ -+ UInt32 i; -+ for (i = 0; i < kAlignTableSize; i++) -+ p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices); -+ p->alignPriceCount = 0; -+} -+ -+static void FillDistancesPrices(CLzmaEnc *p) -+{ -+ UInt32 tempPrices[kNumFullDistances]; -+ UInt32 i, lenToPosState; -+ for (i = kStartPosModelIndex; i < kNumFullDistances; i++) -+ { -+ UInt32 posSlot = GetPosSlot1(i); -+ UInt32 footerBits = ((posSlot >> 1) - 1); -+ UInt32 base = ((2 | (posSlot & 1)) << footerBits); -+ tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices); -+ } -+ -+ for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++) -+ { -+ UInt32 posSlot; -+ const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState]; -+ UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState]; -+ for (posSlot = 0; posSlot < p->distTableSize; posSlot++) -+ posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices); -+ for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++) -+ posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits); -+ -+ { -+ UInt32 *distancesPrices = p->distancesPrices[lenToPosState]; -+ UInt32 i; -+ for (i = 0; i < kStartPosModelIndex; i++) -+ distancesPrices[i] = posSlotPrices[i]; -+ for (; i < kNumFullDistances; i++) -+ distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i]; -+ } -+ } -+ p->matchPriceCount = 0; -+} -+ -+void LzmaEnc_Construct(CLzmaEnc *p) -+{ -+ RangeEnc_Construct(&p->rc); -+ MatchFinder_Construct(&p->matchFinderBase); -+ #ifndef _7ZIP_ST -+ MatchFinderMt_Construct(&p->matchFinderMt); -+ p->matchFinderMt.MatchFinder = &p->matchFinderBase; -+ #endif -+ -+ { -+ CLzmaEncProps props; -+ LzmaEncProps_Init(&props); -+ LzmaEnc_SetProps(p, &props); -+ } -+ -+ #ifndef LZMA_LOG_BSR -+ LzmaEnc_FastPosInit(p->g_FastPos); -+ #endif -+ -+ LzmaEnc_InitPriceTables(p->ProbPrices); -+ p->litProbs = 0; -+ p->saveState.litProbs = 0; -+} -+ -+CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc) -+{ -+ void *p; -+ p = alloc->Alloc(alloc, sizeof(CLzmaEnc)); -+ if (p != 0) -+ LzmaEnc_Construct((CLzmaEnc *)p); -+ return p; -+} -+ -+void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc) -+{ -+ alloc->Free(alloc, p->litProbs); -+ alloc->Free(alloc, p->saveState.litProbs); -+ p->litProbs = 0; -+ p->saveState.litProbs = 0; -+} -+ -+void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ #ifndef _7ZIP_ST -+ MatchFinderMt_Destruct(&p->matchFinderMt, allocBig); -+ #endif -+ MatchFinder_Free(&p->matchFinderBase, allocBig); -+ LzmaEnc_FreeLits(p, alloc); -+ RangeEnc_Free(&p->rc, alloc); -+} -+ -+void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig); -+ alloc->Free(alloc, p); -+} -+ -+static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize) -+{ -+ UInt32 nowPos32, startPos32; -+ if (p->needInit) -+ { -+ p->matchFinder.Init(p->matchFinderObj); -+ p->needInit = 0; -+ } -+ -+ if (p->finished) -+ return p->result; -+ RINOK(CheckErrors(p)); -+ -+ nowPos32 = (UInt32)p->nowPos64; -+ startPos32 = nowPos32; -+ -+ if (p->nowPos64 == 0) -+ { -+ UInt32 numPairs; -+ Byte curByte; -+ if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) -+ return Flush(p, nowPos32); -+ ReadMatchDistances(p, &numPairs); -+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0); -+ p->state = kLiteralNextStates[p->state]; -+ curByte = p->matchFinder.GetIndexByte(p->matchFinderObj, 0 - p->additionalOffset); -+ LitEnc_Encode(&p->rc, p->litProbs, curByte); -+ p->additionalOffset--; -+ nowPos32++; -+ } -+ -+ if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0) -+ for (;;) -+ { -+ UInt32 pos, len, posState; -+ -+ if (p->fastMode) -+ len = GetOptimumFast(p, &pos); -+ else -+ len = GetOptimum(p, nowPos32, &pos); -+ -+ #ifdef SHOW_STAT2 -+ printf("\n pos = %4X, len = %d pos = %d", nowPos32, len, pos); -+ #endif -+ -+ posState = nowPos32 & p->pbMask; -+ if (len == 1 && pos == (UInt32)-1) -+ { -+ Byte curByte; -+ CLzmaProb *probs; -+ const Byte *data; -+ -+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0); -+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; -+ curByte = *data; -+ probs = LIT_PROBS(nowPos32, *(data - 1)); -+ if (IsCharState(p->state)) -+ LitEnc_Encode(&p->rc, probs, curByte); -+ else -+ LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1)); -+ p->state = kLiteralNextStates[p->state]; -+ } -+ else -+ { -+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); -+ if (pos < LZMA_NUM_REPS) -+ { -+ RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1); -+ if (pos == 0) -+ { -+ RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0); -+ RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1)); -+ } -+ else -+ { -+ UInt32 distance = p->reps[pos]; -+ RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1); -+ if (pos == 1) -+ RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0); -+ else -+ { -+ RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1); -+ RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2); -+ if (pos == 3) -+ p->reps[3] = p->reps[2]; -+ p->reps[2] = p->reps[1]; -+ } -+ p->reps[1] = p->reps[0]; -+ p->reps[0] = distance; -+ } -+ if (len == 1) -+ p->state = kShortRepNextStates[p->state]; -+ else -+ { -+ LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); -+ p->state = kRepNextStates[p->state]; -+ } -+ } -+ else -+ { -+ UInt32 posSlot; -+ RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); -+ p->state = kMatchNextStates[p->state]; -+ LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); -+ pos -= LZMA_NUM_REPS; -+ GetPosSlot(pos, posSlot); -+ RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot); -+ -+ if (posSlot >= kStartPosModelIndex) -+ { -+ UInt32 footerBits = ((posSlot >> 1) - 1); -+ UInt32 base = ((2 | (posSlot & 1)) << footerBits); -+ UInt32 posReduced = pos - base; -+ -+ if (posSlot < kEndPosModelIndex) -+ RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced); -+ else -+ { -+ RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits); -+ RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask); -+ p->alignPriceCount++; -+ } -+ } -+ p->reps[3] = p->reps[2]; -+ p->reps[2] = p->reps[1]; -+ p->reps[1] = p->reps[0]; -+ p->reps[0] = pos; -+ p->matchPriceCount++; -+ } -+ } -+ p->additionalOffset -= len; -+ nowPos32 += len; -+ if (p->additionalOffset == 0) -+ { -+ UInt32 processed; -+ if (!p->fastMode) -+ { -+ if (p->matchPriceCount >= (1 << 7)) -+ FillDistancesPrices(p); -+ if (p->alignPriceCount >= kAlignTableSize) -+ FillAlignPrices(p); -+ } -+ if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) -+ break; -+ processed = nowPos32 - startPos32; -+ if (useLimits) -+ { -+ if (processed + kNumOpts + 300 >= maxUnpackSize || -+ RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize) -+ break; -+ } -+ else if (processed >= (1 << 15)) -+ { -+ p->nowPos64 += nowPos32 - startPos32; -+ return CheckErrors(p); -+ } -+ } -+ } -+ p->nowPos64 += nowPos32 - startPos32; -+ return Flush(p, nowPos32); -+} -+ -+#define kBigHashDicLimit ((UInt32)1 << 24) -+ -+static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ UInt32 beforeSize = kNumOpts; -+ Bool btMode; -+ if (!RangeEnc_Alloc(&p->rc, alloc)) -+ return SZ_ERROR_MEM; -+ btMode = (p->matchFinderBase.btMode != 0); -+ #ifndef _7ZIP_ST -+ p->mtMode = (p->multiThread && !p->fastMode && btMode); -+ #endif -+ -+ { -+ unsigned lclp = p->lc + p->lp; -+ if (p->litProbs == 0 || p->saveState.litProbs == 0 || p->lclp != lclp) -+ { -+ LzmaEnc_FreeLits(p, alloc); -+ p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); -+ p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); -+ if (p->litProbs == 0 || p->saveState.litProbs == 0) -+ { -+ LzmaEnc_FreeLits(p, alloc); -+ return SZ_ERROR_MEM; -+ } -+ p->lclp = lclp; -+ } -+ } -+ -+ p->matchFinderBase.bigHash = (p->dictSize > kBigHashDicLimit); -+ -+ if (beforeSize + p->dictSize < keepWindowSize) -+ beforeSize = keepWindowSize - p->dictSize; -+ -+ #ifndef _7ZIP_ST -+ if (p->mtMode) -+ { -+ RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)); -+ p->matchFinderObj = &p->matchFinderMt; -+ MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder); -+ } -+ else -+ #endif -+ { -+ if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)) -+ return SZ_ERROR_MEM; -+ p->matchFinderObj = &p->matchFinderBase; -+ MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder); -+ } -+ return SZ_OK; -+} -+ -+void LzmaEnc_Init(CLzmaEnc *p) -+{ -+ UInt32 i; -+ p->state = 0; -+ for (i = 0 ; i < LZMA_NUM_REPS; i++) -+ p->reps[i] = 0; -+ -+ RangeEnc_Init(&p->rc); -+ -+ -+ for (i = 0; i < kNumStates; i++) -+ { -+ UInt32 j; -+ for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++) -+ { -+ p->isMatch[i][j] = kProbInitValue; -+ p->isRep0Long[i][j] = kProbInitValue; -+ } -+ p->isRep[i] = kProbInitValue; -+ p->isRepG0[i] = kProbInitValue; -+ p->isRepG1[i] = kProbInitValue; -+ p->isRepG2[i] = kProbInitValue; -+ } -+ -+ { -+ UInt32 num = 0x300 << (p->lp + p->lc); -+ for (i = 0; i < num; i++) -+ p->litProbs[i] = kProbInitValue; -+ } -+ -+ { -+ for (i = 0; i < kNumLenToPosStates; i++) -+ { -+ CLzmaProb *probs = p->posSlotEncoder[i]; -+ UInt32 j; -+ for (j = 0; j < (1 << kNumPosSlotBits); j++) -+ probs[j] = kProbInitValue; -+ } -+ } -+ { -+ for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++) -+ p->posEncoders[i] = kProbInitValue; -+ } -+ -+ LenEnc_Init(&p->lenEnc.p); -+ LenEnc_Init(&p->repLenEnc.p); -+ -+ for (i = 0; i < (1 << kNumAlignBits); i++) -+ p->posAlignEncoder[i] = kProbInitValue; -+ -+ p->optimumEndIndex = 0; -+ p->optimumCurrentIndex = 0; -+ p->additionalOffset = 0; -+ -+ p->pbMask = (1 << p->pb) - 1; -+ p->lpMask = (1 << p->lp) - 1; -+} -+ -+void LzmaEnc_InitPrices(CLzmaEnc *p) -+{ -+ if (!p->fastMode) -+ { -+ FillDistancesPrices(p); -+ FillAlignPrices(p); -+ } -+ -+ p->lenEnc.tableSize = -+ p->repLenEnc.tableSize = -+ p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN; -+ LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices); -+ LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices); -+} -+ -+static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ UInt32 i; -+ for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++) -+ if (p->dictSize <= ((UInt32)1 << i)) -+ break; -+ p->distTableSize = i * 2; -+ -+ p->finished = False; -+ p->result = SZ_OK; -+ RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig)); -+ LzmaEnc_Init(p); -+ LzmaEnc_InitPrices(p); -+ p->nowPos64 = 0; -+ return SZ_OK; -+} -+ -+static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, -+ ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ p->matchFinderBase.stream = inStream; -+ p->needInit = 1; -+ p->rc.outStream = outStream; -+ return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig); -+} -+ -+SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, -+ ISeqInStream *inStream, UInt32 keepWindowSize, -+ ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ p->matchFinderBase.stream = inStream; -+ p->needInit = 1; -+ return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); -+} -+ -+static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen) -+{ -+ p->matchFinderBase.directInput = 1; -+ p->matchFinderBase.bufferBase = (Byte *)src; -+ p->matchFinderBase.directInputRem = srcLen; -+} -+ -+SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, -+ UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ LzmaEnc_SetInputBuf(p, src, srcLen); -+ p->needInit = 1; -+ -+ return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); -+} -+ -+void LzmaEnc_Finish(CLzmaEncHandle pp) -+{ -+ #ifndef _7ZIP_ST -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ if (p->mtMode) -+ MatchFinderMt_ReleaseStream(&p->matchFinderMt); -+ #else -+ pp = pp; -+ #endif -+} -+ -+typedef struct -+{ -+ ISeqOutStream funcTable; -+ Byte *data; -+ SizeT rem; -+ Bool overflow; -+} CSeqOutStreamBuf; -+ -+static size_t MyWrite(void *pp, const void *data, size_t size) -+{ -+ CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp; -+ if (p->rem < size) -+ { -+ size = p->rem; -+ p->overflow = True; -+ } -+ memcpy(p->data, data, size); -+ p->rem -= size; -+ p->data += size; -+ return size; -+} -+ -+ -+UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp) -+{ -+ const CLzmaEnc *p = (CLzmaEnc *)pp; -+ return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); -+} -+ -+const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp) -+{ -+ const CLzmaEnc *p = (CLzmaEnc *)pp; -+ return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; -+} -+ -+SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit, -+ Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ UInt64 nowPos64; -+ SRes res; -+ CSeqOutStreamBuf outStream; -+ -+ outStream.funcTable.Write = MyWrite; -+ outStream.data = dest; -+ outStream.rem = *destLen; -+ outStream.overflow = False; -+ -+ p->writeEndMark = False; -+ p->finished = False; -+ p->result = SZ_OK; -+ -+ if (reInit) -+ LzmaEnc_Init(p); -+ LzmaEnc_InitPrices(p); -+ nowPos64 = p->nowPos64; -+ RangeEnc_Init(&p->rc); -+ p->rc.outStream = &outStream.funcTable; -+ -+ res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize); -+ -+ *unpackSize = (UInt32)(p->nowPos64 - nowPos64); -+ *destLen -= outStream.rem; -+ if (outStream.overflow) -+ return SZ_ERROR_OUTPUT_EOF; -+ -+ return res; -+} -+ -+static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress) -+{ -+ SRes res = SZ_OK; -+ -+ #ifndef _7ZIP_ST -+ Byte allocaDummy[0x300]; -+ int i = 0; -+ for (i = 0; i < 16; i++) -+ allocaDummy[i] = (Byte)i; -+ #endif -+ -+ for (;;) -+ { -+ res = LzmaEnc_CodeOneBlock(p, False, 0, 0); -+ if (res != SZ_OK || p->finished != 0) -+ break; -+ if (progress != 0) -+ { -+ res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc)); -+ if (res != SZ_OK) -+ { -+ res = SZ_ERROR_PROGRESS; -+ break; -+ } -+ } -+ } -+ LzmaEnc_Finish(p); -+ return res; -+} -+ -+SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress, -+ ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig)); -+ return LzmaEnc_Encode2((CLzmaEnc *)pp, progress); -+} -+ -+SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ int i; -+ UInt32 dictSize = p->dictSize; -+ if (*size < LZMA_PROPS_SIZE) -+ return SZ_ERROR_PARAM; -+ *size = LZMA_PROPS_SIZE; -+ props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc); -+ -+ for (i = 11; i <= 30; i++) -+ { -+ if (dictSize <= ((UInt32)2 << i)) -+ { -+ dictSize = (2 << i); -+ break; -+ } -+ if (dictSize <= ((UInt32)3 << i)) -+ { -+ dictSize = (3 << i); -+ break; -+ } -+ } -+ -+ for (i = 0; i < 4; i++) -+ props[1 + i] = (Byte)(dictSize >> (8 * i)); -+ return SZ_OK; -+} -+ -+SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, -+ int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ SRes res; -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ -+ CSeqOutStreamBuf outStream; -+ -+ LzmaEnc_SetInputBuf(p, src, srcLen); -+ -+ outStream.funcTable.Write = MyWrite; -+ outStream.data = dest; -+ outStream.rem = *destLen; -+ outStream.overflow = False; -+ -+ p->writeEndMark = writeEndMark; -+ -+ p->rc.outStream = &outStream.funcTable; -+ res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig); -+ if (res == SZ_OK) -+ res = LzmaEnc_Encode2(p, progress); -+ -+ *destLen -= outStream.rem; -+ if (outStream.overflow) -+ return SZ_ERROR_OUTPUT_EOF; -+ return res; -+} -+ -+SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, -+ const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, -+ ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc); -+ SRes res; -+ if (p == 0) -+ return SZ_ERROR_MEM; -+ -+ res = LzmaEnc_SetProps(p, props); -+ if (res == SZ_OK) -+ { -+ res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize); -+ if (res == SZ_OK) -+ res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen, -+ writeEndMark, progress, alloc, allocBig); -+ } -+ -+ LzmaEnc_Destroy(p, alloc, allocBig); -+ return res; -+} - -Property changes on: third_party/lzma_sdk/LzmaEnc.c -___________________________________________________________________ -Added: svn:eol-style - + LF - -Index: third_party/lzma_sdk/Alloc.c -=================================================================== ---- third_party/lzma_sdk/Alloc.c (revision 0) -+++ third_party/lzma_sdk/Alloc.c (revision 0) -@@ -0,0 +1,127 @@ -+/* Alloc.c -- Memory allocation functions -+2008-09-24 -+Igor Pavlov -+Public domain */ -+ -+#ifdef _WIN32 -+#include -+#endif -+#include -+ -+#include "Alloc.h" -+ -+/* #define _SZ_ALLOC_DEBUG */ -+ -+/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ -+#ifdef _SZ_ALLOC_DEBUG -+#include -+int g_allocCount = 0; -+int g_allocCountMid = 0; -+int g_allocCountBig = 0; -+#endif -+ -+void *MyAlloc(size_t size) -+{ -+ if (size == 0) -+ return 0; -+ #ifdef _SZ_ALLOC_DEBUG -+ { -+ void *p = malloc(size); -+ fprintf(stderr, "\nAlloc %10d bytes, count = %10d, addr = %8X", size, g_allocCount++, (unsigned)p); -+ return p; -+ } -+ #else -+ return malloc(size); -+ #endif -+} -+ -+void MyFree(void *address) -+{ -+ #ifdef _SZ_ALLOC_DEBUG -+ if (address != 0) -+ fprintf(stderr, "\nFree; count = %10d, addr = %8X", --g_allocCount, (unsigned)address); -+ #endif -+ free(address); -+} -+ -+#ifdef _WIN32 -+ -+void *MidAlloc(size_t size) -+{ -+ if (size == 0) -+ return 0; -+ #ifdef _SZ_ALLOC_DEBUG -+ fprintf(stderr, "\nAlloc_Mid %10d bytes; count = %10d", size, g_allocCountMid++); -+ #endif -+ return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); -+} -+ -+void MidFree(void *address) -+{ -+ #ifdef _SZ_ALLOC_DEBUG -+ if (address != 0) -+ fprintf(stderr, "\nFree_Mid; count = %10d", --g_allocCountMid); -+ #endif -+ if (address == 0) -+ return; -+ VirtualFree(address, 0, MEM_RELEASE); -+} -+ -+#ifndef MEM_LARGE_PAGES -+#undef _7ZIP_LARGE_PAGES -+#endif -+ -+#ifdef _7ZIP_LARGE_PAGES -+SIZE_T g_LargePageSize = 0; -+typedef SIZE_T (WINAPI *GetLargePageMinimumP)(); -+#endif -+ -+void SetLargePageSize() -+{ -+ #ifdef _7ZIP_LARGE_PAGES -+ SIZE_T size = 0; -+ GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP) -+ GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum"); -+ if (largePageMinimum == 0) -+ return; -+ size = largePageMinimum(); -+ if (size == 0 || (size & (size - 1)) != 0) -+ return; -+ g_LargePageSize = size; -+ #endif -+} -+ -+ -+void *BigAlloc(size_t size) -+{ -+ if (size == 0) -+ return 0; -+ #ifdef _SZ_ALLOC_DEBUG -+ fprintf(stderr, "\nAlloc_Big %10d bytes; count = %10d", size, g_allocCountBig++); -+ #endif -+ -+ #ifdef _7ZIP_LARGE_PAGES -+ if (g_LargePageSize != 0 && g_LargePageSize <= (1 << 30) && size >= (1 << 18)) -+ { -+ void *res = VirtualAlloc(0, (size + g_LargePageSize - 1) & (~(g_LargePageSize - 1)), -+ MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE); -+ if (res != 0) -+ return res; -+ } -+ #endif -+ return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); -+} -+ -+void BigFree(void *address) -+{ -+ #ifdef _SZ_ALLOC_DEBUG -+ if (address != 0) -+ fprintf(stderr, "\nFree_Big; count = %10d", --g_allocCountBig); -+ #endif -+ -+ if (address == 0) -+ return; -+ VirtualFree(address, 0, MEM_RELEASE); -+} -+ -+#endif - -Property changes on: third_party/lzma_sdk/Alloc.c -___________________________________________________________________ -Added: svn:eol-style - + LF - -Index: third_party/lzma_sdk/LzmaLib.c -=================================================================== ---- third_party/lzma_sdk/LzmaLib.c (revision 0) -+++ third_party/lzma_sdk/LzmaLib.c (revision 0) -@@ -0,0 +1,46 @@ -+/* LzmaLib.c -- LZMA library wrapper -+2008-08-05 -+Igor Pavlov -+Public domain */ -+ -+#include "LzmaEnc.h" -+#include "LzmaDec.h" -+#include "Alloc.h" -+#include "LzmaLib.h" -+ -+static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); } -+static void SzFree(void *p, void *address) { p = p; MyFree(address); } -+static ISzAlloc g_Alloc = { SzAlloc, SzFree }; -+ -+MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, -+ unsigned char *outProps, size_t *outPropsSize, -+ int level, /* 0 <= level <= 9, default = 5 */ -+ unsigned dictSize, /* use (1 << N) or (3 << N). 4 KB < dictSize <= 128 MB */ -+ int lc, /* 0 <= lc <= 8, default = 3 */ -+ int lp, /* 0 <= lp <= 4, default = 0 */ -+ int pb, /* 0 <= pb <= 4, default = 2 */ -+ int fb, /* 5 <= fb <= 273, default = 32 */ -+ int numThreads /* 1 or 2, default = 2 */ -+) -+{ -+ CLzmaEncProps props; -+ LzmaEncProps_Init(&props); -+ props.level = level; -+ props.dictSize = dictSize; -+ props.lc = lc; -+ props.lp = lp; -+ props.pb = pb; -+ props.fb = fb; -+ props.numThreads = numThreads; -+ -+ return LzmaEncode(dest, destLen, src, srcLen, &props, outProps, outPropsSize, 0, -+ NULL, &g_Alloc, &g_Alloc); -+} -+ -+ -+MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t *srcLen, -+ const unsigned char *props, size_t propsSize) -+{ -+ ELzmaStatus status; -+ return LzmaDecode(dest, destLen, src, srcLen, props, (unsigned)propsSize, LZMA_FINISH_ANY, &status, &g_Alloc); -+} - -Property changes on: third_party/lzma_sdk/LzmaLib.c -___________________________________________________________________ -Added: svn:eol-style - + LF - -Index: third_party/lzma_sdk/LzFind.h -=================================================================== ---- third_party/lzma_sdk/LzFind.h (revision 0) -+++ third_party/lzma_sdk/LzFind.h (revision 0) -@@ -0,0 +1,115 @@ -+/* LzFind.h -- Match finder for LZ algorithms -+2009-04-22 : Igor Pavlov : Public domain */ -+ -+#ifndef __LZ_FIND_H -+#define __LZ_FIND_H -+ -+#include "Types.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+typedef UInt32 CLzRef; -+ -+typedef struct _CMatchFinder -+{ -+ Byte *buffer; -+ UInt32 pos; -+ UInt32 posLimit; -+ UInt32 streamPos; -+ UInt32 lenLimit; -+ -+ UInt32 cyclicBufferPos; -+ UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ -+ -+ UInt32 matchMaxLen; -+ CLzRef *hash; -+ CLzRef *son; -+ UInt32 hashMask; -+ UInt32 cutValue; -+ -+ Byte *bufferBase; -+ ISeqInStream *stream; -+ int streamEndWasReached; -+ -+ UInt32 blockSize; -+ UInt32 keepSizeBefore; -+ UInt32 keepSizeAfter; -+ -+ UInt32 numHashBytes; -+ int directInput; -+ size_t directInputRem; -+ int btMode; -+ int bigHash; -+ UInt32 historySize; -+ UInt32 fixedHashSize; -+ UInt32 hashSizeSum; -+ UInt32 numSons; -+ SRes result; -+ UInt32 crc[256]; -+} CMatchFinder; -+ -+#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer) -+#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)]) -+ -+#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos) -+ -+int MatchFinder_NeedMove(CMatchFinder *p); -+Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); -+void MatchFinder_MoveBlock(CMatchFinder *p); -+void MatchFinder_ReadIfRequired(CMatchFinder *p); -+ -+void MatchFinder_Construct(CMatchFinder *p); -+ -+/* Conditions: -+ historySize <= 3 GB -+ keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB -+*/ -+int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, -+ UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, -+ ISzAlloc *alloc); -+void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc); -+void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems); -+void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); -+ -+UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son, -+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, -+ UInt32 *distances, UInt32 maxLen); -+ -+/* -+Conditions: -+ Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func. -+ Mf_GetPointerToCurrentPos_Func's result must be used only before any other function -+*/ -+ -+typedef void (*Mf_Init_Func)(void *object); -+typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index); -+typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object); -+typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object); -+typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances); -+typedef void (*Mf_Skip_Func)(void *object, UInt32); -+ -+typedef struct _IMatchFinder -+{ -+ Mf_Init_Func Init; -+ Mf_GetIndexByte_Func GetIndexByte; -+ Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; -+ Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos; -+ Mf_GetMatches_Func GetMatches; -+ Mf_Skip_Func Skip; -+} IMatchFinder; -+ -+void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable); -+ -+void MatchFinder_Init(CMatchFinder *p); -+UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); -+UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); -+void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); -+void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif - -Property changes on: third_party/lzma_sdk/LzFind.h -___________________________________________________________________ -Added: svn:eol-style - + LF - diff --git a/woff2_header_dump.py b/woff2_header_dump.py deleted file mode 100644 index b352d50..0000000 --- a/woff2_header_dump.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is a simple utility for dumping out the header of a compressed file, and -# is suitable for doing spot checks of compressed. files. However, this only -# implements the "long" form of the table directory. - -import struct -import sys - -def dump_woff2_header(header): - header_values = struct.unpack('>IIIHHIHHIIIII', header[:44]) - for i, key in enumerate([ - 'signature', - 'flavor', - 'length', - 'numTables', - 'reserved', - 'totalSfntSize', - 'majorVersion', - 'minorVersion', - 'metaOffset', - 'metaOrigLength', - 'privOffset', - 'privLength']): - print key, header_values[i] - numTables = header_values[3] - for i in range(numTables): - entry = struct.unpack('>IIIII', header[44+20*i:44+20*(i+1)]) - print '%08x %d %d %d %d' % entry - -def main(): - header = file(sys.argv[1]).read() - dump_woff2_header(header) - -main() - From 09c4eba0f679640ddddfd5315edbb72e4d7d8447 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Sat, 22 Nov 2014 16:22:49 +0200 Subject: [PATCH 2/6] Rename woff2 to src --- README.md | 2 +- {woff2 => src}/Makefile | 0 {woff2 => src}/buffer.h | 0 {woff2 => src}/file.h | 0 {woff2 => src}/font.cc | 0 {woff2 => src}/font.h | 0 {woff2 => src}/glyph.cc | 0 {woff2 => src}/glyph.h | 0 {woff2 => src}/normalize.cc | 0 {woff2 => src}/normalize.h | 0 {woff2 => src}/port.h | 0 {woff2 => src}/round.h | 0 {woff2 => src}/store_bytes.h | 0 {woff2 => src}/table_tags.cc | 0 {woff2 => src}/table_tags.h | 0 {woff2 => src}/transform.cc | 0 {woff2 => src}/transform.h | 0 {woff2 => src}/woff2_common.h | 0 {woff2 => src}/woff2_compress.cc | 0 {woff2 => src}/woff2_dec.cc | 0 {woff2 => src}/woff2_dec.h | 0 {woff2 => src}/woff2_decompress.cc | 0 {woff2 => src}/woff2_enc.cc | 0 {woff2 => src}/woff2_enc.h | 0 24 files changed, 1 insertion(+), 1 deletion(-) rename {woff2 => src}/Makefile (100%) rename {woff2 => src}/buffer.h (100%) rename {woff2 => src}/file.h (100%) rename {woff2 => src}/font.cc (100%) rename {woff2 => src}/font.h (100%) rename {woff2 => src}/glyph.cc (100%) rename {woff2 => src}/glyph.h (100%) rename {woff2 => src}/normalize.cc (100%) rename {woff2 => src}/normalize.h (100%) rename {woff2 => src}/port.h (100%) rename {woff2 => src}/round.h (100%) rename {woff2 => src}/store_bytes.h (100%) rename {woff2 => src}/table_tags.cc (100%) rename {woff2 => src}/table_tags.h (100%) rename {woff2 => src}/transform.cc (100%) rename {woff2 => src}/transform.h (100%) rename {woff2 => src}/woff2_common.h (100%) rename {woff2 => src}/woff2_compress.cc (100%) rename {woff2 => src}/woff2_dec.cc (100%) rename {woff2 => src}/woff2_dec.h (100%) rename {woff2 => src}/woff2_decompress.cc (100%) rename {woff2 => src}/woff2_enc.cc (100%) rename {woff2 => src}/woff2_enc.h (100%) diff --git a/README.md b/README.md index fb1dea8..8de39b0 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ compression related modules in this repository. brotli/ contains reference code for the Brotli byte-level compression algorithm. Note that it is licensed under an Apache 2 license. -woff2/ contains the C++ code for compressing and decompressing fonts. +src/ contains the C++ code for compressing and decompressing fonts. # Build & Run diff --git a/woff2/Makefile b/src/Makefile similarity index 100% rename from woff2/Makefile rename to src/Makefile diff --git a/woff2/buffer.h b/src/buffer.h similarity index 100% rename from woff2/buffer.h rename to src/buffer.h diff --git a/woff2/file.h b/src/file.h similarity index 100% rename from woff2/file.h rename to src/file.h diff --git a/woff2/font.cc b/src/font.cc similarity index 100% rename from woff2/font.cc rename to src/font.cc diff --git a/woff2/font.h b/src/font.h similarity index 100% rename from woff2/font.h rename to src/font.h diff --git a/woff2/glyph.cc b/src/glyph.cc similarity index 100% rename from woff2/glyph.cc rename to src/glyph.cc diff --git a/woff2/glyph.h b/src/glyph.h similarity index 100% rename from woff2/glyph.h rename to src/glyph.h diff --git a/woff2/normalize.cc b/src/normalize.cc similarity index 100% rename from woff2/normalize.cc rename to src/normalize.cc diff --git a/woff2/normalize.h b/src/normalize.h similarity index 100% rename from woff2/normalize.h rename to src/normalize.h diff --git a/woff2/port.h b/src/port.h similarity index 100% rename from woff2/port.h rename to src/port.h diff --git a/woff2/round.h b/src/round.h similarity index 100% rename from woff2/round.h rename to src/round.h diff --git a/woff2/store_bytes.h b/src/store_bytes.h similarity index 100% rename from woff2/store_bytes.h rename to src/store_bytes.h diff --git a/woff2/table_tags.cc b/src/table_tags.cc similarity index 100% rename from woff2/table_tags.cc rename to src/table_tags.cc diff --git a/woff2/table_tags.h b/src/table_tags.h similarity index 100% rename from woff2/table_tags.h rename to src/table_tags.h diff --git a/woff2/transform.cc b/src/transform.cc similarity index 100% rename from woff2/transform.cc rename to src/transform.cc diff --git a/woff2/transform.h b/src/transform.h similarity index 100% rename from woff2/transform.h rename to src/transform.h diff --git a/woff2/woff2_common.h b/src/woff2_common.h similarity index 100% rename from woff2/woff2_common.h rename to src/woff2_common.h diff --git a/woff2/woff2_compress.cc b/src/woff2_compress.cc similarity index 100% rename from woff2/woff2_compress.cc rename to src/woff2_compress.cc diff --git a/woff2/woff2_dec.cc b/src/woff2_dec.cc similarity index 100% rename from woff2/woff2_dec.cc rename to src/woff2_dec.cc diff --git a/woff2/woff2_dec.h b/src/woff2_dec.h similarity index 100% rename from woff2/woff2_dec.h rename to src/woff2_dec.h diff --git a/woff2/woff2_decompress.cc b/src/woff2_decompress.cc similarity index 100% rename from woff2/woff2_decompress.cc rename to src/woff2_decompress.cc diff --git a/woff2/woff2_enc.cc b/src/woff2_enc.cc similarity index 100% rename from woff2/woff2_enc.cc rename to src/woff2_enc.cc diff --git a/woff2/woff2_enc.h b/src/woff2_enc.h similarity index 100% rename from woff2/woff2_enc.h rename to src/woff2_enc.h From 3e1f5ca9552ead0d917214d70d9b98c7aa36faaf Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Sat, 22 Nov 2014 16:32:26 +0200 Subject: [PATCH 3/6] Move the Makefile to the top directory --- src/Makefile => Makefile | 12 +++++++----- README.md | 1 - shared.mk | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) rename src/Makefile => Makefile (67%) diff --git a/src/Makefile b/Makefile similarity index 67% rename from src/Makefile rename to Makefile index 3782048..d343078 100644 --- a/src/Makefile +++ b/Makefile @@ -1,23 +1,25 @@ #Converter makefile -include ../shared.mk +include shared.mk + +SRCDIR = src OUROBJ = font.o glyph.o normalize.o table_tags.o transform.o \ woff2_dec.o woff2_enc.o -BROTLI = ../brotli +BROTLI = brotli ENCOBJ = $(BROTLI)/enc/*.o DECOBJ = $(BROTLI)/dec/*.o -OBJS = $(OUROBJ) +OBJS = $(patsubst %, $(SRCDIR)/%, $(OUROBJ)) EXECUTABLES=woff2_compress woff2_decompress -EXE_OBJS=$(patsubst %, %.o, $(EXECUTABLES)) +EXE_OBJS=$(patsubst %, $(SRCDIR)/%.o, $(EXECUTABLES)) all : $(OBJS) $(EXECUTABLES) $(EXECUTABLES) : $(EXE_OBJS) deps - $(CPP) $(LFLAGS) $(OBJS) $(ENCOBJ) $(DECOBJ) $@.o -o $@ + $(CPP) $(LFLAGS) $(OBJS) $(ENCOBJ) $(DECOBJ) $(SRCDIR)/$@.o -o $@ deps : make -C $(BROTLI)/dec diff --git a/README.md b/README.md index 8de39b0..ea55a36 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,6 @@ git clone https://github.com/google/woff2.git cd woff2 git submodule init git submodule update -cd woff2 make clean all ``` diff --git a/shared.mk b/shared.mk index 15dca18..45ee7c4 100644 --- a/shared.mk +++ b/shared.mk @@ -1,5 +1,5 @@ OS := $(shell uname) -IDIRS=-I../brotli/dec/ -I../brotli/enc/ -I../ +IDIRS=-I./brotli/dec/ -I./brotli/enc/ -I./src GFLAGS=-no-canonical-prefixes -fno-omit-frame-pointer -m64 From a262e006d17dba570681a18e506576a267d3571c Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Sat, 22 Nov 2014 16:40:37 +0200 Subject: [PATCH 4/6] Fold shared.mk into Makefile There is only one Makefile in this repository. --- Makefile | 15 +++++++++++++-- shared.mk | 17 ----------------- 2 files changed, 13 insertions(+), 19 deletions(-) delete mode 100644 shared.mk diff --git a/Makefile b/Makefile index d343078..0bcf6b1 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,17 @@ -#Converter makefile +OS := $(shell uname) -include shared.mk +IDIRS=-I./brotli/dec/ -I./brotli/enc/ -I./src + +CPP = g++ +LFLAGS = +GFLAGS=-no-canonical-prefixes -fno-omit-frame-pointer -m64 +CPPFLAGS = -c $(IDIRS) -std=c++0x $(GFLAGS) + +ifeq ($(OS), Darwin) + CPPFLAGS += -DOS_MACOSX +else + CPPFLAGS += -fno-tree-vrp +endif SRCDIR = src diff --git a/shared.mk b/shared.mk deleted file mode 100644 index 45ee7c4..0000000 --- a/shared.mk +++ /dev/null @@ -1,17 +0,0 @@ -OS := $(shell uname) -IDIRS=-I./brotli/dec/ -I./brotli/enc/ -I./src - -GFLAGS=-no-canonical-prefixes -fno-omit-frame-pointer -m64 - -CPP = g++ -LFLAGS = -CPPFLAGS = -c $(IDIRS) -std=c++0x $(GFLAGS) - -ifeq ($(OS), Darwin) - CPPFLAGS += -DOS_MACOSX -else - CPPFLAGS += -fno-tree-vrp -endif - -%.o : %.c - $(CPP) $(CPPFLAGS) $< -o $@ From 4b8c71e0d5fa40aac12d44c04572e0503d4df922 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Sat, 22 Nov 2014 16:42:23 +0200 Subject: [PATCH 5/6] Rename CPP to CXX CPP is the C pre processor. --- Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 0bcf6b1..fcb9525 100644 --- a/Makefile +++ b/Makefile @@ -2,15 +2,15 @@ OS := $(shell uname) IDIRS=-I./brotli/dec/ -I./brotli/enc/ -I./src -CPP = g++ +CXX = g++ LFLAGS = GFLAGS=-no-canonical-prefixes -fno-omit-frame-pointer -m64 -CPPFLAGS = -c $(IDIRS) -std=c++0x $(GFLAGS) +CXXFLAGS = -c $(IDIRS) -std=c++0x $(GFLAGS) ifeq ($(OS), Darwin) - CPPFLAGS += -DOS_MACOSX + CXXFLAGS += -DOS_MACOSX else - CPPFLAGS += -fno-tree-vrp + CXXFLAGS += -fno-tree-vrp endif SRCDIR = src @@ -30,7 +30,7 @@ EXE_OBJS=$(patsubst %, $(SRCDIR)/%.o, $(EXECUTABLES)) all : $(OBJS) $(EXECUTABLES) $(EXECUTABLES) : $(EXE_OBJS) deps - $(CPP) $(LFLAGS) $(OBJS) $(ENCOBJ) $(DECOBJ) $(SRCDIR)/$@.o -o $@ + $(CXX) $(LFLAGS) $(OBJS) $(ENCOBJ) $(DECOBJ) $(SRCDIR)/$@.o -o $@ deps : make -C $(BROTLI)/dec From 23e2aa1f7c35f07775669248d710fcb08742422b Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Sat, 22 Nov 2014 16:44:48 +0200 Subject: [PATCH 6/6] Add .gitignore file --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dc6b1e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.o +/woff2_compress +/woff2_decompress