From 16e903f795db9724ba8c513602faf28382d37526 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 9 Feb 2023 19:48:45 +0800 Subject: [PATCH] add test --- .../cn/hutool/poi/excel/ExcelSaxReadTest.java | 31 ++++++++++++++---- hutool-poi/src/test/resources/readBySax.xls | Bin 0 -> 26624 bytes hutool-poi/src/test/resources/test.xls | Bin 0 -> 23552 bytes 3 files changed, 25 insertions(+), 6 deletions(-) create mode 100755 hutool-poi/src/test/resources/readBySax.xls create mode 100755 hutool-poi/src/test/resources/test.xls diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelSaxReadTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelSaxReadTest.java index 2107b43b3..cd0cb8f95 100644 --- a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelSaxReadTest.java +++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelSaxReadTest.java @@ -18,6 +18,7 @@ import org.junit.Test; import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; /** * Excel sax方式读取 @@ -133,13 +134,12 @@ public class ExcelSaxReadTest { } @Test - @Ignore public void handle03CellTest() { - ExcelUtil.readBySax("d:/test/test.xls", -1, new RowHandler() { + ExcelUtil.readBySax("test.xls", -1, new RowHandler() { @Override public void handleCell(final int sheetIndex, final long rowIndex, final int cellIndex, final Object value, final CellStyle xssfCellStyle) { - Console.log("{} {} {}", rowIndex, cellIndex, value); + //Console.log("{} {} {}", rowIndex, cellIndex, value); } @Override @@ -153,9 +153,9 @@ public class ExcelSaxReadTest { public void formulaRead03Test() { final List rows = new ArrayList<>(); ExcelUtil.readBySax("data_for_sax_test.xls", -1, (i, i1, list) -> { - if(list.size() > 1){ + if (list.size() > 1) { rows.add(list.get(1)); - } else{ + } else { rows.add(""); } }); @@ -220,8 +220,27 @@ public class ExcelSaxReadTest { @Test @Ignore - public void readXlsmTest(){ + public void readXlsmTest() { ExcelUtil.readBySax("d:/test/WhiteListTemplate.xlsm", -1, (sheetIndex, rowIndex, rowlist) -> Console.log("[{}] [{}] {}", sheetIndex, rowIndex, rowlist)); } + + @Test + public void doAfterAllAnalysedTest() { + final String path = "readBySax.xls"; + final AtomicInteger doAfterAllAnalysedTime = new AtomicInteger(0); + ExcelUtil.readBySax(path, -1, new RowHandler() { + @Override + public void handle(final int sheetIndex, final long rowIndex, final List rowCells) { + //Console.log("sheetIndex={};rowIndex={},rowCells={}",sheetIndex,rowIndex,rowCells); + } + + @Override + public void doAfterAllAnalysed() { + doAfterAllAnalysedTime.addAndGet(1); + } + }); + //总共2个sheet页,读取所有sheet时,一共执行doAfterAllAnalysed2次。 + Assert.assertEquals(2, doAfterAllAnalysedTime.intValue()); + } } diff --git a/hutool-poi/src/test/resources/readBySax.xls b/hutool-poi/src/test/resources/readBySax.xls new file mode 100755 index 0000000000000000000000000000000000000000..131b8cfcf4aba84eef98fc7139b7b76b386d6fdc GIT binary patch literal 26624 zcmeG_2V4|K_p`?VhlMVRD4c?b2ndH1MLiIS4Fr)yjRi#y!GaO7MNsSoMZ~UrNi4*Y zsMve2C>py#jIoP~N=yv)`@c7Pd$)JDcaksve7}5O9DcLA^JeC?c~ke@a_$G4o69%V zzD0CGD`G<4D=ml_56-|dMjEUM5y1nd-z$|$7Dxy@ehmLb8h8i1`l;Gb40jnsY;$vn z5{MQMt3a#@u^Pnc5G^5EK?D;ZHV|zg+Cj93SOcO1#F`LmL3D&z8=@1$IuPqZbcW~x zQ3|mh#QG3jA-X|q0MQ*{Lx>&_8$tAh*chT0L~n>b5Su{sg^0Gt#s4C;|7}=}B}3sa z4ca1tq`*Cui~+4yJ~$9lb)U!aKq|p2AqVM|e1bQhUvHPRX;jQeH{CgL-Lsf6K_D6# zgswn6l?);Yl#f9y@DE&ViHI?U@|;2|Qx(g%>dKakAaNl1Xpp=O=?mAsl|jHOV-NHh zNTW>1124;IUK{U7fi!{1v277}a1m=UX`qRZIibj*Ka5$L~1Rwy56xENIToA8Km?yd`mZ0&k%n&QK}n`{~% z*>b}7_bx1)yL0vQ(kebVez`kWp1X7PxH|{`o7~@0?H*KechnAFKNVKECSb_TmV}&x zDH+oYFO4IO@qmgk6R8G6UQr}`bIRAxUqvTbe>Yb`8aLchjPw0`h&VoBelSE_ql7}l zHAoCZd@gs6Vs$oefuS+ zqzxUOB#ju|PcazsLLp`jIW?-QQ!#_jZBb+9D7k0IA(W)XbrIsMAStRL|mVJ0TFeC{hyebk^!LUHmgw~XYz6|Q&APCly5rcdpk_XWS zR+R{cxgV}}^tzFj+)J-5sWm{>=W%XmBdD2fqEK3HHoexTS4+4uWCyKtjY9ljt$Gs5 zE63-cGDXD2lnH}*IT_~S!Nd<%xYsqgWU7mZ$?DN1`rm<<1LZ1YFAAWA2jR-`y6`%D zuAsab(*<}MLe~x{l&`G@_$mjugivY7)O8}J{n!KJkY9wiG61(1fM18zK{X0zwD2ID zEzgJRXmOps78w%ANw33I6+P-wk_4?0sD?|Z6jBliIv4;JoklfK4$W0lT}C6R7p%{O zXo(HLu?6IUyfLJy0l0-A9CuH`nr|uyXP~82Ew7^!8^Q8~v=D%6Spwie3w0LPf|VWg z|N8m$UA(fMNywq9j16x7Z48}|O^*p8gN}f`! z8gke$HrFNwOlZ)ns%pUifn2U38VLJN*d42ha%I(YH2|HOwZRr)FWl3O6|zxCPY=~| z&qmH-7tlBCiZ!`ZSz1M;pmEqVtBN2U9u7z%ng)PGs#8WAld514DWH1ysPCrMd!vwe zHrdmI^4L=iKrLb-G#+U9kWEzY9-Q7W2ju5fV)d@BAt#%u-g(4W_Omnl4wFl7<#j)x1g1AP9M(1huHcK`Fv6J5eBgf)xSQxi2=BU0eEc#a3=$BPXll-18_t9I2b73*Z|xR zenaK`4B+{z`DsS!TEZ+v`^!tVxnR9T;drtqWY4&Yr0`30kqH|jw!FPI92S`@98U^V z<)yHWhKWW8uG1fJ)v9ej-jp9)*$eT5CyUzU*>=ZMM-|<^u+~xYX$ixVki3>KMhd}k zwM_BMx3O7Nbx~C!X6*r2*(^LU@qo(#7a|U#eBw@o!gb_=kw*}YC!{Jq`@kcx&FaSz z#y}x{EMY(vf`ejNJnDYeit?im4=?~{`PVP+Z=gJDxBBH-yTV-+l}pVJYyWsc%<9d? zhSeLZPuweVa8}Q({o^i$!gchCr_dChXJg|~)dAXt9Ut%niy`&d<7as0^vUiT_2F28 zj$^omqJh=FIXvsa(G*l6Q=}U&~{Xxl!BDE#cRgZ@n2?~%$%nV3&;;dRSeNJ#M|3OY<{@R>)>*yF? zFo@JT#zRys9cM^%E40$8kV!IiD~#5mAcqR3belvQOIf6@z%|z9&6|}Rn_OcdjHp_X zYb-vDYb-SksOYN*U$<03Mc8M+f+%f$i5o&Lt0Fw{!1w_b;R_{=PT_<{EipBIeG0DX z3PKbZ{R+P73aC?5lMYL|2ImIFG>XuZ0VPKu9)W8Vp^KzJWsoT4#*yH-sNuxG$RP7K zj>KIHi2-pwgaoF<%5Z`Mp++aVV^j;s<&RNv?UulS4x8xt^XJ%;sfBT7FPF=4jH1@f znY{`|t(!A@gaHZ~IJ4)&^aoCSL#Scub%u@s8e@vza#$hxFny-* zl_kp*wigC1o8_3w&(Hr0HKl9PI2(V^8WoASc;}i=f0PN-LIMeW$xvkNQAU>&I2TZH zg7%` zjU&O$$p?`XMH)xaObZDlgmq%vVsSfH2~Lb7kyZwY%-=YY=2}P~AuNvZArp74l@P}` zl6sXvBJ<}XnJ20T?}ID}BLnxD21E)DHB!<%-elG^Mb{pAi&G~`;ovP-5)Bb0V*?|0 zR$9UVqTw1S3(sYr7ocmb zhPr*lMUh*NKMPrrdv-NSmv7HSkuOiL7p7awI9(xoZfKM)-=2#iOG-+F={g#x zD`d}&jnd`Yb5W%7{t{ujwT;sivgam7>GJKlD01J`r^0ldjMEjeXMdw~`Sx5CdHm*9 zVY+pYZr~rXXDQG%RzqXYGXLzg2HLl-ak@hG>}HfM-=1auzZFatme<)hT_Jn+FiMwi z&ockQ!a`xXF2?B!*|V2Xx_o<<`74VPh3QI-(-pF3U!!#S_AK*XcKE(9-Fn993fXg0 zqjdT9Ec0J`E?bDMnAFcSRpv_S!0?aj0X8tErb-hsZlqc4r9lXpC$az^VDQHmFU_6_C9Um2GX?!Gfz|4_t6=MZXO(YH_DViDR1pkA_>^Rl-cj+=lA1SMD#$6 zLvIdF1HfWNcYPLX1B)5m`7GiFoMRDp=_(d2;6*+dSKGlMeR3sjwK*_x1U@kbj}EBP z`3qMwo?$R>exorHGb)rf}rT$ndVSRs!iC`99YFtJz%T{Mbokt z;NA|LF3(ytHdiuKyMo98&|(fAB;m3MHH9Z@oWyu)LM2A7F%wUuSgtiGiB_J4R%)Ke z3S8?=33D*%-hfZLgm-R{lq(sb!$nP?r^)B@f@fD$gCGj}y=w7-M|NgZgUAb;;&@?G z94~ANdGSSF?#wtfw_%@Y3aNcGxssZZ_J^VOO>f*1bho8SJAmmAgpT5l?{vdt)IBe?TZ=i>tKm8LT zXp@LPSRX$QqPqAS>EY*3^PrQ1M410(`uK5()y40vho3*46VhYZWnuiy_3`5ru8ZGK z4?lm}22arSZH4e#kPsY)L^q<{$O8K9^IiwCo-UX?Qh)l(gx88{1Cw>`!y!fj zk&xLg5kWk|M3m&C|qk{wxO5hw?QUPAuZ^=ZM;@O|y!F2CQI4-Nlm5+hu z_9TkV^Ll@w_+c){c_=P26{a|s5vw~*?6SRwR(X^Pj;s2A8awyONGSAZg2e#D1u(pk zPG;-_rvbn%iR&4?OM$scaHf`!)!wXYy(zp|8wfo0lQ=+x2UT$39>_vTcGZQv9L$L6 zXd<>JW`GBO@b~bB)d83SNgYtK9o&0_4^2r^q@=~ijrl?`yqC}DA%nl4d%DvRU+aj9 zc5f%$^X`zhIaJc%;lvZ!Csw2%Jh{Zpq43Aet3Q2H5qTl5^%|+eV6S5TimyWMr0#Pu z-*#ki-s%n;pSN!8_SmUyul%2bqKnsmHe*8VS}pqKTP^-=_x`;eLDMqZ&sZ9pKlc6? z10pxK%+5)5$ys&bb+G7kz)1JZcbS%FMs&Vj>+y`a!FLM7uii7+UQoAN%cu8VEq1$| zvvs#Tu+#S)!X=Zo9L&8`w&v9*g$}KKPVH*=!e>?E8OzUfKOFbUv7ofKBH(<$nj6yR zRcF~ADX2Ch{)YilNALRwLcW?&R&u5L;JrU(Z_Z8+>|NC9kkY=-3wf#C#iH>&#)C$b zupHLbSN@gN4-SH!0>Qk{X5&*8gNHZq!RzEXKMXwLTW#92Df=d!&**&NNUa7Vo8;$& zH(8lMZh4GPs_#_d^tdGYgjtn6lF6%{Rjh6KenZx)Tk{`C9hR;$J90Z*emd#a$d(7j zPb{3WYIOrikI`RDT{*U7Tm0Ub^DA4N@pH;=x7~Mvt=076=)JKUTK7L+XnmnWL`l;G zxACjz4vW9)viK{vC_wGyzI{UNzh2@U0Uy?mrw|t8nXVyPw;i9Nsy@^>WUX_1k`uUfI_8 za=m9>KlR?_Hn3$@+peV-D;nL7c-+{%iYQo^`8cMk8~%8rtt0yb3m)672!6C-*DM`xofiGJoBVdf-a{K)iUaqww+?BPx~jqF36V3*+CMwKqkgj&vEPJ#emC}; z()?*Fk}}Pb&N;vCx4m7?xAGO?9Tv7w(glbwbf_+CCP`N5YKLmqq*mr@W=_WJd_l6z*iR;}yzJSk4R z{_>-3$5U>_o2==1;>FT^pKR>>@*=Sp`(B)t^<+!;Czn#cXHM;Jo<3^XPwQt+33@wp z{jeMBzmr$p7`8-tt@i$(pM^Sj?=@4rd|iA0{;Ss>Uwa?maU|$U`I+Y_JFaYfJ18cy zee>?&iyqHje>P#eY5$_q{dPCjU44CK;M4RO6EDYn?^7e8D0Wx!`Ua&ocQS~FG$MD^ zS9#ID)G{qt6*4{7rr`}{M#9>|-wc^G>rHWt^vcw@Hqqj|NJWVA_;|NHP~8{_wnttfl!^_yq!#V>>88Nb}$ zA;0m!+1Y*4m7pd!_NM>x`qiSL~M1>MkpyDMQ-%)lBugO*Lqv|V(%(=6|$qZ)N+F!PI<`KzC9 zvN)by+|upnsmJv!g6#%-?VEPAB>d=-+=Jw2;aryz1P}F8*@hZEO{U05+Y*%~PkI_fP3q77cl|7v3 zB70-e`D%>${1mSWlZoq7zxEMVgtdz5aN2am)1sX#7Y6xlx$>+}rxTJv3z!i*+Jw}5 zxVFky5j)eLjPyNF=kmyq?a$x8PXBV>=^4MSEspQ}Fly)c<$-uk;@(Srat3UxTJ(F#mlgjSd_8@RMZQV1)h|O!-|fgeYxjHKnBs?B zJbWzsU97c#T|-Avx1G~nhuj(FE_anVA5E$)QNIg|*kFFSo3)t!2wJ8SU9UFkJM^t!lj<8xAZuKL7NFSFtf0mk+LUK6%#j z?1Y(P%&x}vK6k!rgypR7($D6^xHcH$S|?)Np{4D&?M^-)AhUGZ^Yq~-p2Mdm`HcNG z-*erd-JcfCEJ!kGylZc_c|qO0W2-&6P*%PqZDWU&LCZ%pelvMR$I!!BZ=3CY>R5YX z*bv8}72np{c)H+1S^A}?b+atKYW>73>Tt}v*6v7yei$IkV1F5yjns<}U^%3)vo$rTevNrn!+xZ8TJ`%lx)t-oY4`EEeuFKX%icj^}z5D3TYS9^y zH+b9_S`0!lUJzIs#&pz1pu0NK)W)Ai^43ba6?In|nu?CF4AYywdFt22q&xL%FkKPC zL>B_OICPCbgToqL-}AXKViGYOP0_Igc2=gO7p@l3r*LrU7?5zrwaZDhBr}u_e>RNj#H?4f=xmp9@) zN0C#ov50{^D}K@f_oq_Wtp-vL24B(%J~|W9^R`_^5&Z1r6YwgYyxFn+gKw;!;?3 z;0K*>)xm!3X^`rjFI(#GeT}1^n_$;Uoj`_BAP;^z3?)hVd$azLyT6eJ@YN$1`ok_o z6J)SD7hb7p%6xqKXKCQijye_}E$W|TFdwD;sDY0f_#e~2a`>171FLB~??TTEFUCu? zP`D{)MZGC!NS?$UqG8eTjFAnW0uBkupuQCVvB$GZ`0YHT>4}<^CN07}y{#rKMo$l3 zd04+NB@+C=2?UWPz2ONdp1^_=hX}no@L9z#V?|-eJbW~l<`ESPIpD+I(bHH$LTM>B z#Xt({vMCXqJYp?2WdbRr%%;Rp66M7d)@V)n*#{q;LJ5)IayeWN_6}vQCaRKR$io9< ztcSS6sW%JO!!uh=y&kk)k5IOr2xzhOu0p-%P|pLt`x^|OCA&=fZtOH5LwMwDjP5C3xDvku<>r zyiE8z*CC@C>vc1p@c@1%Fpw+Ydy_c{&zldJfIAyVi~E@&u)D!iWAr1(U|nuY@2E!% zsAbd*_(hfDwHKWK)&L(FNANYW>4Ok1RHq+Wq4rya&X%z~FiS!_c=3J*5EgzvaR7iPygJoyAKH{}wLzC`j2Mv%JT zyGzJsuxdol26P=p?d)g5;kN~mEHi|0T<|Ol`GTc7=goF3e(d6g-LpIS0+9VsJd1%q zFNSJGCV1V?L=Y43zoRl~&;Xz!%OdAtLcc*NqbHB#Jm$~?4x7o9?Zt=y5#e|~0Q~I+ z@Pvbr4p}v6Q~4KSfuF(mv?2a|Ux@vsQ>cL{5LL}hf$&XJwhehxpe_uJgAZe;G92=; zb-1ZadxEl}CW6yWB9!p}S5HeqZJ1IEg)7=H27MbAu{O+Rvvxs{I@rqp%~w;> z2By7!^d%`f@%^#y(Fa4P$Ns{F%IE?YN|#g`XH?Vf7bF@Sj0aYxx>gzd1~5k(?^>A# z5)J@QGLZN0fd44{e}{&#I)8@#Xh4ik##@yy|k57gQ_?;pm#LRo4ZzBt=RNLy|_X!4*o~p9(l84 z``OhrgIdfgfO3IYu~^CSwOR(X5nE?Kk@f#790>1A#3U%7VhgS3-D_OMJV4Wtjsq+ z=I!U_7W8UAN(_im2I!SOhd$K7(g-*CrEc`Wg*IRruD0~8eZI7PVbq*=YWa%S^QQndbG@uK;k2ff8GWQIJ$CcF5K3!x`M=!em! zARM-v=>mF?o(-uCDc>cqyea(x=?41IuTScsGNAku zpl5G%%Tt@^FG=YwQoo~q=(wRnC(XpelJV-XHZd6fvA>qLcwy#>OY{P@QUO!VSDr9Q zua8u1Vkktcb(ipnwd-HSd6Z-L;cIRJgx7fxrG-N?~1 zmyF6iFBx5%sDr)-=($Q+t|BRDd|pj4^mQThFnPl8A6GaSE4H2F_4A_;x-E~tye*HPet!tg&Jg+&ik^gTRd)Ly z)mymO{m3`TAbYNG==)^>9_yU)mYd$yp;s2@DLnS@(LLi46+QZ~?WBv3Zre#8hrVAf z6Pc5jCkdw*)UG5va}XVZ+4RlT)myu6?J9{aN*rn*0W9;%C`Fn-X zIZ_ng{jv;?aEi`&85<~15|coXoc@0QjgrSt|6U0FsStXp_VWvc)6HpD-ku*+^eTrA zecF1n_1Rsc+j{nl(~j!unyxj_|J|vzRv%eQ!^(#_a{IuW?r*imORI~{0;Y6_pD)7` zeZ86xFo{;-eZcfrV3Cq4(C?R2fr6A&AyH}ty3~?5a7>p}p`z3Z?39u?&^?q?fqtN* z3UnwXRiH(eRDmX4QU#8Uk}A+Sl~e)mo~2c2EVTl64@we=TM;Eys4um`P*(+xKivr! zt=3mOUSk-Fl;ypKw}NTq+zAIJ-rezbo=W*ah8F{pO-F-_C(zWuxY05hqvHsL-z$cW$ zEZb(}HRW&FgnY|r{|td9y<^9YJcwfhx@sL}I<0thdk5wuh+z**+7x?rnv)N8xD;|67F`v=sG^Z7$0b2#fXmpzYm1!c%7Ft0&aH+P{I^Q!M$Dl$Y z?_Pbapx)U$-KkOU4$T>le!n#ZwF-V434bR$AmM(CFXROfpLEo5nPi%E>HLz^6a&)P z6b&-S1%gCSbG**qJ9?%T10r}Cj+)E3*eOCM(IEYb0qJat1{v%EK_XZu(IC@`0l|Jc ziiO(=7j#AFBpL*}j>iY-Y>EcKzM}?$M6gbxL8cc2Lhlo$6E1#>&`C51Hd>Dl(%BRZ zg7v-zf<&-RqCsX91Hz9CQ99v9L=ifP2En$#@j*J9qCrwF5F~6b&-O1%gDdPIQn><`C>}R*BIdlVrH0WIW+c$6c#$ zN@2^q-I|X`JUbYP+H4iJ{=;jqF@|)LibSUQ@Eb?6Nj`J>!E3>AZdQaG!j)>&Tb!Cokd8Ya8BQFQ@?H$c`N&w$6k$mk}1f}PS zO!I4heJ7Z2pJ={Q1NcseBh^PLvJw;__RJ=H0`m6_&G-g+sR zZw>iQiLg$;J=cM6RE>Q9COVs*?0hYlZ@*~1LH0Z}lCN&holS2%xht4&|7gBJ_B=9@ zuWrwsO@DsvnP9#rMDq=@=dqD|b$jk?>fCcEnD2mSzCrdpF_N!t&z()XUVbx}@4#rj zLH67j$yc}M&ZdtKJQ2)y5cy6k$(~c-8&#uV&kc>=fBc}$m(Cd>@1F-p^9{1+VUc`w zdv0hvv}JQJ-`Z%tLH0ZItdyZxi5nFyciq))jdd3;>yb5uIb5u(cMB|q>&|LbwrgxMyUQ@FxK&;I z{bjbNe$Q+|)n_ipf)~TAfNm$(lY&;!&_N}jKYhX@$Mz<7VVB*VF$w) zm^I|xOB~OU{Gt=5UG1*BvUD`;<uQ ztEJt#)+0qf@GIo&vT$cnX%J1xPZ^FZ+)gZ48l)_C%8|uRIkMO($}*9%{Qb6l8%Hj? zH8XBSyTwI^(v-Rw=2Y-2Wa>Lwxx9bdQq&3+DN4hWOL`_;iO}{NX-)eOedU_Vh);_|yIPbdFy9(LQ{A`i4up z;>W@GGyM2;onHL$K74(e7WwK!&jsV3=*Q>O?8Tq#!`G){kq@?<9)w?sQ+4n|=7#a- zv|H1Gs|K997{(y@A?7%CqD&f}ryM`jfp1uO&pVSio9_JRT)#i-3moR?K1BCtbObJc zMnb`#*(u$J@Gz!5!t6Z0F3hs|X9D>5QT#J5{#kq>bK1erXfFPx`_oF9P5y7L+_$ma zy40;lvkUk$hg;K*Kj(K1$7S-HM4`EM%4x2ha++(W?yxSDJG7qKfc~n+-+7n{FPD{) zkwvmbzNwz(A$5gZDc8!?*s@uGr|V=DatkGzKwBX#piRbLT&7MQ-vagiir<;AalEJ{ zlUXyFly~@%$DuTkvX+C~p)}rY^_ROfx$Fs6FoTKQhg046X?d)-9`5>U_}gn(h$07O znDQ}XG=3WkJPbk8cB z4=GU4tWqiJfO9XlnoV{tpQ~&`F?uK(6J8q2>$Dq8>RTPPlYgc^QQ9|n@D71_#89cZ z%ws!xC>ryK#XL*pu@|U+k%K6?0rycd2!C_TUh+$RW{|nOAh66j^!z$kt4$e<`eo%g zgDuBkC@XspSKDA$Sp8&$RsrldyOy0AWihs16jNM|VU6;|u@*Mau@dKw<-w=47Dop- z^~nBE$+-n$cz@VsY`YTqO#9;wSa#eWpHF{iT^&DuNi=W_3#W3E-qsyBm|wZ&o}(Ym zZ|V8qMoY$yeEcO$q;fAJS1rt+i^%!#OhkI!3lV!EwjgruZ$so!#`TE35wU}${Q6HZ zE%DPc>m2y)@Af_YKyaF#dES-FSFifUs^&GR)2?5hS*duo^<4Y^E$*7;t<4o zMCK2}eK_I>#F2=j5Jw}9L1g|Xh`h()v(vyroKNKm)s&njU&nnlPO_E~Y9y)7*ijfgMH}GF97$|aurU}QV#WVBqyt=JN^T3oe7&C9l*1uZlynMhfK)4Hob2@j*dpJRyQr&#{{{ka-ExFzLOa9FNn S$fzDDO`aK_qWwcP{{IEO4QKuU literal 0 HcmV?d00001