From 26f18ed27a5b094fec4bfab3892fe0d0b2e5a47d Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Sun, 12 Jul 2009 07:18:42 +0000 Subject: [PATCH] fixed XSSF and OpenXml4J to read/write relationships with targets starting with '#' (internal locations), see Bugzilla 47504 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@793280 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/POIXMLDocumentPart.java | 26 +++++++++++++----- .../marshallers/ZipPartMarshaller.java | 8 ++++-- .../org/apache/poi/util/PackageHelper.java | 17 ++++++++---- .../apache/poi/openxml4j/opc/TestPackage.java | 26 +++++++++++++----- .../poi/openxml4j/opc/TestRelationships.java | 5 ++-- .../apache/poi/xssf/XSSFTestDataSamples.java | 4 +-- .../poi/xssf/usermodel/TestXSSFBugs.java | 22 +++++++++++++++ .../poi/xssf/usermodel/TestXSSFWorkbook.java | 3 +- .../org/apache/poi/hssf/data/47504.xlsx | Bin 0 -> 30048 bytes 9 files changed, 84 insertions(+), 27 deletions(-) create mode 100755 src/testcases/org/apache/poi/hssf/data/47504.xlsx diff --git a/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java b/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java index 09030222c..76671d1e1 100755 --- a/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java +++ b/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java @@ -19,6 +19,7 @@ package org.apache.poi; import java.io.IOException; import java.util.LinkedList; import java.util.List; +import java.net.URI; import org.apache.xmlbeans.XmlOptions; import org.apache.poi.util.POILogger; @@ -142,7 +143,7 @@ public class POIXMLDocumentPart { @Override public String toString(){ - return packagePart.toString(); + return packagePart == null ? null : packagePart.toString(); } /** @@ -231,17 +232,28 @@ public class POIXMLDocumentPart { PackageRelationshipCollection rels = packagePart.getRelationships(); for (PackageRelationship rel : rels) { if(rel.getTargetMode() == TargetMode.INTERNAL){ - PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI()); - PackagePart p = packagePart.getPackage().getPart(relName); - if(p == null) { - logger.log(POILogger.ERROR, "Skipped invalid entry " + rel.getTargetURI()); - continue; + URI uri = rel.getTargetURI(); + + PackagePart p; + if(uri.getRawFragment() != null) { + /* + * For internal references (e.g. '#Sheet1!A1') the package part is null + */ + p = null; + } else { + PackagePartName relName = PackagingURIHelper.createPartName(uri); + p = packagePart.getPackage().getPart(relName); + if(p == null) { + logger.log(POILogger.ERROR, "Skipped invalid entry " + rel.getTargetURI()); + continue; + } } + POIXMLDocumentPart childPart = factory.createDocumentPart(rel, p); childPart.parent = this; addRelation(childPart); - if(p.hasRelationships()) childPart.read(factory); + if(p != null && p.hasRelationships()) childPart.read(factory); } } } diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java index b59a78b74..cfe0fb0a5 100755 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java @@ -161,8 +161,12 @@ public final class ZipPartMarshaller implements PartMarshaller { PackageRelationship.TARGET_MODE_ATTRIBUTE_NAME, "External"); } else { - targetValue = PackagingURIHelper.relativizeURI( - sourcePartURI, rel.getTargetURI()).getPath(); + URI targetURI = rel.getTargetURI(); + targetValue = PackagingURIHelper.relativizeURI( + sourcePartURI, targetURI).getPath(); + if (targetURI.getRawFragment() != null) { + targetValue += "#" + targetURI.getRawFragment(); + } } relElem.addAttribute(PackageRelationship.TARGET_ATTRIBUTE_NAME, targetValue); diff --git a/src/ooxml/java/org/apache/poi/util/PackageHelper.java b/src/ooxml/java/org/apache/poi/util/PackageHelper.java index 78468d5b9..186d85acc 100755 --- a/src/ooxml/java/org/apache/poi/util/PackageHelper.java +++ b/src/ooxml/java/org/apache/poi/util/PackageHelper.java @@ -22,6 +22,7 @@ import org.apache.poi.openxml4j.exceptions.OpenXML4JException; import org.apache.poi.util.IOUtils; import java.io.*; +import java.net.URI; /** * Provides handy methods to work with OOXML packages @@ -83,11 +84,10 @@ public class PackageHelper { * Creates an empty file in the default temporary-file directory, */ public static File createTempFile() throws IOException { - File file = File.createTempFile("poi-ooxml-", ".tmp"); + File file = TempFile.createTempFile("poi-ooxml-", ".tmp"); //there is no way to pass an existing file to Package.create(file), //delete first, the file will be re-created in Packe.create(file) file.delete(); - file.deleteOnExit(); return file; } @@ -104,11 +104,18 @@ public class PackageHelper { //external relations don't have associated package parts continue; } else { - PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI()); - p = pkg.getPart(relName); + URI uri = rel.getTargetURI(); + + if(uri.getRawFragment() != null) { + part_tgt.addRelationship(uri, rel.getTargetMode(), rel.getRelationshipType(), rel.getId()); + continue; + } else { + PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI()); + p = pkg.getPart(relName); + part_tgt.addRelationship(p.getPartName(), rel.getTargetMode(), rel.getRelationshipType(), rel.getId()); + } } - part_tgt.addRelationship(p.getPartName(), rel.getTargetMode(), rel.getRelationshipType(), rel.getId()); PackagePart dest; if(!tgt.containPart(p.getPartName())){ diff --git a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java index 5f667deba..46597b782 100755 --- a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java +++ b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java @@ -35,6 +35,7 @@ import org.apache.poi.openxml4j.OpenXML4JTestDataSamples; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.opc.internal.ContentTypeManager; import org.apache.poi.openxml4j.opc.internal.FileHelper; +import org.apache.poi.util.TempFile; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; @@ -167,8 +168,10 @@ public final class TestPackage extends TestCase { coreOut = corePart.getOutputStream(); coreOut.write("".getBytes()); coreOut.close(); - - + + //add a relationship with internal target: "#Sheet1!A1" + corePart.addRelationship(new URI("#Sheet1!A1"), TargetMode.INTERNAL, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", "rId2"); + // Check things are as expected PackageRelationshipCollection coreRels = pkg.getRelationshipsByType(PackageRelationshipTypes.CORE_DOCUMENT); @@ -181,11 +184,12 @@ public final class TestPackage extends TestCase { // Save and re-load pkg.close(); - FileOutputStream fout = new FileOutputStream(File.createTempFile("testCreatePackageWithCoreDocument", ".zip")); + File tmp = TempFile.createTempFile("testCreatePackageWithCoreDocument", ".zip"); + FileOutputStream fout = new FileOutputStream(tmp); fout.write(baos.toByteArray()); fout.close(); - pkg = OPCPackage.open(new ByteArrayInputStream(baos.toByteArray())); - + pkg = OPCPackage.open(tmp.getPath()); + //tmp.delete(); // Check still right coreRels = pkg.getRelationshipsByType(PackageRelationshipTypes.CORE_DOCUMENT); @@ -193,8 +197,16 @@ public final class TestPackage extends TestCase { coreRel = coreRels.getRelationship(0); assertEquals("/", coreRel.getSourceURI().toString()); assertEquals("/xl/workbook.xml", coreRel.getTargetURI().toString()); - assertNotNull(pkg.getPart(coreRel)); - } + corePart = pkg.getPart(coreRel); + assertNotNull(corePart); + + PackageRelationshipCollection rels = corePart.getRelationshipsByType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"); + assertEquals(1, rels.size()); + rel = rels.getRelationship(0); + assertEquals("Sheet1!A1", rel.getTargetURI().getRawFragment()); + + + } /** * Test package opening. diff --git a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java index a4ef876b4..6161f4264 100755 --- a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java +++ b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java @@ -17,9 +17,7 @@ package org.apache.poi.openxml4j.opc; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; +import java.io.*; import junit.framework.TestCase; @@ -254,4 +252,5 @@ public class TestRelationships extends TestCase { assertEquals("/docProps/core.xml", pkg.getRelationshipsByType("http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties").getRelationship(0).getTargetURI().toString()); } + } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java b/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java index 6c37c7086..e7d254119 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java @@ -30,6 +30,7 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.poi.util.TempFile; /** * Centralises logic for finding/opening sample files in the src/testcases/org/apache/poi/hssf/hssf/data folder. @@ -57,8 +58,7 @@ public class XSSFTestDataSamples { InputStream is = new ByteArrayInputStream(baos.toByteArray()); result = new HSSFWorkbook(is); } else if (wb instanceof XSSFWorkbook) { - File tmp = File.createTempFile("poi-ooxml-", ".xlsx"); - tmp.deleteOnExit(); + File tmp = TempFile.createTempFile("poi-ooxml-", ".xlsx"); FileOutputStream out = new FileOutputStream(tmp); wb.write(out); out.close(); diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java index 9cb9b7f73..bda438994 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java @@ -18,6 +18,7 @@ package org.apache.poi.xssf.usermodel; import java.io.File; +import java.util.List; import junit.framework.TestCase; @@ -28,6 +29,7 @@ import org.apache.poi.openxml4j.opc.PackagingURIHelper; import org.apache.poi.xssf.XSSFTestDataSamples; import org.apache.poi.xssf.XSSFITestDataProvider; import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues; +import org.apache.poi.POIXMLDocumentPart; public class TestXSSFBugs extends BaseTestBugzillaIssues { @Override @@ -121,4 +123,24 @@ public class TestXSSFBugs extends BaseTestBugzillaIssues { ); assertNotNull(drw); } + public void test47504() { + XSSFWorkbook wb = getTestDataProvider().openSampleWorkbook("47504.xlsx"); + assertEquals(1, wb.getNumberOfSheets()); + XSSFSheet sh = wb.getSheetAt(0); + XSSFDrawing drawing = sh.createDrawingPatriarch(); + List rels = drawing.getRelations(); + assertEquals(1, rels.size()); + assertEquals("Sheet1!A1", rels.get(0).getPackageRelationship().getTargetURI().getFragment()); + + // And again, just to be sure + wb = XSSFTestDataSamples.writeOutAndReadBack(wb); + assertEquals(1, wb.getNumberOfSheets()); + sh = wb.getSheetAt(0); + drawing = sh.createDrawingPatriarch(); + rels = drawing.getRelations(); + assertEquals(1, rels.size()); + assertEquals("Sheet1!A1", rels.get(0).getPackageRelationship().getTargetURI().getFragment()); + + } + } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java index 749b92114..6ab1edbf7 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java @@ -33,6 +33,7 @@ import org.apache.poi.openxml4j.opc.ContentTypes; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackagingURIHelper; +import org.apache.poi.util.TempFile; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbookPr; @@ -74,7 +75,7 @@ public final class TestXSSFWorkbook extends BaseTestWorkbook { assertEquals(0, workbook.getSheetAt(2).getFirstRowNum()); assertEquals(0, workbook.getSheetAt(2).getLastRowNum()); - File file = File.createTempFile("poi-", ".xlsx"); + File file = TempFile.createTempFile("poi-", ".xlsx"); OutputStream out = new FileOutputStream(file); workbook.write(out); out.close(); diff --git a/src/testcases/org/apache/poi/hssf/data/47504.xlsx b/src/testcases/org/apache/poi/hssf/data/47504.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..8805a78ac520cdaa60d487dfeb408b62c646b215 GIT binary patch literal 30048 zcmeFZcU)6j+9i$tIma{i&dmGX_mBJg?$*8YWUaN=dfIy0ifX735nlvO0jB`~xC}@< zEE{ts0DuZ&0Js2j5E#kAoZPLP+|6_zJ6pM#@OwiY*_tS#PqoAkPkE`XUAoeynP?hKJ(@a^`lQ`a zf7OzRB}rJE$%Z{Skh@qX@7u`!EW5w;nN#LDJwvy<_5vM68j$JN_b6^;*$0ak-E|gt zX`y+C??ySrxs2;2WpbG%0yP&tD<^(rRmkQteQ@F9Qz0RGM~Q>ir|RRMe+!{Ryyj$S z?DumxCgTkZl;WR@zHPAOQ{cq-CDmE2=q|B60v0WmrMB++hU|IOgW-EGvbNbQiHkfu zTi~|N2M<{xL#4P>nX0(KyQycfeNlV|PwJ0rOu}ew!&8LPeOI4<+j2hsQ8HzqogqO; z$a?W%8|IYCyP?aEr!=W3Mws@hJPPtRhVMK+Po^uX8AZBiLY}BQjrOg}q|Rg7xc^dc zO?Y}&i^3WMj0*05nY%L=Aw{=w--cPY)i)%`RblSXT2ekF5XM58c2DuSbk+>IGZhE! zC_J7B(D>6{^S{vZ;2hX90dA$UKsAAxtCgdh0RPF8?REM8+hhOt?XBW?Rkh|DR3ZC{ zYGgQ3X?dLvA-cb=G|P#LTfgh$`zd)x|Zd^|UAFGO^dNmW@M z)EyOn>wOo@KF$<@@ydIx8D?Z+fsLp(JVAyktYXXkW$)H#R05lf1L`qwBdU zmmv@nQG7*s`*L|m&bCl-Yme4>WATHuGWN`Uxz+{eG}{2x*WBCG)|aOHLjvZE;SpA7 zc=C38aMn|@3wKvMtt~Vu6`srTkd}P+vF{FX^D<#uCNwb}^7^cP_r^iuARQ>Szv{X- zf2!>i*uw|vIwNqJz}r#ar@DK=Tpb?4U=AmqTYi4$8yt`r#!!CUJWUnvHhOQxQ)D<3Bmkg36) z`e*9VyMQgL1Vw(12mmNSxr6HQN5y!l)$TNQgQ|gU2|`sroH)!Gn#%@d9Jp;nY!ZJ< z_8DIjhXUIh<%1)N<$|+5+&*bBez!I|*GlDWM!ZhA9RT%@V;q*oK+G%uJkV z6Lt&@cQm%S!m)*q4<3m=6qCO4ik<-TU|S^DiT9okpBRJ9_b2&Z34#+Mnw&4bJIm(b zNDyECNK=<-CI^j;eoKxIdJ-0_=^R|>HQmp^5ttOw8e6h_1?EX=F@yUS-d=jd!Q3fr z*i{_8oFQ_?y;J|dr-x$ycxX^Z~`--T}iMKlrjA}hq!j+aM$@8^1T zDv6D7`9(dmZS}U%S!r)4A^fU5!9+hR@a@uj^e68aq9^>rGK?@W!1QZzFL-b<8mF>*B@aem$}w< z>)Gy4C00Zdf60?F)+@4aR>4vW+pXqo=61p#-e-Npv-h~j3F}bORS-x`X_wa%u`R!R zJ~2@9j(Bv`V)Ih)0e-5pD`sppbM%;uMOG5xbu}|Bn<|U74ugb$4S1{ z8q-}AP2`$YIZVmL8eoxKYrh;~TiOn;qP+z%K{Z?N~md`zutG=E0JE=U~(t>A05Y_jbP#iUhpHZ?G z&Bu!&!>Tv|E*|=>`?abi*|B?1w5llW@iUE8#sQ5Yp4j6=$Gamm@&elS~%WF@tVwOWbu} z9J%0sBboT30mV6`ks%F%=>SRC-p9L%17Ca3lf4kUZNf)4Polt}&22kJs6s|UAR+HH zEp;s>;asYRBKLAJ!t#FpW=(?qbLlPUtIZF1q0GaZ2K{6xRU@FTlb;V?4IO3(;VNRe zpoJCu0#PD;)Dm>;uebZ{O`{_GzZ_+<9dyD0i#S8I2%|hrV87 zIhXH9ci#N|Ew!3Kic@(d{F zqL1dMlMPM2N;zcg+TU6lg@J>mEH9(C}Vw z%+M2c$`W043uEY3G-&8{^2Om6rmOPMu=6vMMvJZMjo=}Ib@!VaB$i)Bp3yZ@pmvo{ zAzrgFMXvQ-36;{^cI9iOtXTqX6EWxs-La34zf5sC%1CVEY-A-+f5&+_#)NGCTYPee z0krH_ZaV z1AO-ei?|R6==ah1gSyy&L$o%8ipRFFx1$?@+rln)2*}`e)45nM$sdnz)+<1B3( zy7%~86+_#Hw1h@6Ryl#Dfvk_zsJ*vNMPCReQy(rg3rDQh9}%X7QF^;!dwMIGBHq1b zX|I0$onXVYE6v!O*;%E7=kW(oHTi&jOV=Z^I5T@v1> zSG&j(_w-uM6q@L+)R1)M0D6_5oFv7spob_j?S+p?U$#G2T;4rNq0kTa{X}F7n5Whz z6;!+Y^k50HbZ1DOq$(V+m_K8J&Aw}T7i&e?R=kE9dmtxsweA9SvJ3PLTOWIqm_229 zqD)#H;Tj*wF>PqTJoyoSdJDhSHJ|CZ$4qXf@=n{qdQayD!q)pZcr2z8NT0u^Uw4@g z-gK?L3%VErF1KcX#Cfi98_^(N_a6m9s#M3;*WIsYX-Xc8=C!A%31;`iKq=~>tuYVJ z$|sa@c&b%SKmGtWpPOi%vy8o6+D-AQ+J7H9MULC{_cG-Z7=`AO)B2Q6N`3c#H*&Sj zO|)J1>jQmN`Wn7Y8H1*`^zIKe`%{Uoa8sz-5ktxsHm2nXnHV`f90nE^FwI=t`#yO4 z7DIdVuHx%N6|u2YD*;$cn1Ahiu4Y|->$k_ZA60gcdOnsDSX2lOieV6Ecf)-nDX~2j zMP^i!EJ#u=aHY5~$?$>UV1cz^27Ad3hDTx!jMr%=pPHNwYB=ltnEct2q0md!8|*~u zUXp>^Z(m%)3Sa(OToroH`?h2F%lUZGB2Lf8WT}#birnf;U5lMf4$~FoNjK~SA#hrE z*RF>vmL{J0g%MZhM<1P$uqWOfoF4>2#Gu5oVo6QiVj-DI4X|cMVtvW1^CAx2#d6v? z+EJ^x;=(4m=9fV(U&Uy&pcV`x^lADA1rJ_dH8@VucaRw2Zv)Z`=z1PmF>C!`?I*mu z9-4eEj6-MsVTxYG=9hb*E zP;r0aCgNOIsYSB9*lO}2=hZT?v!c6tOAlWuuRMX8PQMzz-wm)$kwdXK@5Lw+}kY_h|uO1ps@oalrVdjj{-8~2SMmZ5%)w~NO zY{qD2M&qV)WlHN6*TYk~Ir*i&=Nf{wL2=$I$9fgJ~lRq-KN7PlsH))rX*sk5Y> z554aXh6%!8E=B&+S-QDDcC>Ok39oasRMo+(vH^6Hug5QsaZqJe)v3+`Dda7}M&tZi zvpNxyP^`~OPqT)PPgEQv1G)pMq7Eh{-vz&L{HUe2$)yE21-<*8xMflK!8iU&oP4&) z?Q8P{@h|nOMde-x2hY<65^F!?nNKe8*W`g#O?%W*^06TYF8ipiwaVv;1c`75*K3!z z|ImC4)zp(?ejfk*DaD(_a*Ir!zUuFGZT_k`g=7OPr|=hE_ZGNmSS{UlZigT8HYi*T zHCSx*5Z9n7;S35t>)Fz4%50b%EA=$X9+5JGv=r53%_|S%4O}^^_gUgzvn+)B)%)4Y zIy4mak4$<+#<2N4TVBlJK{m|~CWr@~se0VKM4ntuu$cT<&}=u{*X-;XwyD2}8{9bE zYnJbyW{ac9)fSM}Ods&7ynDMZ5DaCbEW-Z$0$Z~x2d@O$+i!(D@EVHyENCu(5bwm@ z48r*+mK{9YcJ9*kK7Y!7LfkNeRps%!sgK{gAp1vko!Iu!o_xjlhgZ@Ar)8 z4c)ir7Tmwzf8Nblg+^4e>6U)F zEhihH&F#~up;#vJR>yZuF>>azO3U!&-OK2QZ`X)MzeIAU@HFwI(V1v>JilKTD(?{* zFtf+Cq^eSXbo^yWEzZYA^qTq8yj#`}WNNM!-is2zBp*e&ODHH1UC2}M?GBKz6s1s= z04R4@b-&xvg**v8tHwnK$vJJYE6BEU=JmZR6?P-8M+DU)?oBC7_k1WRUN~fSoh_4k zS{X3cbe$r2L0;wfbEA1?rcm9`7LI9KXQ6BL?yJtyuF@_6YyDeQ^n|Mz?~igTnN?B- zSAL}JhJ;BpTw1ebuoGOwH(&cc5w;*LGWnEAfT=C8E&uC7{X1!S9nC@>PtF{R#vr;( zzpe9|@gY954>+9QpK}`S!lSzoZY}E+XMQ@$=uG7-`?5E2LByD4Nxh|E6D={1O$L0_y@qx zl6+K>l{M4QQkPe{F9&u20Lfc(XJD6waM8=% z*&Q5Xd;(k8np=XfGYDUI)zOj#;g=vxVe<$0(H~$-D>n;}&fDM^n1!<|I1k}P5Ek>a zusNBt7=&*)S=u>)@c2o)rJDs590SrzxOKt{unoN2RRBN+Ol*ices42$1AyW@Pz;>E zw_O9vCN%m0@Zr|)ZQEME@rQu6+s*pc&EKXYICmGsX%dg$<^%xJcmOz#!{d)$?Iw{rNUHKPZ0i0wwsrf`8I<(hrCMKo-bHeNc;3LI5Cb z1^~E9!6dB;05m}7qazLw27=`Nyxpz5LB0ThEX?__tDTLlJKN10H$>U)fTFcxQ*yH4 zzs_dv=*ae4mm8a_m7A5Tr^S5?;b7c(>W(3={9AGLZV`#y5Z~NHlfHFFP2^@WF zW!3%$54d`0oveEW9Fybh_?ymyxDmDj27n`A1=s;j;L{0U1GE4I;4Z)iI0LQ#46p`! z?7$IrVCzZ071(MAxB(9TbfhDo@sGD0!4V3;GWgE&Z|}GO9^l(2^Xmb3)qtSu|CoX8 z#_)~x8-q8pZsgopea`4{?f0G_S2H_{?pPE!@5#z1*qqG!6UUSJPjLD-~MT{}uPZv2A|!^uMn)Nc_RL|6H5jAF%;(|COqroIauIkDRyo!?-{4+KQNkSddtW zSd3U4U?YYQ-zJtJz6XAjB)*#TZ4-mW0_<{%ADz+pGd_zcs6#F5Y|+mvx%` z?z>MkTD>TaTaR3W&XCd4(K9e!<>b1?%_Af%A}S^>A$w0wUO`bwSzAX}Paib#7M51l zHnw*5ZtfnQUfz#=f}e(jhJ{B&#wR2uC8xYdO?#c4lbe@c@TTy6c|~Pa^@p0;rskH< zt!-c0zxMSH3=R!{9~qsQo%=Dru(-6mg5KKR+1=a692}m|bwcOguYXDx$OHmHVqzj< z(i6G}2)#}SrzR%3EO_et9ZgbmmkU>JJ~@5yZd}&8PiNR~X`yHyx%QILatO^_MW2xN z8)g3gWC@q>t0Xxt=@DY(f{pv~WC5026?D_4jV#z=8x+NVLH zvE;Lqqvss7P5EAW`J{YY7gFVDvddM>M^T2=E0tjNduh3yc44PE7t1SlAmy9l8oFjf z4`1fwD!XJ^maZG%XfClU>-YJaQ4T|C3_kguk7^o@CJH)R(ux$Uk{~kJDA-Y2Lq|- zol|eZ0~eQ5QfBeMOlN)|lRgHHW>r+b=*_EDi8{Ldh0k4DPRax|b#zzMYj7S#islvGdU`;FwhJTBe5nG(Zqqsyi^ zGAgJRVj#T9Q*qv3%caB}VPoYn^rcnx_)&aadA>=dKa*Cr^{`&)+M&t5wEC}@JaS}3 z706tI_vF9E1Jku_cp$ETXg+q#LA5`C9M{3hAj9b=*((Lf@$PO4V0qWrQ>nBgKw&0l zF5MPh0hL);Uf-RN*p|D(%hZv#U1?+#bygdfB1}csK)GH(Y>oe!J_q;Pxapqf?x9H>1t~V;H`T$r`KETIQ?Qw z9_>D-TprEdK}Y7MS)cK8xmByr>!ts~=+m)8-GoQYI!VgL{eIoAUNI(g%U%p$uc);a);w_}}4yANDQdkQog>F+7l^E{6v`dBoxYb`4Sxk4iUN zGs?!R0bMerjEiB7r~G&^h&Nc3uvymDH-4hiQK=PBi>3gEeh)JO%&Bf8^g>7}hP^4p zRJyiq7Xj# zlWGn!2Goq@lA7dWTUJD5qt7EKmXjrj$W0U*Cti;j+Szn<##D&3iVdgPy=fQQ z66SmhDcKM^ zx@VwXJZA!Kja5L0rd#%XH&pC-FuLL@3$>3%2|nPPyZyYSPD}WUE-+LXua>67+mka< zTixk-R6V%6Vj)+(?le|uA7L`tE`5GW;mu#HSaHl>*ABRk8^J;9F-mCP*|IRd%X7#x zSef)stnc9=jeLIW7!QBc_6#0~G@7$%^;ZFR+(n^lI2I;8{W~AfRrOLTl%Z1GGfVCW z0{cVxcX_JC%m$p3s|b~|VflI);>rmK8BU$TfrWyGq^o3Fi}hw#<`-V3r`e5un{F9; zqn0bjSa|7!_dq@=efwbHqNb}sKDSviPmf)x1L6&i6=N`6qHw2InB3;0A%9%alpP~< zp(y7#wAE~_L3yQ%VY6aWXe?lVO<$d_Iu#qBx3Rk@lwc>BGpb(O7`s?Ao^B^nJgQpS zU3k<9|Ha4;gzD8}6i_RYDsL_{rCoEc${4@{HU^eATfR}!9!y6c_Bpj9IX`Ys1tTe> zE|mG*K#7zTdAljq55W9{v(>%4ghO%?#=AKYFpl!>>(8a)J9*2c;w5Q4ITF&Qs1hB9 zqP3KC(v)oDwLF#RXU3Aq_^QV8PmOs&E7GA2Mlij}#auk_tCuNOjip1WH?yAi4sHry z94wK!vf|@@%eK}g=~1mn#1(_5FQKYGcZbT* zW6Vlb&_M#H{bXvlyN04)mp^uZHL! zs(np@hGe_XE9VqmRT?bmAXSg6wBggAH%Tpt#QnHQGeZTL-n9tTt(WF(pGK{!*?qKNn9n~&A&8PzTp-XoFX+g4;3ll9IBe~==XF#;;xY!C|tt93gK)Dx^r?Iw<~G109lgzyBTonXX%23(+<-rOD}0 zNy8=&E0@bWJ*H4m-ch))V_!S~2npcybrM;BY0)6!KqWWu2)SZ54U>~t38vWvShHJ>EwKL=b>YS>>J2M9>I zgLZwtb5u5JUjsVyqq5%bWy6li-;xsZXFWQs3) zy1S!$554grJd%c5=$J&4MxI7jUzMyd69E4Lz@tEBJaD=?9JvG^Mxu!B;(>V&;4e%j zWu3+YME102XYb@=I*iJX^rI?QJDQTy?u9PwE&Nb-b6s%Y7D=^=OSkl8zwKNI6ehkL zH#)izO_u|6I9M&>6x3X(9(|d2Y=!K=b~WRuVbt&*JWvLoJ_Tyt*A>ut{MrPBV3~^B zg}lytkLme_KcQAT)DJWDe$sW%O(fYenz{3NH0d{gRXSf|sl$CvJn+=0#cT(%I)x#~ zf^XFZQex!lK_@MXYrq46jC6Q_w}7B*Mmpf0_f%W$Hb>-_6-Rfen{RnO&Z&_;SDX&s zl%IBeMTC;i&G)|5OlxQsy<2zotUu-b$kARtp~rgk+2x@^>NkBEuDa65n~W!mbCu{U z@+2hAqt(>ZzJ6Vw81YFs&Ep)+9`Ha;&SYYQm$$Jo-{>!lRZ@uclT4W-^cH9izFmpp zNK@ZaeNqm+yKQ7N#k=-={Ybevze0t7obJIykKkpK6ymkUGOKT^+eW4j`sa~Grmvx9 zwesf=+iuP4)WCA*h1M4uURLhdbO(^s4HQG{HzTTQZ9+@jAT5XwEG!M6;KaVImf4WhUVC=R>dpuRO zfCus;&pcjbXveYMDrK2U-;YG_A)2|x&GJx@)&A-xQ*)FD`=~`6sl6Gtq&P+v9t~NX zYDQp~-@v!30?BbV@Bji%0iX5+{m$1>KorxA^T&$gfhVIWpwMlBKfRwx^yk;bkE+mS z*sF{zOHvRJ6ASOy4#Is+!Neo8Q0&By<(Xij`89$E)JPY424LwwoBBV+jKZ_MULOyf zkwI3G6LsM_P@8Ft+ZxnQw>_qKEy$(bJ@V_mS;zo0?X6u^wBo~1xcBPk5+;N-J|YghUlNg6@F zc}7PsZvpcDF0Eb_uJywWIt`|;wKqmnx&igEFabzubPZT z+HZ7^UWH2vXKj;yGEvY$<*&1&Yl_Q+@c;u>5&e8nO25pT_4DDA{!MonrEJ;AvL}0! z&n_MacAOvbqnc*Xd(y4PvbJ)Jk>&SI@+W5WfN5d-ZcGVV@!stTRCGcwlw0XsSq z`NEr`9O){mLgIGHISx7%m-2brTeX#PeSP0M>qk~rKuxB+%7z(ZBc&d{aWFj>tB>)e zjXGz_sg(87`xS4qi?fiw$@%Z{?orV6q)AzBPqHiQ7PQ1JYC?VWJln{5_j#s$zs`m_ zBh#hT=#?5n_Zq$0?KcifDGS|3xIr}Q@!2yV&IOQz^Y4Wz*UhN$K+jtQMj{wYM6UsV z9uWAS_7fp$2kLM8slOIP%|_74q3IRDjA=%4uuMvHK^*?x-0yvX$a9s0RAQ(&umq{} zQveGTP4MXzO5D9nq9gql_|A1M97QIWfhhyObW;XH9H(O7G*Uz*Sl(VK-h%FFTR&OK z7y%EJ4)Jwi?#-@Pil8dJ78MwMkXRaSR_~$G^Q24A#l6^5AJjQ!>z&{V5>53wHy%jQ z7)$9Y^*d+S?`COE3K+FgPtCtMC<`Ciu!-yWYLz@|%JLu$^I^zdFd@-SEBBg!uj-p>?fnpI0@l@xMnX~`Zn~`O%GLyI&Q;K(}yoe)B%-mk&U;vl5C!b_XBVjGZpERUidWMqqYFCM4 zl9=S` zmY~Gk_X8ctod@vE!EQW2pGkzf zz)BA9(PKT@b;AR#*8niAZEH5$p$Wqs8-uDC31ADr!tFCm?EQMQ`p2PuSp3ZEa!lma z)A4U~z3cg^WgKlO7EA*Z+Qdi^%dFYakIU7#^^jODE97BP_)&v;tDm{w2gi`fsr3iz z@D1_{+dU5FJyUiL!Q^iTdmIDTcU5?QbSwqNWJqlk(*AJj$L7=_)?fd~{OGItH03t- z+7FYIsiitRV0aJ<#&aOT8U`u6Odv6xlS(%ypGzDHQE*yOZkRoDY>muxaCRCacRKk**XO~>;kQewi0$4HD!ygaxV)Gs> zv+%H7@IBW5Tw8y^Udw(ocXy}R04nXCaY1?Q4G-nn)7q-KF>>78ceuaqjDo4fn9IWZ zNMHGO-feMLZQW!}w}QE~`BO=Gn)-vJf{7$7seJpq=Vda$am6tFmN3xe6Ey!sN`PqEknfBPhQf$HEC#wLQ{CgQ;cWHHBdhoFBW zb`Ti<%lTlFzf^zwm@%Y!h=XISfLdj5$e#LKwN|x4Mj|^Ubbx6}%CHYF7 z?d$Ks^d4$rP)@z-i)pgLKs-yBBX2GwRQ0v|6Pte&jHj&ePGHiC# zwy)UGh!AK!Up`iN0LO^E)l-61pIN79{um(AU)*@n8{Qgl9#cRv*tr*Xst8TmT5A(2 zbP>&xP1Bgdp8`7%{#agrWuQ<#_km=AN?NX!R!)r-msqu)W|GXap5W*jZCKjovkV@H z!J9K$xk3XuHFkZ@K?_Rq4kO&HdDZ$a2a-lBV=F3SL#8OOkYaD1MR}BZNX7DopGLCR z`Ozf_otr99&e)=_D9JY4VvEO@V=_dcuEEY?r3`u{!W|NoT(tcziSrzzgOVbH{omJP z7&ZKQa@B4Qy2(>Vl~0)Pt`6*~WA6F!f??y(6VNgFLqGwp-ntFi9)%|44xcS6hN~YB z9I$|<^w(iaC(iA^G)jCGNrtiX&Xx`L_L8NRiJ2AkZcTVZJt>JK51&Z+GWspZ;I1HX zL0nT@&3l3#(C4$ym>tqqP+~7E;{j|e=;N=*(13B11BmA*83cGTx&u1(Uk0&8v!e7m z__&();RN}8I};Gq#|!8k*M^vk%B;k*>XbK&V~AZ+$Xs1aUphwg1)~9@ZXa1e{~Q+7e=9Jk|Dhb$9hs!bM4@ad$^^q$8z!YRlOYF*bqqN?2-@| z9Y{1$?j0%&Sy5isN_#pbymq`$#sdB>LDbG@y;ET(xAaMg_stnUgSiH!QosAjuT0;} zcA6eulU+Kj54C+%QenCy6eHl=wuS$%}Igwwq`^e|^(@M?2S! z^ikd9L$&Ngk1c<{Zm_2M)R6U%+#8G}Nvq*=28>{(9NgqR4lPp{X)rKl1RyiCVYpyZ zuqOOzeG1b9M)0RAAUlj`Q5>Zc7*(H?hQa74b2tKt^7R7!3s~rWC1R!ccBaO&J1T|;DHBF z@2mD9B8hy&fgHU1kd;{G*pBi!3&dCebk0jCPL_PttWCRw&xHVMD!tFDe5 zK0JUVAi=#k%7FFvui5D?m9}#QjrAvx(!h?az7?jxZi0R&deS6!eD2f(4z9;|_LD{f%MaJaOm)X;ZOhPfWlUwiDk zkE=zLAW;fS38t8Sw7KEFW(Ad>NT1re$et0`BOFHp?=87+k%G^2rbRo4%eKn;o?WVe zoj#b`mMOsl--Ic*r>fr^?FYVJXhU-)QxXm1Uh_ItL9*2UBrIX9J6!o+37k}NW{OCyv-f{|^)FHVbaa7VVsY5(0mk`7dffgrl~FFA2}Wuq>c$ zj5#?Hkp&Z+vJ3F(y-lp`iTC=W9-erWKdT`arq2}Qp<17C4@t>~s$Th2rBGtR;gIg# zHE`RxK!WEP@G+Aj?3Y!%^_#oTVU_ApW?}s9u<+zV>kR&cheLbhGY%>V_Mv^3?m2M` z^e$ejyOR`m_GQ)QuHN?Lfg%4b5406W;cq!Ts=? zn9dMrJ%q0t&B00SWQb9Vp?;eFGco#~S-3F$Ss0s{`H9ZG1dl>HXS=hr;X(*%m04yA zJTObXTiLlAlbjEQdX<8Xl*_l!tj$^IgVTjl*Bn$&!d`r2TC|-+pPnalt6I75hgxT@ z)wiVM)l0oGFxa*H(;Z3eLptC;Q_`!|<$sA#us(nl$`lPqNutTx3{jS8i?PsMZ`PJ} znhK(3k)hX2d40mxMxox7A~rfPR_eTf;B)3?n3P)*X9=0s)6#}TeZ-*ANL#?Z#0+Dh zeukB>&Fh@3GT-fvjd!b4Ba>G_mmUvB8^oZPl0D)I;5ObVxKI^!EHx$0poic%W7h1D zfe(VZ2RX30O}gh50bjDL05<~_7?NiItiMd)4*dCjQixYRCJJ{xhFm?I?|zs(nnCGQ zI3Q<)B#*e5zZWsJKzon!!Hp)goMb$7F5U{@1bfgH4Nr?PcQi1k`E+ zaz=##%*{6jrc59uo)E<5`qZI41US30qlQXT?&>LuGX^?dXIfh}N^uGZ?R|gV?JnWA`E_FC)%Y zj2m5Ki{2PNXeXxNJ>Xr|WihS`-kD-f-Nge1KFoZ`ak$(u%Y0|dtO?AKg@7Lqw3UpE ztb?2=+X?%V^vzlob})Yy?=R|cX)#O)4^X`wmO@e)aY`u^oe{Ntvj2r6)-4v3N?tf_ zF5U(a>;&B5|3Yhinf5X1@&WPNYGB?EUbW%dUi%(E%i_{ z2EX$%0$5{Ibu%KYw;OHonQ-2Lel&bPVxP8RY->ju%;)5H z_4SG=Gpcg1F*R#yCCY_Al_I}rMPJ{9<{HvU&4U-WBB+^noZhSY)qa^D_IO*E+y1B` z?kNv$FUMSEKi*0Ecz$Cxo6h=p%0n!lzK(OR&Zc(7lnXtSUE<9zZ839Xi;|mlPh$Y% z<;(pW(fdRSgT2ro`OGYLuY_-~qLmGf9={@_ zlof_g-5578j9fB+W0^+aXyLd_xV^*F&UGY?d<}_71CJYoHxFse@W81(Gps7WI-0hB zd{zK-pS}V(PVgW^)fX3%0@{!U@Noe&DtTajf42jy226sFh)fEfO|4d41#&c76;%=z<#!b-h{~N`pM1IRlLP(HfYp?BwKx*$VV%qoEP_q!6VNX-28Usa z!o3ZvIFXdrA6^z#@xQz_Yj56w5Vm*!v3Oc#^saqxVtU^&%;=SjOY?y!m3Eebc*oMh zMbzL`y{Ej}qZvw{<+Y3xLdGIhjMnq=Tfl&1Ss*Ms|7k@TmL4p;wGZyHqUo^8c;Gcs z=m<51?eYUtEm>0%u)zTgz>>fu&>7yGgJT7M;+PAc{tCybW#g{wN0{yCFCY$}U<5D+ z9(}+*PVJ~pL$;83fM0MOIh}x@{4uoaD?1az*EiWFpZZXA`w?f2zozAL(XmFDcHURL_EC36wQl^#DdnJ4|(v?3{C!l$qdtqV%#jfJO#!z@Mb2~6NHgF+{qrO=tXOXFuNuvIJ5cLm`nLaa0_>y)X5@jKZ2e>rx05!a& z?2va`9Z3$N3sy|Rp&vWccVT}c&t*4dE&qtw*6jUI-7FN|)Ofz)*-=X^v?}GXaA{uQ zrh|j?u;9Igg;|$MD{GfZogZ6@%iH63TKzOX>!1ccgo%G%s6e^B(LQ@g{e30FU}TJv z>_~rb{oKWjF+(ru;`ER$3YH9?RDOf7j>X96%ceTaDudBXi5F{DR1Nu6i;Ubheo;rW z8@`|Zw`xVuH#@{;JbNN7|;K zr?moA00ur$(_)ECss1u8)*ulM^zxi>pnjn{>VIVl9# z621P@W+0fJqQG$*E}4>{7E%R*1K7-js}dd}9Qx}enLj6DDnk4^>?U!X$(%gOO7jIC z%>=JGT}~MCHLv@Ah#8shkChYoA z?Gf>Z*1lnOcNCi*7S_=cJf6wmBJq-N-HPr{nHX^z86zun`btChGW%=e-fzj$Ysev? zcPyB9fKI%Pmt6ylTmRJbTaEhvL<@M#i{^mN`kyyjgHuro$e|h6B#aKCE$dMu<3$Uu zQS;B&vDeYDbJIkb|6@3uMCE^`g(%}a`jW$}f4~V=thZE9TWgF)sTVrZP3DKc&6vTz zz{891fagg%pv(?tgS!nVZ5b++@9a_{P*+6cV7ND=W{;$Iq!2m=j7~t-)1`8W@y?rceG=^|AGi7eGd&qBrr2NlL)Uyt0a6;YBY-stH5_YJeH1_LBmbsWg`)E{UtS| z2H7b}et$4pgWMdSr%n{%?4#MAs%kxe^c>jYZ`R^2U#<_;yxnu6b-1izDu?70Wcpz9 zv#j0?B<&{=_S#%GT2EU~j_FiO9ei8j9VO+Nws{&|lJT&zI4W1by@;qVTWD;J&6E&N ze)jCd(%>0dCV8Y*iEzWM$c~@pdFpuyMc0O~qd5E0)Q%_4-L)RdLvF;5w)OqZ7!ztHs=Pfnm&F@jaOfQI3X zqF*hP=cMT&r9s@9a2U`sl;I3jU|5P(@qiOI`WR3&9)Qso27bcr{cNaruOFd4HiJ_; zdd*Ae5riMLZ-JAYoWMrUTHOgH)%~-FM$t6cLa=<=nFuyCOwI9E{DSGV{EA_6z%lto ze!s@;X&c(5y4*f*<|9!W*HWGy7gg2=uH|)tfz9w=ldIXn7gJ;ZN_ba1Zdp)EJdxNQ zrJ2>e!8^*v_f1xv^&!JUY}a&b#?cjr*EWR}(PMGvtRbDR3wT671GGn)T(Zo5Rf54j z0raOiV5omTrvIksP#6);ez=a}6 z|IqA!&Hb-B1};mAVQ?C_Ee8_qTGA6#_q^O2Ik#WS3sIuh(BQaXtM9HEH6h-A7Kn3` zo~qI~^$OnVUWKN7Et(_md>E2XCRCIXd$M~cPXP@<7d;Rt8Exv)eaN|c@7>RvM}9q= zl2nGO4XL5XL?RuaG@4IAv!WwH)2B>{NrsB@~cHs22iY zCuk(jC@*}M{l~-*`mfD>hg$k;`f*V~6wMdF`N}(&AJw9da1rW@_9rhkuRxUMYfalL z#PVt0oI+aZ*0!#Tb2nU5GaQ0UYHeDEe3M$^OYIc+O^3&{6R1d%?XN{`zg4F5dMMfU z89nU84O6+>kBYfcQWSg5GTTBdY~-6`uejj5Ww>6Rl@5u5STwnr(OT`+p@+}*q`|5nzVysU#0GTs+X|O_H$uDmW?KLk6v}DXC#oK0b}}Xf_uS-atMA8N*<`Pl1}!Ldb!2 zQ`E4|irqwf#Nwq^+F>@-c3T_z9*WR>WJbaBL?a!ftS3<>oGL6x4$iU9Ja+RW1sZmM zE|ZmPqx-qK*`1oRbh4VQ2dA!U`e4YnJJ-~_6WN|Jocum(#?7CSZ$Cl4;+{B_Vy1Et#yI+N?+CJy7OX@$}uPJArzjTCzL`2M-NE zASz=kfgSZuxQDU0dLypE%ud1ZQBGjY1gz>>YY?GqjmRt%Ah1=dH+T`)?Jy20VaPJX@2M8Z!2R}PH?@thCbM((DiAG_tE&}R*>=TC^H-z!cB3T!Jz{(j?; z1r)kLvDx&k*PgLhG_JJL>sw(~Uxc+pD%*hAwcMY# zC^&b{xDHd5$&;}lbVTlb70)NqJnnZ|^E8~jp6pLmpoQ6!?TJwZ9}UBz$vI{;AEIO+ zFH!=voqo83q3Bx0*CC$xLYSLT=R92cPQW<2t_s#(B++)u()+qUmhYfbp|y{M>+|QH z?Pj}4rbDF9&)ZE+V?2{}y6xCai{oNukO|0pepxT;kWt&H+@)z!SUBPmmZFn`gq1su z@nDE}p)vT=Af8gv?l z&CLn#`9-Uhu4HRC5q@6C(#`*T(2_QLpg<_MjhsmW<5h&@F8EZ3iv3hX#(Wg8E6=PkUUw=Ne0NLJ0)jMNNS8bwU{XE7z3Sdy*BfZVskanD@)FiEun_MquR44c)JEOzJTRL@2 ze0GFTkp;R47>=EHA}>SnY{W*dR;pn8Towj_mym$v_}k%|s&lX|bira2p}Dg$n}R%y zQ~+L_C2rb?Zi@#A3D2k5zhLZGPM%YhtreEDkTYbbAH$Pzgy0I8PkP?tq@cGMV*$h- zH_N`h21-#r+nEKW-0VjmnvVO_Q7&Ie1`!pZ;gPBi`Z~HgRZm)d+-wc?>Qhd;oXd31 zXt&qNHf=HJh>R^C9ZG*@n0zcS`tx?AxtqsJH2Lo9k3%?NaZR`7RC(k5wkYtZVneX` z*y@MGs8&_yWaaUPTpL zP@myM3w{=))iQw-)qgdbX2gUBHilDO<)eb535`irV)CSrL7)?_H@@oR!>5)B!Lldue_Lt)zUO(jUZ?&p?VXf8Up$d67 z!J`canom=stFUc9%x0Q;*1Z=k8#sA%Sos}P>)+_oUkK!xDtJ_~u5>6b2t4~0#}4~N zq8KGj(SdK%C!HoI7s^0@m-!W2qfgeU1G`B+L)UVH8999)`&DY4z#V2N3u}I8Irot~U4Ohj|kLBn;n} znh?)7QwVK{^?hBNWcMOcqkFujq#GKXPCn4m@4MJ<*RrE1^05AH`?3zv!ge|Asg1tU zT|+0_u?H!on(CtG47DUpJTXh7r6mF;zh(8rQ_C*qo6;xCJl{V!_P8?Hs0i;z+LfET zJg&^xw}2M4_0@Z+L*}KblcNd;-a0TiXsA;((MNQy4jC0=GL>LXdywUl^g4JBn6Q@K zK?6rBgggcWtVot^YAr=wV&ondm{Q-3gDj={#a{hR>dsu6FwGZneeY!9uhj84DbBS- z*s-YGb-vJ+L{)?jbqML`yj0SSMYse~9zT%hv$_v+z?CM%z%_7iZW`fKM+Kj7HhFsF zSg;6J2E|Y&^uWQYmLsk5URD<(r3bp3@}~Lts88y&SGjY@~nmvV1XOByL)Px z4LE^2Kp+9h&4&>L!U!(fgG09%1RrRCAO!gWaLriRfFt+32c7@JJK#CY9tUQ(D0)ki zkeA)Ipy(xo#)J7j#Aj3G4?mb`_v!iF7u;_IRbR#eAM3jU7-P#NaB+2XqDIdEq?)A| zoY>#U1AG#HLmWX;0tU;;H9o1Lc*q-ECc;sBhiD3@GuJVzE)+g$Ih7^B*fGAD%!{p~7vs{{0-rMJeJ?J4x;2i zCnZ3Xd~}VcZa9dNk6k)d>vvmvu!f|PH(72ddPL=>nh@u=GsAf=_o%4lak9H1t4oM(fNgNiGIsRc~z&$5nM(iUu3a8M7V}`*mUOJ$A}J`Wq`3$nmZ8`WYVK~|Fb{;NZe@&HS3nJ1)pMs9?BCt49 zdHIXuu>q+9pw&!Gji+26i|amM)vn0VJzZ-|y&HeVfK^fZk@Ztg_qTRF zfo=xk4~goEoe|kmI#-CFr|V5pE_9#5h-V(OX=~}S$;=-!&!lLoQ-pCJ8!t*r)D=%% z9Pp}$pOe|(n^euU-G#qGOEe)s?m%o|Q}QnBH-ny%yZI~XTjO|T<0Y__4Mii;sB%7- z`(!slb(2{{Z=5Tpazr~jG;kMC-R*1PbnGgo^#IO5(t&An>vbq1|^bG+{xuVrA zTU)#>(i4$a=0l4%zjKK^Tq(ZeQ#2FR>vjkf^(BB4d`068Ln zBaqd#o43wTfI&#*rkIu_*zS2ZH5VXKo3J$?*@R38R}sU~e5_mL_ZtuY-ham0=1k+* z3@oCKIA@e&!X-YqPg~bC&GvF(xX!Ec>^fatomuaTgv)wcZei2oj}Qmq()nIJiI;p? z(v%Vx({VWBQQKs)A(idbXn3~o)+bW2gFCNiTr;HW$QRZ#ccQU=5*a>T5F;kFjSy~# z5ftVJloiM8E0D8rt`*3bQ_v`L#=~E(Z3db1z>i|G$b!JCgW)WC3u<&~s}WTH3*9QY zr|{0DvK7d3#Num4#O-TJSHI8zQsyMG2mN-SAPD+Y0J}J&}vipczLf=YXjD-K^ull_0~nAL1v5ivG;HNWl*n%cOcSs#$>y%CW{Qgb++ zyvcxjN@LocO+jRDi~CC7tUb=&*7yE=ii+Zh*sFnEBr)zG2e!4%=3+Pj(Z<5)pv!;*%ePhQqE#E zY)9k5Og5wB(%QEAGz{nR9-n_1*78A4zx9(%#2t9e)cAY7)ABq|dUr6J?nv3@c>Std z&W=#G*$ue1Cof|C%4?F8@EqfPn?KIK_8iX?%(4j+-lDR(;Dp^kM#T_kbh6kJjc0x- zeRX3<*+!kDyGTY$RiHOMvWxT69pXwYkJ9c`h}m_SD(yc{)Z0YD5I|x$hzLk}xAog) z2Xd1B|EgPEZ(sgWV%8EB2Tw6mMc8`<6kqJ-9v7O_7bNypTb>c6lIaI^ME;8Ssy%{!bp&*qM(A*iGa@AfGs zX4jS;pW&BABl13}nE5kvz+7(Sz1Sw@w=c{8R$zeg)4N5VeS6c0TVi6yp*F4hMY`>%<16ALg7gYIjQw)D+D72Ad z%n5h%&B|`u<}hgRU7y;ndE{V|V*hVLa$_=6`p%YQr^;T&2Ps7d*Ne++s>LC{K_l99 z^TS>3G;0r6R=4B1+XK2Cy(;S;v!H6Pw9fA?d4b12rtXj5KPmTUr1w38@2l4RLAd&R3G9z=YS^tO{JsR(w}fX{)+#>z zpdi?KKI>~medXk{>7Ob`ttVbzhUhD?1xR5F%1-@hQKI!+)|aCB$|afodoDjHOtYTh z`tmMc8Qud~bpKHeYb_=C4~o64XSlv%%2$R79BT~M*H2l`V0{+(uMBE-tTFhSQ+_?^ z`o!j6NiTx5(%*OHYnt;fTz;I5`YRVY-w$(BuNUQejo~W`2;{+~Z