From 88bbfbb3f747e2f18768e928facf11712ab7b4c7 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Mon, 18 Sep 2023 06:38:37 +0000 Subject: [PATCH] Bug 66425: Avoid exceptions found via poi-fuzz We try to avoid throwing NullPointerException, ClassCastExceptions and StackOverflowException, but it was possible to trigger them Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=61562 https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=62068 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1912383 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/ooxml/POIXMLRelation.java | 3 +++ .../extractor/POIXMLExtractorFactory.java | 2 +- .../hwpf/converter/WordToTextConverter.java | 22 ++++++++++-------- .../poi/hslf/dev/BaseTestPPTIterating.java | 2 ++ .../apache/poi/ddf/EscherContainerRecord.java | 18 +++++++++++++- ...nimized-POIHWPFFuzzer-5074346559012864.doc | Bin 0 -> 9729 bytes ...imized-POIXWPFFuzzer-6733884933668864.docx | Bin 0 -> 20757 bytes ...nimized-POIHSLFFuzzer-5962760801091584.ppt | Bin 0 -> 9728 bytes ...mized-XLSX2CSVFuzzer-6594557414080512.xlsx | Bin 0 -> 1523 bytes test-data/spreadsheet/stress.xls | Bin 97280 -> 98816 bytes 10 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 test-data/document/clusterfuzz-testcase-minimized-POIHWPFFuzzer-5074346559012864.doc create mode 100644 test-data/document/clusterfuzz-testcase-minimized-POIXWPFFuzzer-6733884933668864.docx create mode 100644 test-data/slideshow/clusterfuzz-testcase-minimized-POIHSLFFuzzer-5962760801091584.ppt create mode 100644 test-data/spreadsheet/clusterfuzz-testcase-minimized-XLSX2CSVFuzzer-6594557414080512.xlsx diff --git a/poi-ooxml/src/main/java/org/apache/poi/ooxml/POIXMLRelation.java b/poi-ooxml/src/main/java/org/apache/poi/ooxml/POIXMLRelation.java index e4f6e08ef7..ada90eb75d 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/ooxml/POIXMLRelation.java +++ b/poi-ooxml/src/main/java/org/apache/poi/ooxml/POIXMLRelation.java @@ -198,6 +198,9 @@ public abstract class POIXMLRelation { * @since 3.16-beta3 */ public InputStream getContents(PackagePart corePart) throws IOException, InvalidFormatException { + if (corePart == null) { + throw new IllegalArgumentException("Core-Part cannot be empty"); + } PackageRelationshipCollection prc = corePart.getRelationshipsByType(getRelation()); Iterator it = prc.iterator(); diff --git a/poi-ooxml/src/main/java/org/apache/poi/ooxml/extractor/POIXMLExtractorFactory.java b/poi-ooxml/src/main/java/org/apache/poi/ooxml/extractor/POIXMLExtractorFactory.java index 2de39e3669..a648f26d9f 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/ooxml/extractor/POIXMLExtractorFactory.java +++ b/poi-ooxml/src/main/java/org/apache/poi/ooxml/extractor/POIXMLExtractorFactory.java @@ -229,7 +229,7 @@ public final class POIXMLExtractorFactory implements ExtractorProvider { // Grab the core document part, and try to identify from that final PackagePart corePart = pkg.getPart(core.getRelationship(0)); - final String contentType = corePart.getContentType(); + final String contentType = corePart == null ? null : corePart.getContentType(); // Is it XSSF? for (XSSFRelation rel : XSSFExcelExtractor.SUPPORTED_TYPES) { diff --git a/poi-scratchpad/src/main/java/org/apache/poi/hwpf/converter/WordToTextConverter.java b/poi-scratchpad/src/main/java/org/apache/poi/hwpf/converter/WordToTextConverter.java index ddd7ff68d5..8cb7579621 100644 --- a/poi-scratchpad/src/main/java/org/apache/poi/hwpf/converter/WordToTextConverter.java +++ b/poi-scratchpad/src/main/java/org/apache/poi/hwpf/converter/WordToTextConverter.java @@ -22,8 +22,6 @@ import java.lang.reflect.Method; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.dom.DOMSource; @@ -53,10 +51,11 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; @Beta -public class WordToTextConverter extends AbstractWordConverter -{ +public class WordToTextConverter extends AbstractWordConverter { private static final Logger LOG = LogManager.getLogger(WordToTextConverter.class); + private static final int MAX_NESTED_CHILD_NODES = 500; + public static String getText( DirectoryNode root ) throws Exception { final HWPFDocumentCore wordDocument = AbstractWordUtils.loadDoc( root ); @@ -109,7 +108,7 @@ public class WordToTextConverter extends AbstractWordConverter serializer.transform( domSource, streamResult ); } - private static Document process( File docFile ) throws IOException, ParserConfigurationException { + private static Document process( File docFile ) throws IOException { try (final HWPFDocumentCore wordDocument = AbstractWordUtils.loadDoc( docFile )) { WordToTextConverter wordToTextConverter = new WordToTextConverter( XMLHelper.newDocumentBuilder().newDocument()); @@ -118,7 +117,7 @@ public class WordToTextConverter extends AbstractWordConverter } } - private AtomicInteger noteCounters = new AtomicInteger( 1 ); + private final AtomicInteger noteCounters = new AtomicInteger( 1 ); private Element notes; @@ -130,11 +129,8 @@ public class WordToTextConverter extends AbstractWordConverter * Creates new instance of {@link WordToTextConverter}. Can be used for * output several {@link HWPFDocument}s into single text document. * - * @throws ParserConfigurationException - * if an internal {@link DocumentBuilder} cannot be created */ - public WordToTextConverter() throws ParserConfigurationException - { + public WordToTextConverter() { this.textDocumentFacade = new TextDocumentFacade( XMLHelper.newDocumentBuilder().newDocument() ); } @@ -312,6 +308,12 @@ public class WordToTextConverter extends AbstractWordConverter Element note = textDocumentFacade.createBlock(); notes.appendChild( note ); + // avoid StackOverflowException with very deeply nested files (mostly synthetic test files via fuzzing) + // if this limit is reached in real-word documents, we can make this configurable + if (note.getParentNode() != null && note.getParentNode().getChildNodes().getLength() > MAX_NESTED_CHILD_NODES) { + throw new IllegalStateException("Had more than the limit of " + MAX_NESTED_CHILD_NODES + " nested child notes"); + } + note.appendChild( textDocumentFacade.createText( "^" + noteIndex + "\t " ) ); processCharacters( wordDocument, Integer.MIN_VALUE, noteTextRange, note ); diff --git a/poi-scratchpad/src/test/java/org/apache/poi/hslf/dev/BaseTestPPTIterating.java b/poi-scratchpad/src/test/java/org/apache/poi/hslf/dev/BaseTestPPTIterating.java index 7848f688cd..ef146dda23 100644 --- a/poi-scratchpad/src/test/java/org/apache/poi/hslf/dev/BaseTestPPTIterating.java +++ b/poi-scratchpad/src/test/java/org/apache/poi/hslf/dev/BaseTestPPTIterating.java @@ -35,6 +35,7 @@ import java.util.stream.Stream; import org.apache.poi.POIDataSamples; import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException; +import org.apache.poi.hslf.exceptions.HSLFException; import org.apache.poi.hslf.exceptions.OldPowerPointFormatException; import org.apache.poi.util.IOUtils; import org.apache.commons.io.output.NullPrintStream; @@ -65,6 +66,7 @@ public abstract class BaseTestPPTIterating { EXCLUDED.put("clusterfuzz-testcase-minimized-POIHSLFFuzzer-6710128412590080.ppt", RuntimeException.class); EXCLUDED.put("clusterfuzz-testcase-minimized-POIFuzzer-5429732352851968.ppt", FileNotFoundException.class); EXCLUDED.put("clusterfuzz-testcase-minimized-POIFuzzer-5681320547975168.ppt", FileNotFoundException.class); + EXCLUDED.put("clusterfuzz-testcase-minimized-POIHSLFFuzzer-5962760801091584.ppt", RuntimeException.class); } public static Stream files() { diff --git a/poi/src/main/java/org/apache/poi/ddf/EscherContainerRecord.java b/poi/src/main/java/org/apache/poi/ddf/EscherContainerRecord.java index 74df2761a6..da4d2a3289 100644 --- a/poi/src/main/java/org/apache/poi/ddf/EscherContainerRecord.java +++ b/poi/src/main/java/org/apache/poi/ddf/EscherContainerRecord.java @@ -50,6 +50,8 @@ public final class EscherContainerRecord extends EscherRecord implements Iterabl private static final Logger LOGGER = LogManager.getLogger(EscherContainerRecord.class); + private static final int MAX_NESTED_CHILD_NODES = 1000; + /** * in case if document contains any charts we have such document structure: * BOF @@ -86,12 +88,26 @@ public final class EscherContainerRecord extends EscherRecord implements Iterabl @Override public int fillFields(byte[] data, int pOffset, EscherRecordFactory recordFactory) { + return fillFields(data, pOffset, recordFactory, 0); + } + + private int fillFields(byte[] data, int pOffset, EscherRecordFactory recordFactory, int nesting) { + if (nesting > MAX_NESTED_CHILD_NODES) { + throw new IllegalStateException("Had more than the limit of " + MAX_NESTED_CHILD_NODES + " nested child notes"); + } int bytesRemaining = readHeader(data, pOffset); int bytesWritten = 8; int offset = pOffset + 8; while (bytesRemaining > 0 && offset < data.length) { EscherRecord child = recordFactory.createRecord(data, offset); - int childBytesWritten = child.fillFields(data, offset, recordFactory); + + final int childBytesWritten; + if (child instanceof EscherContainerRecord) { + childBytesWritten = ((EscherContainerRecord)child).fillFields(data, offset, recordFactory, nesting + 1); + } else { + childBytesWritten = child.fillFields(data, offset, recordFactory); + } + bytesWritten += childBytesWritten; offset += childBytesWritten; bytesRemaining -= childBytesWritten; diff --git a/test-data/document/clusterfuzz-testcase-minimized-POIHWPFFuzzer-5074346559012864.doc b/test-data/document/clusterfuzz-testcase-minimized-POIHWPFFuzzer-5074346559012864.doc new file mode 100644 index 0000000000000000000000000000000000000000..add1da339f29297332396d35cfe927ca2194dc9f GIT binary patch literal 9729 zcmeI2U2Igx6@bs(y>`|F8`~ITj0p>Dfi8)&tTFxpjMo_0tf9u3@Y4j71)K0^Z(=Wr zsruknM9NDgnpWydrId=NM2ZN!Pv$nRj9)5cjn$}Usm>d zy>3+@Jl3~!@64SuXU@!>pL6~BXI1xZepvsFR=7j!&+#7b?^+VhcIk_jj#zK@FUm^TVN}wUQyz0@T_~^Nc=p+U^~R233fm; z?1UC*g*Ir1U9cPWKnLuFPDnr(?1OID4+r2NB;f@}K@S{)!|)U6g(J`hN1-2%!HaMl zPQXbx1wVzC;AJ=s18@djfi#?jb1(=)plyEDjc0oHe{*F~TaXD}rI(fks8!@+^D76m z{|;X~H<}sCoX>_&WJU*{>&{%hIy^LzHEY7*eogDnoHM%uy>8^jXp7=Q1+$jWH`CT9)q5wB}Y=Wj3n*Q0CAeUGs!kP3$y6eC5g`a zQ#Z|sTEo~nD`WIYWF+#FjkI>6$X4ye<&dCL?E~2OAjPmObT{5};{?zx2l9eyX>$e>^)p1>~>PM1##J2d4FnyrSIhm zS#Nie9=Chxg?9QP_xYeCqZX~y)^4}-U0nT${2ofQBY%&5z-~5mw#^}<+sH^*-N>kS zTkF@f5J?iHG}`wWDRr}GUzjc_bg^XA(z&BdR@3e#V=Wzr9oRvwSSu@U{ZndgjZ107 zVz%r}l}aD%OEs85=M1<8=CQ6ym8J7pg*=0$)!uRQtG4LEF72dtA$1wnTX~DQ7^y4}6}f56Po9Y)W0ES(cWvd+9KaenvkWV6w74f4i~yya+FVP21& zAxqzc(;>!#w)2l>T$ITs)59&4SDkj*hmcT0Uua34kJr(TJEk3~jW=pyJXOUCF>rmY zb^1E<;`MJQwM2-zYIx;pn1Q!Z@=wN^E2N$lc%vc4xblxEM^-}~Sxk1k1FeT&EBGO5?(gS&s-OwpX6lFDW&>pZ4&tzMOb z)}%q#C(K}Oy?m3gkRN8YER<*&;y0kwEwA!51hlalG=T+-N1V<6!P*FSU<)aW`fLMQYPTdh1H%g6Q*_pOEfi27Ccib22fY_6-~V+;wr#olmFn{cP~U>)cY=<#B&eTZ5Oj8a4Rk*KIV^{_ zLFdZff|}yHht3&7WgJeAUmOk}PhYu~9vQoQ(LKEC5TAf2ch*yzu@iG&W{nlK?rvhW z>N~``bbaLB|CzXk`}x9`Jhy{~mb1*LoH{r5%I)X=j&{u=Lj*a+gn!ZbXMJx>3^{r# z%?$&zV`FaOBJPvOQ~MqzR=X^PA}wIHB!!pNaq|DLcR;?%tKJF9n?buw8L&V2FKwf==uDi{O}LC zClB9~cc;ZXnHQ^qm$cz8hOAg>CH}9VRKX>ju}71G(j1bGsPsprB_umT(i)Ps5Y9r` zpTu8}SEz@$^KF@S)~b`%bIz*M)^pgt9Kus2JEGbF^hIx~1UFlW5g~pJs*DDGs)bLl zRT4{8Kax^yQi5pB#)JOU{zf^|-(Fvja<6@@J{XQGGvVJemm&}RH{bYg{_el|oB!r( z|4sfai2uo@YtI6@t1<9BN@G4%B_h%sk*0{%60ruZ^OXi(0mqZdK5kG8J6{c)vTL2P zp_r_{{Ym5P@GlY@Zjaa-VbhHfI|A_|e4V;+!HVf|R+_lm8kdTg-uS{?=Vv{@1itw6 zi{Ce{t^CdJI6pu8;Dc_`N^;Wlo05K~@fuaBj}nw}wL6p}L+@hYO(uN9I-RukKs@_WuGqjq~)#s7cAHq4f5?Z!}l=N#MuS8+4DyAMYLbN^Kr-Vz76Gbt6rEv bT8mKNJPKszZCc?En4Wik3Mu9P2Y~+o{T@{Q literal 0 HcmV?d00001 diff --git a/test-data/document/clusterfuzz-testcase-minimized-POIXWPFFuzzer-6733884933668864.docx b/test-data/document/clusterfuzz-testcase-minimized-POIXWPFFuzzer-6733884933668864.docx new file mode 100644 index 0000000000000000000000000000000000000000..36132483c9bb0064b82dea4895e3bddd5dab2c67 GIT binary patch literal 20757 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 literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/clusterfuzz-testcase-minimized-XLSX2CSVFuzzer-6594557414080512.xlsx b/test-data/spreadsheet/clusterfuzz-testcase-minimized-XLSX2CSVFuzzer-6594557414080512.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b6447933802165bf0cb312d096e9d019397b30f8 GIT binary patch literal 1523 zcmWIWW@Zs#-~hrkbIhz6kbne`U6G?-o?nz*oRON^1(hNLdE1n|7Wjl{or?9j|Mc}HnLo?{-s~I)Q-$9+GBGerWMg0m@MdPWGtpU z+UwqzxZ>zqlf-+yj=?qO^0Uh8AL`alXV)n<_x#IRwJPesBCACQug-FJ+1R&eqFw4E zH@lTC!MAm+z4TJdEEh|BFykrjIc7YEe{o8(r*m-2DaVH5@9ZGw{}YQ6ssRR54+FzB zko$4Cn;#LdN%{HN;P4EJ^=~#1slC5GX@46~0nX5349bDgn$O3xieV})&P;#2c?ui!`4F1;gH4b~f{8~!Z0 zU!K$57qysmNg)%@R-@F_*^H~7zRBmgtaM8JhNrySicH;&8y0&yJl;FEz;D&TxS$-J zR~J_Hyk5$`a`n!sS-ROzA}96i*q!bmX!xxm^>a|e?CH)4r<;%Ze^|CEs`bBHZq=24 zCq@1KT~K6QRAO4i_}qd|=7Byh+kKN8lG~TDUA(WdZs~(^u4Z$)oBg$$%h|TC+|P&Uo366n(b(fG-KqsDxFGik^H4DcbkGWoLJ_o`+E2V z-dnb`$7}r+p(iCa`=(h{F!?LrD*cdkAfk}JH!3=bKX%@mi<~+|W!ulcD^LwLj9M)E zbmyHPzt}Ura0>oRnSbz_i_9~I>Fo-0V2C(lf``K||hQrkxOcORMsZE}J zNn7A4_hID+Ii(W6-~O31UumY)jc%_mOJev=o%33A&A& z|0VC8G1K-!`@}U3M*0m4L$CCPaqrmn{H)w7E$g^~X@;(c40av3)XU4%CULj%^8z*# zqbE-;Ec5lhcVdRy`kj-rCQ1F=rcrjMUMe89XKlo_5~iBVQxDvlez?Bk)$hQEomcKI z=(XQhqdG}v?=g*pnLj80DN&yFsfEd3_UEdUse2hgUgVcP&9e&V0U4k-1H2iT#F<3^ D`d)d) literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/stress.xls b/test-data/spreadsheet/stress.xls index 0c0044cfc459a3bacf826f644ddb477249f15bc8..5841042e61a129ab9e3bae02dfeb1a29079a6cee 100644 GIT binary patch delta 4684 zcmai%4Nx5A9mbzM4g!fGa0Cb^!g4tp!z6GV-z1gvY%wC_gJ{}d()55Mfxv-xr$O5B zGE5vRowkv+VI*2BO4?FW<6Rq-YMVi)%pg_6C?5wiwRD_m(6J8Fj2Zm6KD*p4;c_>^ z{Px{__y0co{QvLnyL+duN1r+!b5W~_`zwI2{eJ)7yz4bbHPM%^y;nRaJ)nI|Guz=^ z(vC*OCjPE?@al{ZC0)5t;)#1JN@|Qxmqu>skt*Xer0Vt8y{F<^H0}&-GG0IeU^rxR z8g>M>d)f^dT0I7l%oF!I9<=dHpsBRBI&D0=5$CaiXZPB9Zh6zx#Qr1rEw(|pA4a?= zZig91a2O&svvV{5O~@rC9K}}b!2S8Cg$<2L(Czr9L5DfWyO3~NE5u8giK$7vKCbyi z;7{C<|FlEW%gGz13(0Y5i9A%!y^np|O#v>8A7UeP(!0s2f=(VUB+1*fjlsw#6BGN^ z^{s>UB_%Rh%1cQVQlz_5@`P0BWJ;binX*axIyp`nP1zvmr3#(s{XC^z&}yIY6i6+b zjAAgectk^^<;9|4Ytm9akeKv@KFKT_i^6*4EFkbG?6Bz7!=#urU3mSNkidH)1+EDR zJQFD}HYD(aNP%%7fqH#dkK@%LHIR-*3S6CacDRhkt3xxs8c8iQWq^lOL|z3=7P|yABz+in)P_3z>uuXS)9&qyfe)Op*1*oTUf_@ z8bfZ6bCCi=Yw%&Dz|b0GXGFMkXboB-1%}i>dMQ%ijamOIBg~ztVYdF!cl^O;{acyY zg*QFfa?s-9VlW76xD3dBZnxVXSRN&JrZxP)!NI|s23Ay5r~@~O*4W?`r3=PX=`*8l zrK4Lk-uyVp*Z%u|S4?w(l4it^qQ(Z+s?hn&$O;?iuLuon2p_omDfv}a_KMjH#;q#{ zqglrA1@VtRbyGoZtYoIax;kY!6J?%G3BiH#nk;z@A(_aFw-WgA(`w*HhHUxGrM$a> z^XBn*{O~Ua1;v%VfDNg9bG151eJ#k!fxAE%6jTdLrgUkuZ6*87#;vOruj)fxSHGT&PVy~A3h-MEIk?=FEo{!it^35ovqH!V&G1z-QMmJ z8yq&P%O*OH+ib4w%`Th6>S}k0C!1Zz#kOXrv)O)3?65YRupYCqb-2ZEY0WI8JmOx7xX}iLK3T z%`UOMNlIucPcAAeHkTCBU%sgY_R_wxNY{0KP=JWFG*9Ra={59~Y&_-JtY zN5Dh;UdgWq-lfsxM!-v>pV^ohzo-_D13#rvXA6)>qx~m!`J>}vx)W!t2; z1FzEgBW%;@{B^cvP3ldXn^R5o)}0D zF_UsPHx^PwYDpcbCoRN5x=1(aA-$xZ43Ht>A;V;ZjFAcABlBc|ERrRn*-ryRNA$!% za)_C@%ek?TDpE`8NIhvG4$?)sNe}5I{bYa)5f2$ABV>$B5FeQ*3uKWj5lt-(5FODI z1IZ!gTF!qtcPyle)RH<g>1jopYrA4+T9uwwq~BJfWYf7s!2j4C~&NIxEsp5brg8uX}9!FtFuZ^3T@rhThS`xNC*17m!uvJY;# z)X%AdWa)u`YoF?xH_#2zvx@X5?2}79yUO&eDm|;1{+}8pD_;v3m{pbMj;@lPQ>25l zIHyQ|J1}TYm7Y_igQn+{dIU|+DbiE81A91QCQaY21VI#bN?HF%eWg21c&kGAqVKLl zLZx2x+q)j;A HDQN!>lK_E9 delta 3365 zcmaji3v63g9mnzCb(}Ow^Rm;%jhi)&lTaGerMPTuJs@4s9%QN71!y4^bDJtv>uqfs z5bDC1gXw@pFl{-o&*hs-9(r%s=P2?`5r1rP*8KsjcFJf2MuXZ?%uh8tKB)w=NT@@mMZ% z+2t`OJSFA@S7og`8~Y8HYh>-nS~;Itimf((B6gkmcTKCc-fZ@?S~Zz|mdBj*c+7s! zhWJyS)0Q*!?6ud8x3XqfQ3*sRfPZ){WHx7w-#HzVxkR z@h)e#!qwf(bG7c=;}_Wi-^>@d#um8Sn`gvgTj0a_0!wUx$=rd{owhYFl^b(TJ>9vw z>gHS(Pj}iYKAUeed&Mv13$$0~+PjUbQxJw9&u%#K=^!bYBLoZ0F1wY|b~@ zlFJ;{OMwgDUJ3kbWAnD`a%S&SEEY>E{dQ1x@TJd|Q!(vLohzMI9s`+?m+$&gr|f9U zH_!aMskb;glX+kBmenI4f<9B1uG;eulgs1%PdJ|}9TKOiPX!cfb z*dAptmFl+BM|%4{d;H{y&pfOuCHI)W?A%{C#Vk+8@7T3tx8rOm`!m{Bo?cb&m!cH-hk&$)&Kqx%zRo^<KN8g zO6puI-F;B{4vCd~S~^f6eeE7;mINd3JtTdOr}h^QOP9&C_lOiH)7`yP#@`jeW71d2 z^q0pa7m3b?rJW?&bf46JgY;e6ztM*8mwrs*muTxqyzGS3O?xNp6SQBV{SEDT+7chD zMav>@)=eiR##TS=)3gh;^;G&wpR}Gz|9ndF7R0|WczZ?Utu%whsOkbscUk)3AElwI zEa|_b7N@0s<(8rt!Z1cLhH=D@z$B8G!7S!5j}#W+sIXKDH@xtp1%V1Hq97OT=s*{` z(StDhF@PwBFpN=*VH`0eFo`5)FpD|NBZWmcDoFrtc;QD20+kULj9jD8FtiXjYR6k`}i3<*pk zi5bjd4)aK15e_#Azzr|_XmNA@16%~rjt+F88$Af49|MSD2*Vh~7{(Dp0+UE$2D6yM zJW^PMqnZTZh8KRcRI@DtTm;dM4s@X#JqX8NeRQGDv479V-$T~EcaE1cfsnPW;tCrx^XL2({==d4$a4=`%_E7B)#U!@UQ5S6Y3Y?imbM(XbSnIP LCg1e*LzeS@yy8+(