From 95642c0bfd3df01d034b5998d0f90b4e95cb2580 Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Mon, 21 Dec 2009 16:24:08 +0000 Subject: [PATCH] fixed InterfaceEndRecord to tolerate unexpected record contents, see bug 47251 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@892862 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 3 +- .../poi/hssf/record/InterfaceEndRecord.java | 21 +++++-- .../hssf/record/TestInterfaceEndRecord.java | 56 ++++++++++++++++++ .../apache/poi/hssf/usermodel/TestBugs.java | 4 ++ test-data/spreadsheet/47251.xls | Bin 0 -> 28937 bytes 5 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 src/testcases/org/apache/poi/hssf/record/TestInterfaceEndRecord.java create mode 100644 test-data/spreadsheet/47251.xls diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 76c0e85563..5ef12fb3ab 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,7 +34,8 @@ - 48415 - improved javadoc on HSSPicture.resize() + 47215 - fixed InterfaceEndRecord to tolerate unexpected record contents + 48415 - improved javadoc on HSSPicture.resize() added Ant target to install artifacts in local repository 48026 - fixed PageSettingsBlock to allow multiple HeaderFooterRecord records 48202 - fixed CellRangeUtil.mergeCellRanges to work for adjacent cell regions diff --git a/src/java/org/apache/poi/hssf/record/InterfaceEndRecord.java b/src/java/org/apache/poi/hssf/record/InterfaceEndRecord.java index 620d580f66..865906040b 100644 --- a/src/java/org/apache/poi/hssf/record/InterfaceEndRecord.java +++ b/src/java/org/apache/poi/hssf/record/InterfaceEndRecord.java @@ -18,6 +18,9 @@ package org.apache.poi.hssf.record; import org.apache.poi.util.LittleEndianOutput; +import org.apache.poi.util.HexDump; +import org.apache.poi.util.POILogger; +import org.apache.poi.util.POILogFactory; /** * Title: Interface End Record (0x00E2)

@@ -28,17 +31,23 @@ import org.apache.poi.util.LittleEndianOutput; * @version 2.0-pre */ public final class InterfaceEndRecord extends StandardRecord { + private static POILogger logger = POILogFactory.getLogger(InterfaceEndRecord.class); + public final static short sid = 0x00E2; + private byte[] _unknownData; + public InterfaceEndRecord() { } - /** - * @param in unused (since this record has no data) - */ public InterfaceEndRecord(RecordInputStream in) { + if(in.available() > 0){ + _unknownData = in.readRemainder(); + logger.log(POILogger.WARN, "encountered unexpected " + + _unknownData.length + " bytes in InterfaceEndRecord"); + } } public String toString() @@ -46,15 +55,19 @@ public final class InterfaceEndRecord extends StandardRecord { StringBuffer buffer = new StringBuffer(); buffer.append("[INTERFACEEND]\n"); + buffer.append(" unknownData=").append(HexDump.toHex(_unknownData)).append("\n"); buffer.append("[/INTERFACEEND]\n"); return buffer.toString(); } public void serialize(LittleEndianOutput out) { + if(_unknownData != null) out.write(_unknownData); } protected int getDataSize() { - return 0; + int size = 0; + if(_unknownData != null) size += _unknownData.length; + return size; } public short getSid() diff --git a/src/testcases/org/apache/poi/hssf/record/TestInterfaceEndRecord.java b/src/testcases/org/apache/poi/hssf/record/TestInterfaceEndRecord.java new file mode 100644 index 0000000000..9de79b3fdf --- /dev/null +++ b/src/testcases/org/apache/poi/hssf/record/TestInterfaceEndRecord.java @@ -0,0 +1,56 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.hssf.record; + + +import junit.framework.TestCase; +import org.apache.poi.util.HexRead; +import org.apache.poi.util.HexDump; +import java.util.List; +import java.io.ByteArrayInputStream; + +/** + * Tests the serialization and deserialization of the EndSubRecord + * class works correctly. Test data taken directly from a real + * Excel file. + * + * @author Yegor Kozlov + */ +public final class TestInterfaceEndRecord extends TestCase { + + public void testCreate() { + InterfaceEndRecord record = new InterfaceEndRecord(); + assertEquals(0, record.getDataSize()); + } + + /** + * Silently swallow unexpected contents in InterfaceEndRecord. + * Although it violates the spec, Excel silently reads such files. + */ + public void testUnexpectedBytes_bug47251(){ + String hex = "" + + "09 08 10 00 00 06 05 00 EC 15 CD 07 C1 C0 00 00 06 03 00 00 " + //BOF + "E2 00 02 00 B0 04 " + //INTERFACEEND with extra two bytes + "0A 00 00 00"; // EOF + byte[] data = HexRead.readFromString(hex); + List records = RecordFactory.createRecords(new ByteArrayInputStream(data)); + assertEquals(3, records.size()); + InterfaceEndRecord r = (InterfaceEndRecord)records.get(1); + assertEquals("[E2, 00, 02, 00, B0, 04]", HexDump.toHex(r.serialize())); + } +} \ No newline at end of file diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java index 5b2d69af76..df3f234882 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java @@ -1533,4 +1533,8 @@ public final class TestBugs extends BaseTestBugzillaIssues { public void test48026() { openSample("48026.xls"); } + + public void test47251() { + openSample("47251.xls"); + } } diff --git a/test-data/spreadsheet/47251.xls b/test-data/spreadsheet/47251.xls new file mode 100644 index 0000000000000000000000000000000000000000..e498c2be0a3c0d5c89e5ee73b341b8cdf8512470 GIT binary patch literal 28937 zcmeI437AyXweNRLUDb5gJa&zzx}lkehNhuWq?<{=0V1N{$P8WvQ6a&2jUY~#;3fJ= zf+NoJn5g%CAqH|yE{>5n#KegVdSldF%+_r6qpr`D={ z&ROT2eSUlGwTE+F{z-V>ZI7jYsd{{lQ7-k@1GTEAEZreG7W)%Yvi`sU=te@9q`!au zAIgFMDd&p&=aPHpmc=6r?zvYMpDeYq^pT}bmU>zIvIJxa$|4A;uq+W-qO!zfiOZ6Z zB`HfvmIhhUvSeh*%94{MFH1odOO~Q6jj}Y!(pQ##vNX%mUzP!~43uS%EQ4hkBFj)& zhRHHqmJzbF$TCuvQL?nkGFp~4S;okM>-ziW;5l%TI#<4HN zV~#-I(97<-+P?W8o4@v)qugJdDn~zGtxyZ?^H|Z#p1mhWl+$63583;cU2B}8*8c5> z>N3zn`&*CSWB0@UdpO6h^+_qN@u-jDFM4

*_*uar|g>fSBC(3Ltvtr5TPu$1+G z?laLohXoFt!!7}9yl4(}lcWa3ryy1Cy!=M(-$(52cG|z=WzBwdoO*NOM=fJz3)ES2 zogMaeTkPLP`!^uJ4)v71&oAth7V%VjWcve`Y_(B#D37C4=sZU)P%FjL{O?}tQ`L`~ zRXgOYd}=2ySkAe|ak8Azaw##ZM7D@u)$7gPJ=dputnYqRS(TKlJ(zXmN!Ph`x1M*8 z5)Y76jz)3cjpD|K$kHUP`D}6BM+rIuB(?jRGh|KPJzlDrY;U`ru1-=*)M9n!K@3cg zIx1IbV3-{HU`N;M^*KzJ%W6EhiG!a>xv_Jko*JnfXY+~&DXStsy01mbi^}%{O4AOf$z`;ykD7SE2@7GbDzunKZ`@y=hrusEa zP!p3f>9Raf-7Ai)m(7or z(y>~W^KH+x&yKv5`s@HACiB^4A>AQ=?etH-SUOxxwe5RLht+D^|Norskb>CtG5I`L z=fme_jY%KaOZt#r(g*dDURyQYBZqT{8&mU@>aaR2sV(jMUY;&%WUDIaR`qnGR&1{m zE7Rvok|j&YKH3Wov>N7jKOeLqs->f?(R;e=)x(b7URonP(#x(FS0zoEitDvhZ|PRm z?U8G;PlX*Z(@VP5m0ly>rP_7r^X%>XE3elp2didB?szZhcT0Mu9ld?E^m}^Q{@z~F zaoq0bf1T58JvZPPI-g zlGevL64R_!v*jP0?gG0t@(sB;5`C(N9kz5Qg?0yalTS+8m6n{4oR3NK9)%Thq3VFz z?eNK>)P}JR^`Ub4q|v(nKar!VWu|OZL9Q$vR?G`HU{?8<_rslI) zpM{$~9o;tk{`muToq7AF18T3NV|#v9=l4G=2^Cu&JALZd_60M=7e8ZfE7AHZue|co zOD{e5+;h8j?b^9>=TlET_4wnDKm72+_uY5jop;{3W5_?%mo-~aH+51(E$hF)=IHjMp^~%ogF2A!+;L~3Zn!Da}`HwqB z%-xZ3H!d0$Y@Bymb8TRwFSIfEm1d9cqMFc(tEaA>Q|G#P_MEj>-f?IDYnlSnzSUIo z(2Bn9nwicsCOfw}Yc6keg(h#hbN7tqZT=toL#IA)ssFs4UkmM7>+j?AhAvw6uX|SP z`r*6JeCy$wjraB2cInqIUAtvnUE|fiuDR%)cXu~Gu{n6rgQ3RfZ=1UIlYY0~yt#Ae zm$!`DyTLKRHMwT&{LsBSesKC(L-yX+v}E!lTh0nSJ$Ly+^?1!uD_cL?e8u_KT(#oG z8&(Z@`SQuvdG~Z|?z?utlp&}8+n(!F)~i!C-adNTN%NljPW>zQ4ElZN%`=|(-A_Xj zh~ehnB*nF+X7HN(zW3bor^GJH`+Y~f`}xTS)OtzpdGpsuTE&+7<{zVuR)13J?HTH? z`<*`_6|pofarwQ0jXx{9fPozyJO{2mbHR0rcM~lm+EG zpho+$(;nTidy_9Z=!`v&-u5q7hMH#FH0`n5fAsa#sDF5C&trG|>pxkOuFg(>{LW{u z8!-F+GoF3?uIIlsqOL8}F?+)mH?*GntGDJ|(EL)3>*Cj22khu@+}IIL_;$5!*l_pp zw@$qI7i$N;>U2HS*6)oS&R6SBj5@CxG;87px2tKgdM-BjgzvPyc*@u}p4>67*6CUQ z#P*j5pXFcb@~sT*JNIqn@x6J*)vsIgF0BpqpY!0FmF|t<-~BMYr?qqOgPTW>xI43L z$LrsTd_L%f`uPw3?06y|sN_`2IZW@s*cfw*6QBto6Zp?;Tsa>A=#5H~!&*+P%kJ@bu1?SN!P@H+xUt zvij8zzx3hMyS&REdV9c{2O_VYnws>m|2J{vyt(cAOHcjMYxCB5K27XCyJgPuUtZpP z;lFL&wCQe8-rrXPq!*{#z5BS52F}Zr|w9+vkk>+T3@pRL|^r zYwlIGYS)Uu^t&8t{lKquu5`WsquA=@+t=OPam(&|&N%IaAExG9AK9OruReM^cKy~T zFZ}kB3p?g5Nq*ZuJzlu}-&-!<@$FetMl8Eht$+XL%kLil?ACA2IjwfiqN!KxIb-Ql z@z-8IX+iUE@7Z=~ao#CguYUT}dr$VqtYqiR8Bb*9T7&LfI&1rRH@tc8Nscw0u4hKS z+%f;UsgrhnYu<{M*7#|w8-F~1cI~70pLyZ;Ti%;<%Jxt0Uoi2gexF@8>uAS&(auS4 zpFC@3>Xa29Kk>%W2R?rCtuKH0@l*S*82tNx{>?wc;G;*Wy8Q?tejqV{Pi>SqLiu(% zI^?%Qn{n0*g!65_&y3Z@rt<#)04 zdqWS~VM9oc`Cs>a^3xL*&YEzxoj%A;A8h|#YNu?FZOo^i#778AHe!uCuC_}rm7`f5 zFCE^Es=Q05QBuY#OHGmhXo-YDYwgaEagx#^T@1tJw@rRW+D*%LNgXK-_R-SiJx)?a z$^TjE1o>^2{hOsDr8n!d#PTw+j4fx$@40HJt)D2ro9s)t%>HebOSoY>K0lw(zf2!c zrVkW-*;0JopKzO8jgqWF(B?4LZp(cW^xu6G9BPi(_Nj~QK?SAWL~JG>{KsCaoL&E& zvgM|5*MFD9Xs6l(5PEyJ1c;y1cCGhFhgA9c8damlmD%@7$5Huupi{notu$ZC*Y}ZV z@<~UR{W=MM->m8SUoYo;cG-Hr08_qyK)Ni;j~|qC?^|~MAsI+{r0joK@Y+;nKO+4A zfwKIFN;g8e{g{M#<@Vw-2$OSnonJx*WXktXN_SoP@lp~-4=y`igLJT#+e=HwXZiLS z3A)R#CoBDU<=f|^TdsWjymYgauP?~pPx<*-!rKRB_ot|e-L`KOp3W-euX1AWNe>z6 zK_j0N#T@!z8@3MF5^4C;q%O19nKZ=uO==TDd}Y$`r%47N%F|Fxo75xS?4jY-q^5P- z4vo!3kb81rJb;{Dvv}sb!-S!oSCTR=0 zrD0&MXBzUVXBxQZnT8zfnTCPAo@sEkJ<~Ao*E3C;9TjO980@(n1`2zoiKDJagKO@& z9R?PAreUD5XBq|`d!}I^vS%6wCVQq~pt5Hg1}=N1Sv}GmPLP4YP^~$rIi)P>G#52D zH4n8KYF=tSYPHn*P^+U>Pt8v)KrKiuL@i7$LM=)yMlDVaK1E+gl3I#d1GO}@47Dt^ z9JM^P0yT?Tky;~$8YFjteyXH7#9!$&Cp8x}H#HBn8fso@K5Dhp`cSK*R!_}O4MS4; z41&}`)WXyv)S}d4)Z)|<)RNRv)Zm}>(bCj1)Uwoa)bi8{)GTU6YK`LQVHti>vx{Iy z9}Tsz(M;|-rRFthCU>1u+nO|!yQt|+n#o2}l1VeU>y*4OX(o4_Qq!3y*08tTnld8b`D1V(z+_yNGV|9xmptOClPRW^&ghQH)75x$Bb1#iW_sbxE{h(oF8U zBtkK1hFzCLASTV^u1g{jlV)<)CDDgTGr8*$T1=YBU6+(plV)-kS7y>o?z$wJFli=t zT@pcNkDvo{F^ELkSk?4Mh4lWK%nO_Q_`H&aO!%ko0^AO4K*({AGKO)eW=w@ ztEc9t7N8cS7NQoWW^R<5H_FXo;O31&rK7Xc%^T%rF+j04Yt4=24FQ!d1|Ajz4~v0^#lXX2fWTg#frn1U!(!l}lku<^c<5w2ECwDr z84rtr$DUQ7&&m`751ovM#lS-+<6-W4n7bb4E-G?!rluHpn7g^w|1EW*6qr?#iW`WLCz*3%Yffqi<=xJ>tc5=m_|bDSM=G4@QpM0ay%S$t?Xz_ z=p&dmgir3d*)gnlJW+O8Z|~B*{?$81c#>#d=sb%_n&g>2A_f4Z=g7|BI5$pELu*6t zmeRY;mSdrVY@J-8-pw>Vd=d~~W8B<~U?4YlvSjy{<(BGW^^rTYTy{nuo8Hy5Onh>; z%ypsnLNerd*=T{Bnk8Lp3nWu?*V*}{9Sb}`i<$}iFvUoR)oAit_8xLm1VS9NR*JCE z5YFf{)R$U=Z`T@}g4O`A)_l}zsr8{&N3EWkpIU%gkXndZm|BEdlv<2hoLYifl3I#d z1GO}@47Dt^9JM^P0yRtWQeU~r-CE|Z?mWTTK9ai<0NR?9nv0s7nul5qH7_+EwOVR@ zsMS%cr{<>?poY#qeJ&wtVQLX-QEKSU(|g3JC8#B-rKq99PVbSXW(UD`9-w2yOkRI@Bf&A;i_9avW$N^=wGxx-v_918sMS;RQwvZFQVUTFQ;SfGQj1ZGQ%g`wQcF>5pqA!!WT<7S z<*4PU6?l~vwIVfiYq*^=#nE8KdlOtXrgnW*ydfGR)5LEr6JG_NjEUNCLvXKaB@OXe zyL`t=%22!a-;y-_MP`ccDm7v-fH6=GlaVx+OjZ;pglTVWGJG&fcAp|umc)zpE^b+k zyIwCL#9$Tw#*E*&ThE)I*VRah+nJMfUYTYfWo@Fk#7-Ww{K!7pK%1$RofeFoGh)zv zi%MqtNQyRCN3GsA-5{p@vZqwGEi$Mvx@;Dm-XS0>wHD+7LiUpZO6}UA>8zI^WN2xt z2(>7+m}vUc;`Z|dlJOflJ5aTtRvdyFX{y|Tb0nh0L{xpaBoCaT)<7+-WZsCKeHm(5 zYB_3o(cI1{a-f1_v((y?}~vP^F8xpG_ANM;@@2R>IVlv7wK|4`>(mi!Xg?gBX= zTB`^LhLsLzi6MRHA~oG0o+(-R-)5@aW(x7YAxc+YQk9mN!qAvz%3qDCsp=HDe>gM0 z#73Gazs=OO&tEd_2N!R#Vem_CYo`2$sTR59nKCjqT_TT}5**?9+Kge!FZ>QxoBpz` z{mg`B$}cc#ru^cZjAod^sEo~2n-rL_Hd7;o{eC60hAF=Uv>IB!1UEw^@09AeSu^D) zQ+^3-HC=uQY>j4^@=LkKGb;FGZKe=kRb|RA1z*GLmw4A`hAF=U4w@-+0~pOPjPHw#l|* zTrC<}Er`6)FwvEh@k?C}Lu)9!0WyWyQ!^DPHNj>|9vwDQ82dI~95AR1Qy8|_Oa-em zHM>;z1<6#ff~g>x3Lc6n8G|e_6|7(?NTz~hDoCb+2V*Korh;TDSiw|~Oa;kQkW2;1 zRIq|6H0-J}6(mzZGKG#Z%~X(n3SE<$B=ou%%`g=tQ$fSj;nsaYGKE%*W-3UgFtGUr z{S@Y3tQTXmrJ_a5rM*>~Xo#y?>Fhr(86-cwwZcp^=CJI`t&#Lcq&Y$!iQoiOs2vW zOoho*m`sJqRM;>zMxMJJCGpM}`>W%rFqsOIsc;2TnCPNor!biclc_M73Rf_N0qd$v zg~?QyOkoU5GZiLN7%tHyp(ogAhAH%A>AEj$m^xfP6_#7ANkY$x(M&vri4}*<6#Ud^ zIgDmXo*gPNg$E@yQ<3USeMwq@z%W9lA{9(U$W-J|Ohw34q=KmknTn992$_l;j47D} zRl1E4G8G|H`)<`SdW1}2+LWd%LZ%`%Q~FvFqocitDGyayijbuUS;F9&W+_6JB4i0; z37Vw{V{>$QYL+5~rNfP*B4i1DbDE_H{SzkS92QHu=4+7(4D}u|OCDP*v4qEMHA~TI zEKOANO6|QUS&G^$-8kpg2OfIkR@*;C$x`%CEJevuw1TB5S&EXSXo;naoHJr`yN_d( z_@`FeL$!(29x6(jqNFKWK~t18MM)E;-)XL*^ia_<4|TNN;zR#-RjQ(-DoUy_qOPfm zlBy`F!nl;CDoU!Nq$+BtI$RGGB~|F>)l@}E6{d9ARH63?HQSf%Y7;LGK+U#FYBtn$ z7%)Ngipo}3tESbbX@Ymc7gXWlL>)=RNL9>GHB#d75weVy-%dfXwX}=rMTpr{opszE z@Aw<9x2cMes@S2Zijk^V1ywOp6(dzKdZ?K3Q0;PF=$XQ_+x8MuF)|e+Q?UxBVq_{t zreb6YlR0&ZFIK@6CSp}(Dn_PaWD0XLG*dA$6(ds^;nYmU$P@-*w5N(4DW+m_t2Id& zF)*5`^)MySW~y5M=J7%mh$`>tM2uyEI`j`&lJ)I&;AWVTPUR9)GH+fq^mfJ#Q*Cn3 zu#A!5eyT+1+PTH)sp2+MKUMEIYp=ef3hcZ!p#IGMuK;8M@j z2Ho3(N+6_`F6SM?Y6JdwVzA~ zFWtxlsY;M46H6sXRf1F{NL7MVCAz3my7t5L(5h4=NL7MVVeDU1l^|6KQiXXJnyLh; z!g#RuR0%`X;kNk_qzdDhnyLhAKTJwKVpJV(Qzi3QOH?IERkAu&^Gf{)GDcLQDrr-7 zS!C%i{(8Nx{gR|Ac_^yz0IlvvNLEmlBvnaLm87Ri8c&7VPe)WE#fxgDl4L4Lrjiv* zCCOBhOeM)wl1wEln8MJ1Ri^MfgXSkmrZ9`dq?!KCB$>ht9?eveOeM)w(lB+no+?SE zFe0v*N|Gr|YCl3ujgjFZxJH>DRAMScrc%|Injt;6daN%+rcyRjh1>V$o_T4l?Ws~^ zDrK0`wcj+U|Be;!sNJ(ZvSBJ^Gqvxg@Lk{Ey{u%$)P5;4l_FCq!<4E0AV-#%N|C7) znM#oBd=2mE?Qe+AbMH~^PFrIvx&6LcjDlvuEF6oG>p&C}Y4P>gJJ5!YrRRjH0Lq$Z@KtI($rZ8@-BdUg;OqsW^=(96*UjvzHAX6ryY9Lb$ zWU7HoHIS)>E~ZKm73LpRWvYQpHIOOHY|~6NuzSb}(r&l{QTE7Ez_iRJx+>OOvTI znM#wXv|$S8g?I|1$fHYsDosC?CR1rLW&Bi{Or^{ZnP(s5gbbO=R4|nxQ<+0Cg_)K*p2}1(l_66ZGKKj!+D~N;##Dw(Wyn;ff~gFd z%8)5^e(5$~hD@Ou+}W7REA7t$P{MVYNj$|3eSORk}%WRXojf_nZo2td!EbT zGKF`&Xp%5<&}gRRhll!(7*i8%rexN3iK#4^%2sD;l6VDRm?cx$ig+qZrm}`99Zy+u zVO?Ks#xRwwh^Mk-DoduaWGZWzsuoXW$yAn1WyzGO`?6#zOQy19DoduaT}+kgK1`sk z%9Olhu*6T6Okv)(W-3djvSbQ#<~37U)_qwrl|52SWyuugplYVF^iy~!^awG9c`vxL zGAXjeRE|vLsxvjY6i><2aXB;eCgdvo6y}@5nc$)8(tNz$>b@NPRIb8L<;YZyOks+j z_EVS{Z_k~oR`=z|RE|vL$du_z$dRcWnaYu=9GS{>F;(hIz*Ow2Oy$T_j!fYR0L@g6 zOy$TFp1#mbA-jxbV)WdRVk$?bFq>I3l_OJlsQ8F6rTvu5AuKVKCsX2zCKZVDQt1^`*Q+YClXGzS-n0P8rrtln(CMi#*@XUa2_vMciQ+YCl zdGVU5Jek5n={8e%r^jmhsfN`uPJ_9tLuJ~)N=e0-4W>C%i_UcP%gf+LHQX>db~` z8a{5QO}C~Or>{@{B>l_ujLc)1RJJpFX7;M=KW9J4Hswa=ZpnG_EA!XqAIra$uP=-* ze5J6t@Q1=YYnSzbi4o8~oL*7V(`_nHRwy|(Y4`_AvT zx!+y=Uhb!wM>Vf%zNGoL%`^Ky+5g@C|JlEJz$pW+9I$)9D+7)mc*np#gGLRSIq0i{ z?jQ8#p!neagSQU;)8Mm)Tsh>9AukR2>yVbAD~4V?^!=eH4Eye|w}<_CSl{6%55Ii) z4~Fj@K5oQqBYZ6_Ehn_BZ@IVS=Pl8Z{YG9h^0Sd=jJkZ(ZKGZo^r#`sbrR8*R1CYTMZMy|x$I+Q!^G#yxiE*y&@}j=gj2Yh#1$#rCV)KWU#kZsWL{ z$L$&S`M7~cEjnu5QSTfz<>&{Ge(mT_j?Ruhe*DGbpBn${_>sqKKSoU$IAO|!H4}DB z*gK)FBiC_7$HyHfcV67Nz4MvQPdocfJbU7K6Mr!guRJM=7bt%<1)eCdjAxiF11_`G zBuSVqOQ#guQ7%$k= z5sYPfhN=D5IdAY?WVhZedIrmQhTg{5EP4jZ_6+4?Y!*F(MbBW-Gg!tmpkJZ@xKWQ8iiWB+RBXU)+KsnJSX0qG1ZN zH!zBY-%c5P9b*U5MKV>aV5&%_iictf4?XJEd$EG4BAF_ZsUn#w9*n6XYnvjODpoL6 zBvVB)RU}hIGKD9Fx-*4WqEuz7NT!Np3J=R^rix^$NT!Npsz|1aWU6?im@3K**G%CB zPe#M@Wj~XX+llu!$P+MI)r0ci>lo`e-*K7aW5>zP?>T?tRIb6U(_P7)nt12{`ry~RPOx)Bu(C(yI;Q`O8%66zfQbO+8y9w}^+H_V+Ps=HH+D$nj2@;gT66Sc{*M0i{vU7tfG)LJO

X1- zqP5Gqq4L`*>)J#cD_bp)U+lF+x=Rn+=`|*3GJXwb^ zeLQ&_o{tps!NcDN4*29(Z~u|{wtdy*S7E}M)h_xfTE!E#i+^4$%M!UJoF~#2 z+gGtb(r`Ts?JaPPt&*}(*5aB*$=NRzIYzd@r~E2#1e_7>Naa;H4{;U8I3sGO{r02| zdw>1YiCZB>5KkfExob?~w?F#Qm3mL!Naij5amYQz-NQ6kSVBArMDP|GJfe*kMc_GX zJOPhyt^JEBsQ8CTHjoIo%>g0tHWo;{dIA!AL)MBvfW(7CkeCV$iBWAx^tVFh#3Cd@ zExa)f=K~45kgy90yO6MpFYH3XE+p(i!Y(B2Lc%Vdae`e)*oA~$NZ5shT}ar)FYH3X zE+p(i!Y(B2;!zgZg@j#5*oA~$NZ5shT}ar4gk4D3g@j#5*u_H(unP&hkgy90yO6L8 z3A^~hE+p(i!Y(B2Lc%Vlufr}R>_WmWBF1 zb|GOG5_TbB7ZP?MVHXm1Az>F1b}>~Ib|GOG5_TbB7ZP?MVHXm1Az>F1b|GOG5_U0F z5q2SA7ZP?MVHXm1Az>F1b|GOG5_TbB7ZP?cNey-(VHXm1Az>F1b|GOG5_a*0T}ar4 zgk4D3#q=cDg@j#5*oA~$NZ5shT}ar4gk4D3g@j#5*u``d*oA~$NZ5shT}ar4gk4D3 zg@j%F!Y(B2Lc%U)9>6Xn>_WmWB_WmW#++dn5_TbB7ZP?M zVHXm1Az>F1b|GOG5_TbB7o&}^3kkcBunP&hkgy90yO6L83A^~hE+p(i!Y;;{U>6d0 zAz>F1b|GOG5_TbB7ZP?MVHdx!3kkazVSrso*oA~$NZ5shT}ar4gk4D3g@j#5*oA~$ z^ew|KB_WmWzOV}kyXaMfT}ar4gk4D3g@j#5*oA~$NZ5sh zT}ar)FYKZ}33ef27ZP?MVHXm1Az>F1b|GOG5_TbB7hl*#PXg>h!Y(B2Lc%U2>_WmW zBF1b|GOG5_TbB7s18<0+JtUApigX literal 0 HcmV?d00001 -- 2.39.5