From e705f869fdab123719c9adeb691c6f4cb7849a17 Mon Sep 17 00:00:00 2001 From: Kilian Schuettler Date: Wed, 8 Feb 2023 17:05:00 +0100 Subject: [PATCH 1/6] RED-6126: Performance Tests *moved to streams for pdf file transfer *disabled overlap detection --- .../InvisibleElementRemovalService.java | 30 +++++++------ .../ocr/v1/server/service/OCRService.java | 29 +++++++------ .../v1/server/service/OcrMessageReceiver.java | 15 +++++-- .../v1/server/OcrServiceIntegrationTest.java | 42 ++++++++++--------- .../InvisibleElementRemovalServiceTest.java | 42 +++++++------------ 5 files changed, 84 insertions(+), 74 deletions(-) diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java index 0ca60ee..2e7bda6 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java @@ -5,6 +5,7 @@ import java.awt.geom.AffineTransform; import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; import java.io.InputStream; +import java.io.OutputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -59,10 +60,10 @@ public class InvisibleElementRemovalService { * @param pdfFile The PDF file to process * @param delta If this flag is set only the removed Elements will be written to the output file. * The Elements are red if they are removed by clipping path, blue for transparency, and a green bounding box for overlap. - * @return The resulting PDF File as bytes. + * @param out OutputStream to write the resulting file to **/ @SneakyThrows - public byte[] removeInvisibleElements(InputStream pdfFile, boolean delta) { + public void removeInvisibleElements(InputStream pdfFile, OutputStream out, boolean delta) { PDFDoc pdfDoc = new PDFDoc(pdfFile); @@ -88,9 +89,9 @@ public class InvisibleElementRemovalService { context.visitedXObjIds().clear(); - removeOverlappedElements(page, writer, context); + // removeOverlappedElements(page, writer, context); } - return pdfDoc.save(SDFDoc.SaveMode.REMOVE_UNUSED, null); + pdfDoc.save(out, SDFDoc.SaveMode.REMOVE_UNUSED, null); } @@ -225,7 +226,7 @@ public class InvisibleElementRemovalService { //transform path to initial user space var ctm = pathElement.getCTM(); - var affineTransform = getAffineTransform(ctm); + var affineTransform = toAffineTransform(ctm); linePath.transform(affineTransform); var rect = linePath.getBounds2D(); @@ -244,8 +245,13 @@ public class InvisibleElementRemovalService { writer.writeElement(pathElement); } else { + if (pathElement.isWindingFill()) { + linePath.setWindingRule(GeneralPath.WIND_NON_ZERO); + } else { + linePath.setWindingRule(GeneralPath.WIND_EVEN_ODD); + } + if (inClippingPath) { - // TODO: WINDING RULE if (isFilledAndNonTransparent(pathElement)) { List currentOverlappedElements = context.visibleElements() .stream() @@ -270,12 +276,6 @@ public class InvisibleElementRemovalService { } - private static AffineTransform getAffineTransform(Matrix2D ctm) throws PDFNetException { - - return new AffineTransform(ctm.getA(), ctm.getB(), ctm.getC(), ctm.getD(), ctm.getH(), ctm.getV()); - } - - private void removeOverlappedElements(Page page, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException { context.reader().begin(page); @@ -422,6 +422,12 @@ public class InvisibleElementRemovalService { } + private static AffineTransform toAffineTransform(Matrix2D ctm) throws PDFNetException { + + return new AffineTransform(ctm.getA(), ctm.getB(), ctm.getC(), ctm.getD(), ctm.getH(), ctm.getV()); + } + + @Builder private record InvisibleElementRemovalContext( boolean delta, diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java index 63b1925..8f8626e 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java @@ -1,7 +1,9 @@ package com.iqser.red.service.ocr.v1.server.service; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.InputStream; +import java.io.OutputStream; import java.util.Map; import io.micrometer.core.annotation.Timed; @@ -55,32 +57,33 @@ public class OCRService { * * @param dossierId The dossier id * @param fileId The file id - * @return the resulting PDF file as an InputStream + * @param out OutputStream to write the file to */ @SneakyThrows @Timed("redactmanager_runOcrOnDocument") - public InputStream runOcrOnDocument(String dossierId, String fileId) { - - InputStream fileStream = fileStorageService.getOriginalFileAsStream(dossierId, fileId); - - byte[] fileWithoutInvisibleTextBytes = invisibleElementRemovalService.removeInvisibleElements(fileStream, false); - - byte[] ocrBytes = runOcr(fileWithoutInvisibleTextBytes, fileId); - - return new ByteArrayInputStream(ocrBytes); + public void runOcrOnDocument(String dossierId, String fileId, OutputStream out) { + try (ByteArrayOutputStream transferOutputStream = new ByteArrayOutputStream()) { + try (InputStream fileStream = fileStorageService.getOriginalFileAsStream(dossierId, fileId)) { + invisibleElementRemovalService.removeInvisibleElements(fileStream, transferOutputStream, false); + } + try (InputStream transferInputStream = new ByteArrayInputStream(transferOutputStream.toByteArray())) { + runOcr(transferInputStream, out, fileId); + } + } } @SneakyThrows - private byte[] runOcr(byte[] file, String fileId) { + private void runOcr(InputStream fileStream, OutputStream out, String fileId) { - PDFDoc pdfDoc = new PDFDoc(file); + PDFDoc pdfDoc = new PDFDoc(fileStream); Map pageIdToRectCollection = imagePositionRetrievalService.getImagePositionPerPage(pdfDoc, true); OCROptions options = new OCROptions(); PDFDoc ocrPageDoc = new PDFDoc(); + int numProcessedPages = 0; for (Integer pageId : pageIdToRectCollection.keySet()) { try { @@ -132,6 +135,6 @@ public class OCRService { .build())); Optimizer.optimize(pdfDoc); - return pdfDoc.save(SDFDoc.SaveMode.LINEARIZED, null); + pdfDoc.save(out, SDFDoc.SaveMode.LINEARIZED, null); } } diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java index 8c28d3a..72af005 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java @@ -1,5 +1,9 @@ package com.iqser.red.service.ocr.v1.server.service; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + import org.springframework.amqp.AmqpRejectAndDontRequeueException; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; @@ -8,9 +12,9 @@ import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.iqser.red.service.ocr.v1.api.model.DocumentRequest; import com.iqser.red.service.ocr.v1.server.client.FileStatusProcessingUpdateClient; import com.iqser.red.service.ocr.v1.server.configuration.MessagingConfiguration; -import com.iqser.red.service.ocr.v1.api.model.DocumentRequest; import feign.FeignException; import lombok.RequiredArgsConstructor; @@ -44,9 +48,14 @@ public class OcrMessageReceiver { fileStorageService.storeUntouchedFile(ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId(), originalFile); } - var ocrResult = ocrService.runOcrOnDocument(ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId()); + try (var out = new ByteArrayOutputStream()) { + ocrService.runOcrOnDocument(ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId(), out); + + fileStorageService.storeOriginalFile(ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId(), new ByteArrayInputStream(out.toByteArray())); + } catch (IOException e) { + throw new RuntimeException(e); + } - fileStorageService.storeOriginalFile(ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId(), ocrResult); long end = System.currentTimeMillis(); log.info("Successfully processed ocr for file with dossierId {} and fileId {}, took {}", ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId(), end - start); diff --git a/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/OcrServiceIntegrationTest.java b/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/OcrServiceIntegrationTest.java index 0007973..b21a331 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/OcrServiceIntegrationTest.java +++ b/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/OcrServiceIntegrationTest.java @@ -3,8 +3,8 @@ package com.iqser.red.service.ocr.v1.server; import static com.iqser.red.service.ocr.v1.server.utils.OsUtils.getTemporaryDirectory; import static org.assertj.core.api.Assertions.assertThat; +import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -155,25 +155,29 @@ public class OcrServiceIntegrationTest { ClassPathResource pdfFileResource = new ClassPathResource("files/" + fileName + ".pdf"); var originId = FileStorageService.getStorageId("dossier", "file", FileType.ORIGIN); - storageService.storeObject(originId, pdfFileResource.getInputStream()); - - try (InputStream ocrDocument = ocrService.runOcrOnDocument("dossier", "file")) { - byte[] ocrDocumentBytes = ocrDocument.readAllBytes(); - try (var out = new FileOutputStream(getTemporaryDirectory() + "/" + fileName + ".pdf")) { - out.write(ocrDocumentBytes); - } - TextExtractor extractor = new TextExtractor(); - List texts = new ArrayList<>(); - PDFDoc pdfDoc = new PDFDoc(ocrDocumentBytes); - PageIterator iterator = pdfDoc.getPageIterator(); - while (iterator.hasNext()) { - Page page = iterator.next(); - extractor.begin(page); - texts.add(extractor.getAsText()); - } - System.out.println("File:" + getTemporaryDirectory() + "/" + fileName + ".pdf"); - return String.join("\n", texts); + try (var fileStream = pdfFileResource.getInputStream()) { + storageService.storeObject(originId, fileStream); } + + try (var out = new FileOutputStream(getTemporaryDirectory() + "/" + fileName + ".pdf")) { + ocrService.runOcrOnDocument("dossier", "file", out); + } + + TextExtractor extractor = new TextExtractor(); + List texts = new ArrayList<>(); + PDFDoc pdfDoc; + + try (var fileStream = new FileInputStream(getTemporaryDirectory() + "/" + fileName + ".pdf")) { + pdfDoc = new PDFDoc(fileStream); + } + PageIterator iterator = pdfDoc.getPageIterator(); + while (iterator.hasNext()) { + Page page = iterator.next(); + extractor.begin(page); + texts.add(extractor.getAsText()); + } + System.out.println("File:" + getTemporaryDirectory() + "/" + fileName + ".pdf"); + return String.join("\n", texts); } diff --git a/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalServiceTest.java b/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalServiceTest.java index fbe81a3..9aa1f26 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalServiceTest.java +++ b/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalServiceTest.java @@ -3,9 +3,8 @@ package com.iqser.red.service.ocr.v1.server.service; import static com.iqser.red.service.ocr.v1.server.utils.OsUtils.getTemporaryDirectory; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.file.Files; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -46,22 +45,23 @@ public class InvisibleElementRemovalServiceTest { ClassPathResource pdfFileResource = new ClassPathResource("files/" + fileName + ".pdf"); - var initialFileStream = Files.newInputStream(pdfFileResource.getFile().toPath()); - var fileWithoutInvisibleElements = invisibleElementRemovalService.removeInvisibleElements(initialFileStream, false); + try (var initialFileStream = pdfFileResource.getInputStream(); var out = new FileOutputStream(getTemporaryDirectory() + "/" + fileName + ".pdf")) { + invisibleElementRemovalService.removeInvisibleElements(initialFileStream, out,false); + } - initialFileStream = Files.newInputStream(pdfFileResource.getFile().toPath()); - var deltaFile = invisibleElementRemovalService.removeInvisibleElements(initialFileStream, true); + try (var initialFileStream = pdfFileResource.getInputStream(); var out = new FileOutputStream(getTemporaryDirectory() + "/" + fileName + "_delta.pdf")) { + invisibleElementRemovalService.removeInvisibleElements(initialFileStream, out,true); + } - String fileWithoutInvisibleTextLocation = getTemporaryDirectory() + "/" + fileName + ".pdf"; - String deltaFileLocation = getTemporaryDirectory() + "/" + fileName + "_delta.pdf"; - - saveToFile(fileWithoutInvisibleTextLocation, fileWithoutInvisibleElements); - saveToFile(deltaFileLocation, deltaFile); - - System.out.println("Output File without invisible elements: " + fileWithoutInvisibleTextLocation); - System.out.println("Output Delta File: " + deltaFileLocation); + System.out.println("Output File without invisible elements: files/" + fileName + ".pdf"); + System.out.println("Output Delta File without invisible elements: files/" + fileName + "_delta.pdf"); TextExtractor extractor = new TextExtractor(); - PDFDoc pdfDoc = new PDFDoc(fileWithoutInvisibleElements); + + PDFDoc pdfDoc; + try(var fileStream = new FileInputStream(getTemporaryDirectory() + "/" + fileName + ".pdf")) { + pdfDoc = new PDFDoc(fileStream); + } + PageIterator iterator = pdfDoc.getPageIterator(); while (iterator.hasNext()) { Page page = iterator.next(); @@ -70,16 +70,4 @@ public class InvisibleElementRemovalServiceTest { assertThat(text).contains("APPENDIX 16 Pathology Report", "Amendment 1", "Page 255 of 260"); } } - - - private void saveToFile(String location, byte[] fileBytes) { - - try (var f_out = new FileOutputStream(location)) { - f_out.write(fileBytes); - } catch (IOException e) { - throw new RuntimeException("File location: " + location + "could not be openend, no file will be saved"); - } - - } - } \ No newline at end of file From 6ccf3f80fc9c394adda5733a99ea6481d3b768a7 Mon Sep 17 00:00:00 2001 From: Kilian Schuettler Date: Thu, 9 Feb 2023 11:22:39 +0100 Subject: [PATCH 2/6] RED-6126: performance-test *re-enabled overlap detection *re-creating helper document for every page instead of reusing and adding/removing pages --- .../InvisibleElementRemovalService.java | 2 +- .../ocr/v1/server/service/OCRService.java | 18 +++++++++--------- .../src/test/resources/log4j2-test.xml | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 ocr-service-v1/ocr-service-server-v1/src/test/resources/log4j2-test.xml diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java index 2e7bda6..a0005ae 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java @@ -89,7 +89,7 @@ public class InvisibleElementRemovalService { context.visitedXObjIds().clear(); - // removeOverlappedElements(page, writer, context); + removeOverlappedElements(page, writer, context); } pdfDoc.save(out, SDFDoc.SaveMode.REMOVE_UNUSED, null); } diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java index 8f8626e..afa3b93 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java @@ -6,7 +6,6 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.Map; -import io.micrometer.core.annotation.Timed; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service; @@ -23,6 +22,7 @@ import com.pdftron.pdf.Page; import com.pdftron.pdf.RectCollection; import com.pdftron.sdf.SDFDoc; +import io.micrometer.core.annotation.Timed; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -81,15 +81,16 @@ public class OCRService { Map pageIdToRectCollection = imagePositionRetrievalService.getImagePositionPerPage(pdfDoc, true); - OCROptions options = new OCROptions(); - PDFDoc ocrPageDoc = new PDFDoc(); - int numProcessedPages = 0; for (Integer pageId : pageIdToRectCollection.keySet()) { try { - // optimization by only scanning pages that contain images + // optimization: creating a new document is faster than reusing the same and adding/removing pages one by one + OCROptions options = new OCROptions(); + PDFDoc ocrPageDoc = new PDFDoc(); + // optimization: only scanning pages that contain images Page pdfPage = pdfDoc.getPage(pageId); - pdfPage.setMediaBox(pdfPage.getCropBox()); // this line ensures the ocr text is placed correctly by PDFTron + // optimization: this line ensures the ocr text is placed correctly by PDFTron + pdfPage.setMediaBox(pdfPage.getCropBox()); ocrPageDoc.pagePushBack(pdfPage); options.addTextZonesForPage(pageIdToRectCollection.get(pageId), 1); options.addLang(ENGLISH); @@ -109,7 +110,7 @@ public class OCRService { Page ocrPage = ocrPageDoc.getPage(1); pdfDoc.pageInsert(pdfDoc.getPageIterator(pageId), ocrPage); pdfDoc.pageRemove(pdfDoc.getPageIterator(pageId + 1)); - ocrPageDoc.pageRemove(ocrPageDoc.getPageIterator(1)); + ocrPageDoc.close(); rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_STATUS_UPDATE_RESPONSE_QUEUE, objectMapper.writeValueAsString(OCRStatusUpdateResponse.builder() @@ -124,8 +125,6 @@ public class OCRService { } } - ocrPageDoc.close(); - rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_STATUS_UPDATE_RESPONSE_QUEUE, objectMapper.writeValueAsString(OCRStatusUpdateResponse.builder() .fileId(fileId) @@ -137,4 +136,5 @@ public class OCRService { Optimizer.optimize(pdfDoc); pdfDoc.save(out, SDFDoc.SaveMode.LINEARIZED, null); } + } diff --git a/ocr-service-v1/ocr-service-server-v1/src/test/resources/log4j2-test.xml b/ocr-service-v1/ocr-service-server-v1/src/test/resources/log4j2-test.xml new file mode 100644 index 0000000..b4895cf --- /dev/null +++ b/ocr-service-v1/ocr-service-server-v1/src/test/resources/log4j2-test.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + From 8db0b712f7baeae23e9abf8ef798c78d157b703f Mon Sep 17 00:00:00 2001 From: Kilian Schuettler Date: Thu, 9 Feb 2023 13:57:21 +0100 Subject: [PATCH 3/6] RED-6126: performance-test *improved error logging --- .../ocr/v1/server/service/OCRService.java | 54 +++++++++++++------ .../v1/server/service/OcrMessageReceiver.java | 1 + 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java index afa3b93..d3b9324 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java @@ -1,7 +1,10 @@ package com.iqser.red.service.ocr.v1.server.service; +import static java.lang.String.format; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Map; @@ -9,6 +12,7 @@ import java.util.Map; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.ocr.v1.api.model.OCRStatusUpdateResponse; import com.iqser.red.service.ocr.v1.server.configuration.MessagingConfiguration; @@ -24,7 +28,6 @@ import com.pdftron.sdf.SDFDoc; import io.micrometer.core.annotation.Timed; import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -59,14 +62,17 @@ public class OCRService { * @param fileId The file id * @param out OutputStream to write the file to */ - @SneakyThrows @Timed("redactmanager_runOcrOnDocument") - public void runOcrOnDocument(String dossierId, String fileId, OutputStream out) { + public void runOcrOnDocument(String dossierId, String fileId, OutputStream out) throws IOException { try (ByteArrayOutputStream transferOutputStream = new ByteArrayOutputStream()) { + long start = System.currentTimeMillis(); + try (InputStream fileStream = fileStorageService.getOriginalFileAsStream(dossierId, fileId)) { invisibleElementRemovalService.removeInvisibleElements(fileStream, transferOutputStream, false); } + long end = System.currentTimeMillis(); + log.info("Invisible element removal successful for file with dossierId {} and fileId {}, took {}s", dossierId, fileId, format("%.1f", (float) ((end - start) / 1000))); try (InputStream transferInputStream = new ByteArrayInputStream(transferOutputStream.toByteArray())) { runOcr(transferInputStream, out, fileId); } @@ -74,10 +80,15 @@ public class OCRService { } - @SneakyThrows private void runOcr(InputStream fileStream, OutputStream out, String fileId) { - PDFDoc pdfDoc = new PDFDoc(fileStream); + PDFDoc pdfDoc; + try { + pdfDoc = new PDFDoc(fileStream); + } catch (Exception e) { + log.error("Couldn't parse file with fileId {} from InputStream ", fileId); + throw new RuntimeException(e); + } Map pageIdToRectCollection = imagePositionRetrievalService.getImagePositionPerPage(pdfDoc, true); @@ -102,7 +113,7 @@ public class OCRService { StringBuilder zonesString = new StringBuilder(); for (int j = 0; j < pageIdToRectCollection.get(pageId).getNumRects(); ++j) { var r = pageIdToRectCollection.get(pageId).getRectAt(j); - zonesString.append(String.format("[lower left (%.1f|%.1f) upper right (%.1f|%.1f)]", r.getX1(), r.getY1(), r.getX2(), r.getY2())); + zonesString.append(format("[lower left (%.1f|%.1f) upper right (%.1f|%.1f)]", r.getX1(), r.getY1(), r.getX2(), r.getY2())); } log.info("{}/{} Page {} done, OCR regions {}", numProcessedPages, pageIdToRectCollection.size(), pageId, zonesString); @@ -120,21 +131,34 @@ public class OCRService { .build())); } catch (PDFNetException e) { - log.error("failed to process page {}", pageId); + log.error("Failed to process page {}", pageId); + throw new RuntimeException(e); + } catch (JsonProcessingException e) { + log.error("Failed to send \"processed\" message to rabbitMQ for file with fileID {} on OCR page {}/{}", fileId, numProcessedPages, pageIdToRectCollection.size()); throw new RuntimeException(e); } } - rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_STATUS_UPDATE_RESPONSE_QUEUE, - objectMapper.writeValueAsString(OCRStatusUpdateResponse.builder() - .fileId(fileId) - .numberOfPagesToOCR(pageIdToRectCollection.size()) - .numberOfOCRedPages(numProcessedPages) - .ocrFinished(true) - .build())); + try { + rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_STATUS_UPDATE_RESPONSE_QUEUE, + objectMapper.writeValueAsString(OCRStatusUpdateResponse.builder() + .fileId(fileId) + .numberOfPagesToOCR(pageIdToRectCollection.size()) + .numberOfOCRedPages(numProcessedPages) + .ocrFinished(true) + .build())); + } catch (JsonProcessingException e) { + log.error("Failed to send message to rabbitMQ for file with fileID {} on OCR page {}/{}", fileId, numProcessedPages, pageIdToRectCollection.size()); + throw new RuntimeException(e); + } Optimizer.optimize(pdfDoc); - pdfDoc.save(out, SDFDoc.SaveMode.LINEARIZED, null); + try { + pdfDoc.save(out, SDFDoc.SaveMode.LINEARIZED, null); + } catch (Exception e) { + log.error("Processed File with fileId {} could not be saved", fileId); + throw new RuntimeException(e); + } } } diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java index 72af005..7ae1443 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java @@ -53,6 +53,7 @@ public class OcrMessageReceiver { fileStorageService.storeOriginalFile(ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId(), new ByteArrayInputStream(out.toByteArray())); } catch (IOException e) { + log.error("Failed to store file with dossierId {} and fileId {}", ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId()); throw new RuntimeException(e); } From 7065d098f390b6ce7e40aa25c9627ee19127b0e0 Mon Sep 17 00:00:00 2001 From: Kilian Schuettler Date: Thu, 9 Feb 2023 14:37:09 +0100 Subject: [PATCH 4/6] RED-6126: performance-test *fixed time calculation --- .../service/ocr/v1/server/service/OCRService.java | 13 ++++++++----- .../ocr/v1/server/service/OcrMessageReceiver.java | 7 ++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java index d3b9324..d7bc889 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java @@ -66,15 +66,18 @@ public class OCRService { public void runOcrOnDocument(String dossierId, String fileId, OutputStream out) throws IOException { try (ByteArrayOutputStream transferOutputStream = new ByteArrayOutputStream()) { - long start = System.currentTimeMillis(); - try (InputStream fileStream = fileStorageService.getOriginalFileAsStream(dossierId, fileId)) { + long start = System.currentTimeMillis(); + log.info("Start invisible element removal for file with dossierId {} and fileId {}", dossierId, fileId); invisibleElementRemovalService.removeInvisibleElements(fileStream, transferOutputStream, false); + long end = System.currentTimeMillis(); + log.info("Invisible element removal successful for file with dossierId {} and fileId {}, took {}s", dossierId, fileId, format("%.1f", (end - start) / 1000.0)); } - long end = System.currentTimeMillis(); - log.info("Invisible element removal successful for file with dossierId {} and fileId {}, took {}s", dossierId, fileId, format("%.1f", (float) ((end - start) / 1000))); try (InputStream transferInputStream = new ByteArrayInputStream(transferOutputStream.toByteArray())) { + long start = System.currentTimeMillis(); runOcr(transferInputStream, out, fileId); + long end = System.currentTimeMillis(); + log.info("ocr successful for file with dossierId {} and fileId {}, took {}s", dossierId, fileId, format("%.1f", (end - start) / 1000.0)); } } } @@ -93,12 +96,12 @@ public class OCRService { Map pageIdToRectCollection = imagePositionRetrievalService.getImagePositionPerPage(pdfDoc, true); int numProcessedPages = 0; + // optimization: only scanning pages that contain images for (Integer pageId : pageIdToRectCollection.keySet()) { try { // optimization: creating a new document is faster than reusing the same and adding/removing pages one by one OCROptions options = new OCROptions(); PDFDoc ocrPageDoc = new PDFDoc(); - // optimization: only scanning pages that contain images Page pdfPage = pdfDoc.getPage(pageId); // optimization: this line ensures the ocr text is placed correctly by PDFTron pdfPage.setMediaBox(pdfPage.getCropBox()); diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java index 7ae1443..7ddbdf4 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java @@ -31,14 +31,13 @@ public class OcrMessageReceiver { private final OCRService ocrService; - @RabbitHandler @RabbitListener(queues = MessagingConfiguration.OCR_QUEUE, concurrency = "1") public void receiveOcr(String in) throws JsonProcessingException { DocumentRequest ocrRequestMessage = objectMapper.readValue(in, DocumentRequest.class); - long start = System.currentTimeMillis(); + log.info("Start ocr for file with dossierId {} and fileId {}", ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId()); setStatusOcrProcessing(ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId()); @@ -58,10 +57,8 @@ public class OcrMessageReceiver { } - long end = System.currentTimeMillis(); - log.info("Successfully processed ocr for file with dossierId {} and fileId {}, took {}", ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId(), end - start); - fileStatusProcessingUpdateClient.ocrSuccessful(ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId()); + } From b3fa14b3428c3a3654ec50f4d265963e7f1c6425 Mon Sep 17 00:00:00 2001 From: Kilian Schuettler Date: Thu, 9 Feb 2023 17:01:57 +0100 Subject: [PATCH 5/6] RED-6126: performance-test *fixed NullPointerException *fixed StackOverFlowError by ignoring very small images and moving to while loop instead of recursion --- .../ImagePositionRetrievalService.java | 50 +++++++++++------- .../InvisibleElementRemovalService.java | 10 +++- .../ocr/v1/server/service/OCRService.java | 37 +++++-------- .../ImagePositionRetrievalServiceTest.java | 8 +++ .../files/everyPointInDashedLineIsImage.pdf | Bin 0 -> 204008 bytes 5 files changed, 59 insertions(+), 46 deletions(-) create mode 100644 ocr-service-v1/ocr-service-server-v1/src/test/resources/files/everyPointInDashedLineIsImage.pdf diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalService.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalService.java index 9f32d3c..a6c8a0e 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalService.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalService.java @@ -15,6 +15,7 @@ import com.pdftron.common.Matrix2D; import com.pdftron.common.PDFNetException; import com.pdftron.pdf.Element; import com.pdftron.pdf.ElementReader; +import com.pdftron.pdf.Image; import com.pdftron.pdf.PDFDoc; import com.pdftron.pdf.Page; import com.pdftron.pdf.Rect; @@ -27,9 +28,12 @@ public class ImagePositionRetrievalService { private static final double TOLERANCE = 1e-1; + // any image with smaller height and width than this gets thrown out, see everyPointInDashedLineIsImage.pdf + private static final int PIXEL_THRESHOLD = 10; + /** - * Iterates over all elements in a PDF Document and retrieves the bounding box for each image, + * Iterates over all elements in a PDF Document and retrieves the bounding box for each image, that is larger than the pixel threshold of 10 in either dimension. * Then it adjusts the bounding boxes for the page rotation. * If the mirrorY flag is set, the Y Coordinates are mirrored and moved up by the page height. This is required for PDFTrons OCRModule. * @@ -63,7 +67,13 @@ public class ImagePositionRetrievalService { Element element; while ((element = reader.next()) != null) { switch (element.getType()) { - case Element.e_image, Element.e_inline_image -> imagePositions.addRect(toRotationAdjustedRect(element.getBBox(), currentPage, mirrorY)); + case Element.e_image, Element.e_inline_image -> { + Image image = new Image(element.getXObject()); + // see everyPointInDashedLineIsImage.pdf TestFile + if (image.getImageHeight() > PIXEL_THRESHOLD || image.getImageWidth() > PIXEL_THRESHOLD) { + imagePositions.addRect(toRotationAdjustedRect(element.getBBox(), currentPage, mirrorY)); + } + } case Element.e_form -> { reader.formBegin(); findImagePositionsOnPage(reader, imagePositions, currentPage, mirrorY); @@ -77,38 +87,38 @@ public class ImagePositionRetrievalService { @SneakyThrows public RectCollection mergeOverlappingRects(RectCollection imagePositions) { - if (imagePositions.getNumRects() == 1) { + if (imagePositions.getNumRects() < 2) { return imagePositions; } List rectangleList = toSortedRectangleList(imagePositions); - rectangleList = mergeRectangleListRecursive(rectangleList, 0); + mergeRectangleList(rectangleList); + return toRectCollection(rectangleList); } // Sometimes images are split up into stripes, here we merge the positions of aligned and intersecting rectangles into one larger rectangle - private List mergeRectangleListRecursive(List rectangleList, int currentIdx) { + private void mergeRectangleList(List rectangleList) { + int idx = 0; - if (rectangleList.size() < currentIdx + 2) { - return rectangleList; - } + while (rectangleList.size() >= idx + 2) { - var rect1 = rectangleList.get(currentIdx); - var rect2 = rectangleList.get(currentIdx + 1); + var rect1 = rectangleList.get(idx); + var rect2 = rectangleList.get(idx + 1); - boolean isAlignedX = Math.abs(rect1.getMinX() - rect2.getMinX()) < TOLERANCE && Math.abs(rect1.getMaxX() - rect2.getMaxX()) < TOLERANCE; - boolean isAlignedY = Math.abs(rect1.getMinY() - rect2.getMinY()) < TOLERANCE && Math.abs(rect1.getMaxY() - rect2.getMaxY()) < TOLERANCE; - boolean intersects = rect1.intersects(rect2.getMinX() - TOLERANCE, rect2.getMinY() - TOLERANCE, rect2.getWidth() + (2 * TOLERANCE), rect2.getHeight() + (2 * TOLERANCE)); + boolean isAlignedX = Math.abs(rect1.getMinX() - rect2.getMinX()) < TOLERANCE && Math.abs(rect1.getMaxX() - rect2.getMaxX()) < TOLERANCE; + boolean isAlignedY = Math.abs(rect1.getMinY() - rect2.getMinY()) < TOLERANCE && Math.abs(rect1.getMaxY() - rect2.getMaxY()) < TOLERANCE; + boolean intersects = rect1.intersects(rect2.getMinX() - TOLERANCE, rect2.getMinY() - TOLERANCE, rect2.getWidth() + (2 * TOLERANCE), rect2.getHeight() + (2 * TOLERANCE)); - if (intersects && (isAlignedX || isAlignedY)) { - rectangleList.remove(currentIdx + 1); - rectangleList.remove(currentIdx); - rectangleList.add(currentIdx, rect1.createUnion(rect2)); - return mergeRectangleListRecursive(rectangleList, currentIdx); - } else { - return mergeRectangleListRecursive(rectangleList, currentIdx + 1); + if (intersects && (isAlignedX || isAlignedY)) { + rectangleList.remove(idx + 1); + rectangleList.remove(idx); + rectangleList.add(idx, rect1.createUnion(rect2)); + } else { + ++idx; + } } } diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java index a0005ae..c747a9d 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java @@ -76,6 +76,8 @@ public class InvisibleElementRemovalService { Page page = iterator.next(); visitedXObjIds.add(page.getSDFObj().getObjNum()); + + InvisibleElementRemovalContext context = InvisibleElementRemovalContext.builder() .reader(reader) .clippingPathStack(new ClippingPathStack(page.getMediaBox())) @@ -221,8 +223,14 @@ public class InvisibleElementRemovalService { private void processPath(Element pathElement, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException { + PathData pathData = pathElement.getPathData(); - GeneralPath linePath = convertToGeneralPath(pathElement.getPathData()); + if (pathData.getOperators().length == 0 && pathData.getPoints().length == 0) { + writer.writeGStateChanges(pathElement); + return; + } + + GeneralPath linePath = convertToGeneralPath(pathData); //transform path to initial user space var ctm = pathElement.getCTM(); diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java index d7bc889..7901ca3 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java @@ -12,7 +12,6 @@ import java.util.Map; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.ocr.v1.api.model.OCRStatusUpdateResponse; import com.iqser.red.service.ocr.v1.server.configuration.MessagingConfiguration; @@ -28,6 +27,7 @@ import com.pdftron.sdf.SDFDoc; import io.micrometer.core.annotation.Timed; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -68,10 +68,10 @@ public class OCRService { try (ByteArrayOutputStream transferOutputStream = new ByteArrayOutputStream()) { try (InputStream fileStream = fileStorageService.getOriginalFileAsStream(dossierId, fileId)) { long start = System.currentTimeMillis(); - log.info("Start invisible element removal for file with dossierId {} and fileId {}", dossierId, fileId); + log.debug("Start invisible element removal for file with dossierId {} and fileId {}", dossierId, fileId); invisibleElementRemovalService.removeInvisibleElements(fileStream, transferOutputStream, false); long end = System.currentTimeMillis(); - log.info("Invisible element removal successful for file with dossierId {} and fileId {}, took {}s", dossierId, fileId, format("%.1f", (end - start) / 1000.0)); + log.debug("Invisible element removal successful for file with dossierId {} and fileId {}, took {}s", dossierId, fileId, format("%.1f", (end - start) / 1000.0)); } try (InputStream transferInputStream = new ByteArrayInputStream(transferOutputStream.toByteArray())) { long start = System.currentTimeMillis(); @@ -83,15 +83,10 @@ public class OCRService { } + @SneakyThrows private void runOcr(InputStream fileStream, OutputStream out, String fileId) { - PDFDoc pdfDoc; - try { - pdfDoc = new PDFDoc(fileStream); - } catch (Exception e) { - log.error("Couldn't parse file with fileId {} from InputStream ", fileId); - throw new RuntimeException(e); - } + PDFDoc pdfDoc = new PDFDoc(fileStream); Map pageIdToRectCollection = imagePositionRetrievalService.getImagePositionPerPage(pdfDoc, true); @@ -136,24 +131,16 @@ public class OCRService { } catch (PDFNetException e) { log.error("Failed to process page {}", pageId); throw new RuntimeException(e); - } catch (JsonProcessingException e) { - log.error("Failed to send \"processed\" message to rabbitMQ for file with fileID {} on OCR page {}/{}", fileId, numProcessedPages, pageIdToRectCollection.size()); - throw new RuntimeException(e); } } - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_STATUS_UPDATE_RESPONSE_QUEUE, - objectMapper.writeValueAsString(OCRStatusUpdateResponse.builder() - .fileId(fileId) - .numberOfPagesToOCR(pageIdToRectCollection.size()) - .numberOfOCRedPages(numProcessedPages) - .ocrFinished(true) - .build())); - } catch (JsonProcessingException e) { - log.error("Failed to send message to rabbitMQ for file with fileID {} on OCR page {}/{}", fileId, numProcessedPages, pageIdToRectCollection.size()); - throw new RuntimeException(e); - } + rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_STATUS_UPDATE_RESPONSE_QUEUE, + objectMapper.writeValueAsString(OCRStatusUpdateResponse.builder() + .fileId(fileId) + .numberOfPagesToOCR(pageIdToRectCollection.size()) + .numberOfOCRedPages(numProcessedPages) + .ocrFinished(true) + .build())); Optimizer.optimize(pdfDoc); try { diff --git a/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalServiceTest.java b/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalServiceTest.java index 9783979..d4eb08e 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalServiceTest.java +++ b/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalServiceTest.java @@ -122,6 +122,14 @@ class ImagePositionRetrievalServiceTest { assertThat(allRectCoords.size()).isEqualTo(48); } + @Test + @SneakyThrows + public void testEveryPointInDashedLineIsImage() { + String fileName = "everyPointInDashedLineIsImage"; + List allRectCoords = testImagePositionDetection(fileName); + assertThat(allRectCoords.size()).isEqualTo(0); + } + private List testImagePositionDetection(String fileName) throws IOException, PDFNetException { diff --git a/ocr-service-v1/ocr-service-server-v1/src/test/resources/files/everyPointInDashedLineIsImage.pdf b/ocr-service-v1/ocr-service-server-v1/src/test/resources/files/everyPointInDashedLineIsImage.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8ee74c9de1bfb8a64fad0aaa623e1185fc5c2e9c GIT binary patch literal 204008 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

1-P1?C*5XC(41FhtZ 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

|2=^xndc-z$*mv`t+LJTaJfCA(~KBq7zQ+3 zB z)x%YVvzA?V&4WtB1;}i=pt@=alpect(H$4wu<7PCxwt=-pFMZ|zQ@0K-Aj<=<~%=? zdi?I;)kFQMw)riAtQ;-v+q(JfjwS(F33rYFz#QgQ0Ru3DUubE!8Ct{)Fu&x&Cq-lehsT1Mm%X|4)T)7^CHKZ zOzcrO6EIjvT&Wo)$;!Z8%!|ai5C5il@fIN|-$~|+0qY4XW92mg3O>tudEM7`(n;=| zJ4$jhzAw{FSjpF|~=Nm7WwEb~l0{E+pL(393D z?L*c>cB2@AZV%kTY3r2`BcM(-W8W%tTZ9%d#U++p5jM&@BAujL6I5H?lc4&O z#-v;26{!iBT(}W^ToW{S%uSyQ^QXvf=+N_0AeYl#%PPsnBgDyXPv~yMw$?WG$KmjV z_rJ02ms>WBJbcFwHicJKKRH@`@$fxEux?23v(Dv%j-W#s|W#`)G zoClx#=aJJtgbR+&a66O&nfV!b=AXwiUxGc_0s}iOhkPl28p&SSha#<7Yj5jKVxPCq zcT>Yo?@r%d?_Qs=DZjzE&B%CLbN=quzSeu$Z?Y#^Src=Y@mMP}Lkxu#@BhT?VZ{@T zm*}$?q|X8l;$=Tuo80_pBY{iv=|;wqj!7^Z4pDPoh{}T@p3HP8X0vtMciNHFKF^Mb z#JSae#?IPV8sCVC@5x%oBl^2$G<0?+p*0yM`VnR;l))rvYV739@``(E%mqKOu}`!4 zte&KSh#Dt>9($YbJc~cA$(E%EW-FqaPGwRJDTX&C6RI_88wVp{*(PKSO~4$-jU2Iz z15%1_f=1QSRFf5I=E4U3aZ)P>f%mN?4;2&h2vIcb^{Bn%Ioi+j`XeSdjyk<*V?V^) zVZo-Ct7F^NKJ-8Rv+tc4o_G;5`z{DNZ#c2Ny7A3N7Ovd?;16eQTGQ@uC=7nw3kEJ+ z|JFDE`?cz^2a_tidu3NNnJlT-RWF~=ar)bT8+__Nu3qHLxZ*|p=^qa31%|w8LiY?`cdgb>2C%BFO-SW*7(i2=M#q$M{?iK zy%&E^{Z;Odu@6<#OffSI?;T91WiX6R4jwPS!Z1@h$Z)b7VgkSGU{K5EOTl3{c~CZI z(nsMc-~L(J9$ZGe0m3l)J?0!G zI8ZuPLM6PwCLGcnuQ-syS3Ckk@Po63DRef`gLfuwPRgU56o#>`Yov!V3>{#c%ZHK% zE6WpmZX&8iS)NlZ$)q8&9Ol`k}(XQRKRK{4vf4LYLhWvhxbCJ$$_76j=W|#aRsU?w?>`e|NPbAr- zja;@Y18cxmumcPL4*1j~wIUI8O7%(~b4Si)n3w|-@kA_vcmx^DwgfexVD&;_ct_Hz z8k1h1$A|bRYg-P&yni`#TJXqi!lMMl^QwrrvCFRIz-MqRKbLo+fgTMFw>nDpHadAW zC!$EFHd)^qtu{K3G_%R9dv9FY`?XshyZfihU%U0X*QZw2w%!=Z6%v(9$CUDn5_

@#E^ygTH_EZ`BX>J$U)LJ+Sh@V>c9{%w-eQ6)hM3#wA#Orw|g4spV3Wwo+gI>Uq z$sV+tAr^TwA~|VxqaQSA4M=O~Z5U`c(ZDwNbZH2`q{k2!9GYXNW56Lee3^4oe!6Gw z*vZ`sT%ATeKWy z?Wg{WjaR2FApEO{7yC_Et__1%wKY-ddyGrbY{qc&w?T zYWPf53sPs*<&nNa^M!W`ZN z6tGWg{;K^sVYgwo%x;96gl+I{ft@Ux(|~cMdCA*Js>31z10{uSG=^hl1}V;^s~ibx zK@_xgl8Um(DupE^%?#AUAtDXUmDgrJ)onF(+Ry?OLIeCsN77=lHR0v%ZGuh#kK7y{ z$p&*1^da2XMOPE>u&$=hW}dkfEAB8t3^Y;FwzU%5k&O}nyG>3d(Fhdb?bVyBA5}l7 z-u~-X{x)>|_AgyG_{u-FUyoVgn(EK0Kdi38B5fy}{N}!y+n%ewR6Q_wH*A0t;iWI! zP0-M{;5~m2-t#_?1VwnWc4P^JQZZa?NUbT}9P2msn@Enk+tmK#J;mMLr~S{WgQf%i zL&>A5?-;&g{Ds*q00ZRB$S3a6imGBtBq!$o`o7ndCQ9-z*NZ zL*j?VKbk(Ye3<&MB_o)nR0pWQ_7-l62u%JIOB>lk={wIgk{SmGX!H)rj1d(Ax84V=++PVi!uL1k_0`7k4Ajt@sR^2JzE0k!bc~G zi5L$OiQIUU3m6dS%F}8`Z|V8bNuz^pj_El&{wsTo1V?CV`=$>}KR*4$bk;Hb@qpIa zjfV(J;>Kt!Mq+SdrLdBV#-@gq2{ek)K;8CAG_Hn~rf9qzR>nu;cn0E$gfe0Lc%#vP za!pNvfFjx*F{H)ddodV^6=Hp{f!Oibi5MRnMiI>~Pw$<6Y&sK}4yR95W94ovEuzxn z(+Js{D~}Rl*C`WU;%9=fbpR$sQq=dmj@%_hfIde6&r-m1rjh8sT>1Q4;L~UWrH%zO zg~BIvvN`rr0h7(Kd+1BepChP+ELQe@0qnamDEe&rwzQ_39Pp&Y0Eb{Tks# z698cMQeO0Dtz#)%ik1eKhE~JXXmxOPNX$pOqVu8;b6-`SnK&zW&1#cXL ziJ3JzjE-pztQP^zW9hP6@yB(87fDGkl-B&BL@nwPT}TpLUQ*2C4rfCYMN8fRLUL$X zXduLfj-WJfpZQp?>{HABk3W4dvZ61aRBzscUu`r`F zUJhu+GCt}ry-(Q|d2CSrKGAcji^id2UE-fJVbNzH#2xH6tVyFIeAR+il;php*sH{p z_2ja2X_k79={_PL0;hR;uICf2ko^O-X~dlw_Mg zAl#TAW`1{|$swb50=foGA)D@u&F6_H_84t!b-=Z@%|6utcbIorcG$Khx0QZw{JH0s zsb3Z)Yc6R}jS15_!+PWUEkd9pXI`GTkg^roVdGb8lw9w4tob>FH z*0IpHQ0?wmF91D2!oO@aZk4y%wz{`^9u#)TyKK*Tk0wJF&MI4N*2b_LwuKurhKwiQ zVURm6mX@}5cd#|PR07}krgqp)zQ~3=%;%CNuYm3SiY8~VXu^cpE15jS zlwQpaJW0QxC4eI$%y6hL*vI z5BkVrHOXbox7T;V_lb`s7YJg(cNDc^nNEOL?Jwt2!%!T=e7SfOy$ULz1I-9*ANx3Mg;vv~j@%RH`VRjKlAO&n)W=)Z)%V7|okY01(oy(DMCBciERx;`!a1GpN z(pK_mpA1Lem+_ey-s~NvwrdNnfIvF8{4PUd7_Ys>k0aEO@>zz%9 zRVe0)j3>Z`507TA$g;I!!$+g$B8F_@Id$uuotC>JIaxo^9Ii^M=&Ga(&PoO!HqlLN z2Kd9=m5gS?hpW;;4*Zur#am7;m{F;AH~AdeU0<2f)Kq;tp(K|c z`_`-r$1@M80gtyuj;&gCh2IraRmK}z_iS}|Q!|rDI4vGe&+D&WV)Ld@BEdO>8_%4+ zwhix<1=U&T7Vb;H0Xnq!L$+sa=q}TC8!|jB*}%il0Rb>b&sk#KJmmYG3og?OE!NUO zQ5l(9hg_I$qOuIyTs$%Pc|r)?^3^MMehs#Ky7}=7qW)Q1s%z9aE58iy`5A15XRdFU z@^ST{@BIA5d!Bt1-$M@H!$Nuw6)llr8^jqLga5b<--H8TVb*|eKo44F_YK5_ulgixr6JgFTjVv_kah?*HTN+63^>yM)LIfj{6u10)b_%q8$v`HItF;u)4yo zei!2!h7FoAY+YtWR-gB4Pt`=tu^yT<*{*B0dW3~TFa1Xq{j=71EFE5d)mlvDjH=z) z+%da#(p5XEFEqw>bUVzFQ|c%-PrG5+Rr_ky{#X;9pEl-|8u!ThsVL^7tqvHp(H839 zL6eyzjdznaNwPOmLn7ItSv{FhYbqCpwKPIh8;sHj*l3RC3Cg)i1Vyf%PbgRSmF4Os zb8Boz=Vgfhe?@xGu+zBH^qBQg z+hg`e!@DYj21CVH@h_8?*_MT`mDkwTgdaoFN1>50>X&Y{yurL-{SbX<9kKnlUF^aH ztSj6e>8eb#V)khj^Qb|NsF7s8f;pQkxa5oBMe>3O8+`?|N{H37R%bc)jz!l*xqubS(=KEeaOR5#T8~&((8i=IS{#G5c#jFZVvpG>9kk zt)5!`eYz0wlwB-aA+lkiU-pIlAzv;NN~K~3B!vtlqfsi}n#xZshgzqAJTN+BIS~mv zBM?QxR#`4Usby$m@tJhva4GS$m!YPVqcG@|8&tC0;mkXD4NkmU`|Gi|$FQcxyR~ z&vUbHBd@(K2$Tb^TTA?D>j=UR|A0Cxlu6Q4%)-KHys7aK)bPT?>*g7 zPSQKmc?_ezWS0=Fz($J*)Brk^1yBv3UL6$H>pFkF*ucCGXPLxk5`O8T>n48m(ehX! z;hRvMoK(`)KlpNUtGQ`$m(gm8_+1S)D05#rz4m8Q>?V^lh$0b`8~1MY7n`Gbiy@JK zE{CTGuc{tj((Z+cgw5!QUdT+^HC?gAN%e{-rZizJ{Wrmeed+u#3~6oZidKo0414p; z!`UO*H?r?CKh1u~erPzwo-#;%Tpzzx*edpO{rnDLhbRgLsR0R56Bd_}npsqYAn~EZ z_$Wf;N`_N-3(Ywb3MKUVMc9IicUv(QEpx6(8l@&8?=bCB2JlYhH-o>^64 zYU-4~VfC#Mt8YhY>Ki6+%%9D1|I{n5;n3Jev)5G1^Jb~lh39E&HS1XQ=gXF)iCyf% zGbfqnxK)^MrJzYGZce?+{UY{mie1HS;i==$^wBq0uHy7%kJAA&3b!1BtyjihoTrykbBGU-~otj1k?TF{b;yyK07Dc~lR-s-b15 zU8X@vh&EGFRs+d+GHi}62SF<_xr=xdF@}~y#fF=hq@Hj7t$QGQJVXj;t4BKN&J2XP zZw=aVHoW-S+fMvA^YyJe-dwr)jb}IB|C=|y@iHpfCvBR$bdvrsWg^)jNsKCVM4NCDPp(`Qz(i-Hjv#Y)PK zNG_}{5~A}R@^f}iC|aWw2#Ato2n3X1C?os+m*`j znZ7~AXow7-S)(}%q7X3|jWGrPw&D*2LXyEiVNFT^UkK!bq8KBYz6$wf%#z3}fkHDr zZFbmG=`>z<02vJiOx&e$kMmDA<7c*CD>oBP*Fifi*;FVMn){n~HZ${@mo@h`_tBFR z&7U-j%^!$=kS;PR2mQt)D1r&dKQ$u>H9c-(OwV?V8%Ea*MhS|JD8wgy@=32eHcAuM zWyjt>%jIiW-FiKD3d%h<5VxF%+W)^r=UO@mK39-Cb#Psc>Gx191EiU3G-o>PHg|_C}0R_k=AK0(>0lIKI{9I2EZBmFP9I&wwWQl1oYW~+Clt3Ry1m8f3V zWO7a&2S4?e+Z&Z+7^6jtr6$?WHEjLev;^C&zPh)MP1s$El;t6{o+>uKa>0 zsj6xr7XQMSfVQo>q$TMv+eIE<$`rSbh0#a16g+9sq7ohAx#~5jms<@4aI5Ckh*Bdl zESF@EEbvJH?UKjir?t2=T8j%mS%&P*cw3qHQTmvEhV5r|GH8H-%r=hS3t>0vMF{ys zX&5#SMt`zY7uP8GZB&o2trtk1J4S77HQG*ah_uF0}fYz17p=|FgyRp*YJJL zu3n88dY^Y_2~8T1P_G2>o$^8w0-0lzh_QEJ85!R$7DxB;oPM*U(?a-Wxd_+C^>b`L ziHIEFAh)dmUc@vS-{(uP84EZIXtD(oSU-2Po~z~pncQj5dAC|4wLK1en`L~=#`ie` z-{)_*)qk(f<5vK5=8EbxxP#k)seT5&Uen8rX$N)RIl`n;+vowJM@jW8{ZhTeoJ4?k z4!shcUd7HpE}O$xt)g$igOBSKzS`;Sv-{0Gty;D_yEFTo<++f7d!k?gHMTMOoE#vE-=dgm<0Tnt-BnM78dDj&c5cQlLTg^?bbLR%-Od-=DN1GKW-$hsv&8>peW?AclgZaqPDAY`!y)qph| zfFX-QvYo(su1YMVukHDKX}I%3qTR*MRftPxJ3F%tot^#P8@Oa~bJVZcE{}S1?sIkG zcF>m_vYpk)>6IUyoD`3@n1w~^qA#O+znYEKYQ@C>;NHQUb~4(l4R5x*Y(duoxD~8N zn=Km(o60x0zG66H7O%s*lbxEgt!QmU7o#gtKiaPCM2~2L<^z@^#Uqp7HvgizhR~2<@1(cDufcKnGxT%jBk&RY1pd|ViRmw9ue<0jm0Aj=1@IB@fcc@8 z2TOIP7R_5@q0Z3MDK6kDAWH!-DX-h7czLgw!AxmfiZC|J)M!Jv+FD8u@?)KfR>9JO z!V}C@G?u5?DLW^QS2{VCRX8ifV1;Rh%5kL*WgOnVF^k!0v6v?UKzP-HLJ9M#5`gB? zL~d#UOf0b-W{60FCPA?DSzfUqOHyD3!R_|#@pg_Imrkd~cXVVj$vr8r$HVhn3UOlR zS6B;XfS7K;K1?-+QM+c+%-v?xZ-#r#&^(O(p*7~MRLihZg~Cd;3~MYLqFP1``bD*j z(Bo64z63ilwYi)oW~EEHu5OUH6_Qh(vNS9Qcgb~=uYB&`SPeg3>B-}{B0@mT`g>l6 zk2-k#Gw5;sM7QW-4VFNPrF^kzVt!K7WRfe8GB!i27qc@%#HpKJ<%%X-NTRk6_FF1| z*jFv}v~A$Lv~4xUN4=d8*7Q`$(%}E6Bg@v>26W>mxn{wlxPVr`(aqmlG`6{;=qOhk zsV^%x_VRhYtVy|iW7z9l4>J>#hL$k=OXG}HbKD2fCspg_C78{nyxwF9{-`?pGa6FN ztNXLG71hff*FyP{bjTAYWq-P+IS=Dqm%%#jA-wA%V6UdgKqe*)sKpkctI$StPvnuv z?#SVY3C4!um$af~MeD`r(h!ou3KNaF+Z5aQn1Oh_;*oH@3j7}eHW>xth!OF&yA}GLS znq!g1X1B5rMQ=Ryem(UqT6yiFh-_-P{fe)BVHMmcRClWFksF!SBm_i-4ceyDd*+8- z&fI!}q=WrvG4kNA)1^fa*B@Nbx|Jiu1MFoOfMnPWd*Mzv0FOf+tAwS4pr2i^lvrZN zdWao1Pb$Pw=cfbn_W6h#JB2)7#RLw_IP*RJ3e3?NV8axz8BByzwRjd}8MK>!#43#R);2BBdlr8yyR;+udd>;lY$R%M#OKFu%;mkhBC3tFbd z@lf-3OlxRB2m%HgQ|%M}+1lQngK|#Gq1-U~jb@%Cw1@xcYPa|%k^7~})u$s=-T!o? zzWYYTM&wRCBl5X;4Z7L%#K(Qy#FART(w3HNPd2KZs+^1_J#I|l+zfA0gKDw4H3%jq zCIn$6i$~)!c;v9Tf*{6)gV1lpqkx1*<$OyJb|rDs*3=OMpPuT!uE@T5+D+mT-j&v6kitvwQk|bDzI)=Jt8>wofm_n{u&2E>S2%xz+#d;hsG4 zWnF(mhx0JG%7Q)mMLOVYzkMe+*79w$0rC z((EE$OPJ%aS?XPGgf|@qIV_BPrK6nBt@qxj+!(ke-IseXAZ+p;N*qc5O8HgbmkHjN zl5^=~MXjX9r3<;GsjE|cx&EB-4FLUtOkj547rtL9+;eI8gT%X@Unbs7y_5bZ!3VT> z5DUH}#c>RV6(JhOY{V6fgJ7hwA(-xp&x@mYTyQm{@%$iB5beM(`wM=}-{1sbd4UN%9OJ$FZ?cWE_Y_!T?evFUaZ;m35FNg3tb&%*W>vYm-p^dL9lU?7*i2$+;z(PTQ%F zblQI&`pM2;eXn`l#PUVKRbQQP$AV%v+FV`#*+km2_uu@?am#dr;T!#nzdG9i;F&+c z@31yx!BilqV>L`~cw?h;=VxmU#Z#4{ozq8dQ%kEHk&9?>F7qF;SahVqGoI*hRX zbK(i|s89CDdd9%>(l3w%ft|WUT95ma{ffclHwDH)qd_tH#?_0Z(27t!YaO4>ib z=^#+SQFaOY0N^338N9&5qbyTlP)(9E0#+0_O){4_2=e)?ZhqL$G7O=}MxJx>4B|PY zpGzcVI3~sr9APE_o|&|tiLetTI0dst4!sK)d_(|(Q?#rGVHaEjx59p`&~hxY!g&yp z^Br&(WY>^VHFeH_yX9vQ-BPp<`33ESSJ73C8yqGcAdVQEus6W zxrOk4_|PTQ24ZFPp6Oxdu)hF2FhJ(OO>iTs&D9~u8YI?a6!1(OGBBECDKUV|8Hwb< z0-JJx<2jb6^G4Nq@gc=eYI2CEH{QoiSH~ybZ6Wh3PmUe50e_XQM);g_tk?0J{F}c$@(K*RExlw7HI$jw+^#bLB zsmqjQQ#W~U2;4Av(~P^lcLna8ynV*Q-iHDYPJVdC^WJ9yPfvbf<`0rTXp3Apb8>}k znNyn9%KEdZM9?F%VS^c@T3c8{mJN61Zi#gc!$Vr!UYd7{0KmiMw_T<1+o^|J-|p&) z%qh(I(VXLR*g1F3*Ta^HIc{uhbPUT2qoZS;C*ir|owTnHsW%*}lf)Wy4hq=X)>sy`4bWHL(cgmJC2HwT-VLeW{*v(BkgmaF(LwKRQWO1x!W zvMH=~1Z{4`;+~WWH8#v_&Q>OG$fnzZu3TYTu_aZw$SvmrzBaqbY4#~rzbl$oni{r} z=W0LmTkczglOy{9gOv{>-2!sJ4MVbdnEBlyOBlHYEa(G*`lIIInsL}O=n@Q-8>t+QH4KO~prB9w|PZ zc)s|K{~atP8rY6u^oK#~RjmY~G#H4LNU!}Lm#0+JqK&xmg-R`2JdGPASelZUqHg!U z3xA&YW%2i_z$Tz-Zjl)mulSuIcfy@^6>=?86SGQ-;9}p>)I-RIHOr2R;nGBJM_)&O z$3TaO<;#|Cz{r9>5lZ{=ERUFwCp52kcjD2+yG0?=p>=e3T!F4&dbwV{SLiKl;BWBX zp!9`qOx%#VIeiCzmvUEVN3p--2l-#-KT7;F;aei=bv^Vd9>oOa!;PSv4JVjbroFMq zlNsN)yenG!eFMI|KBi5yzk~%29=--lOlm)1T;!C&r&gkQ_e%rPUWtiF z1xb?_>01=yL?nk1!Ul1pdugG^Y_tY}2fBjLCg72S!y}8qgtb|O8(Fkt4VT5uS#9># z&$%!?v9o~qBz*AJ!2|tU4-EGA+;&^frMKV4T|-U}Z0$d=fSlicY0qt#`y6Jjgn#5# z13y@#MX^BS#p=I7gjhP{M5ksR0!+Z;@muAv+)sl3VZ%YL!{bu|FTn=9>V5*p>#J@q zmVoLBbw@|^^#gP?Fs$WMp~~{Pe1$|5hcB&E6_e3wuq(FogmAVp<(kFgxYgMSIr-LNv?j_Fev|< zyBzBoIhXd=UODSWag@?M%H4rCKwh=$}D3h6S@`?lUuHf8NvOnTO}tlrxsGI)Z#|&o^`+?ggW3 z=Z=y9H4^!QIjDS+SY>IYLDJOkv1S(9mdkG2^18Q{EwR>7b1PVv#o9H63|Y<`*QAiW ziz(oS(nvENST%B%a1*T1uZP?fHti(CcZQr5w$Dz6JBKin^}5LLgCQ3lTIujS?pnu{ zE`dz645QQm8E=caV3cNNWG*$Heh2kde|CANLt)ccD;RqeUU2nnk8Fg#>K_tJgD>7P ztE!&DT45< zB8U|mEvIp?i(A8OC4M>%LC6A5 zE06d~1*-Xtp4Izm%FO?r>W3A-9tU(m{6EE(PA_L3KlLVh4gO?N_4?{HOX1IH+*x%E zw+ZiE7f6CJEi)A^79NBQZ-JQ23oGFUco*CW9umK6{XLLas|F@PW}(P@l^sUMwY=y~ z%M1wZ5k;c05@nSI7m1>o$;LXvj=Te%i<;ydGt>1LwX~K-X@4h4)rzdVCzn((($ zOt_OopT*q-<96KC^8eQ(SR1l6+fffk?EOhn%}+=Al4v$3fMmSv-*+1U)WOZ-#(Ejb)pMahJ^GyFH@*E~JS26SPb8v$ua2qBzz`}YxsuE7e zM4K_K#fCgK%{T-+3}Etv@YC$lr07P2W>q={@Ynedt0ipdw=foRO=3Gummh{V z4n`L&tvQ4-J0QT~I#1}Di|4hDO*)sz2XA)Q*@^_k^B9@>?=Qn?i{}_5v$@fp89%FS z^0jxOORm(6Mw7A8of$v3ebO~|ajP@A731P&i*UNFfW;z@%Qnwg zck$KV1ZU3FX8|%`J(hi+1o%4>pasJFtAWXYEbJk36=WRf3T_qV`9AQNraWYO#QQeO z+-2MDMeA*wyh!wVy=c7Xn8pvo*EGpA4KNCxGxtmIF}%-S1y=ajpycx_!|>I?C@~l4 zjPfiCs zd2;{F8=iW4Wog#bR99v8^hR#g?ptm-@Z^?zUdS$8zUzw0lHRXhF@bzr^~_1;S9oP8 zAPg_lE)_Y!?&Umo)^73eHme|8JR!4}x0wXlYYrO}-eweJ#lT5`w}}!EWS`lKTn@(R zvA8`Jn%>7Jk zTG!`2iuB*;zq?AbMM5EU-=g(%KSbQ{IO64^BU+9+iVQi5t~frTOxzJ=98pK~hMpIW zPCWylACQd>Nl5N59iOQz7T-ly$CMqhTpAL$kAQheUUyw zKDY>Tqr0lp*l8qA3jF3U=pazqGF8i*)^cCR-VP*pU_zE)3_b(oWfGC&bIqf98J^K( zpU@bI_>4`~L;|%3B^Svv=)T`183;HbhWDFhB?-A(3CbXBf_YPyX_<+UP4i4Into(r zO~Wv)IU^mqzQ%SGx*HnW5rXZIyx$4{F+BEzoqz*htnAkdXOS=j-A$Vxk$Y-z5;CWl zY}D$#Q-t!^TB@(qfY|G>dhICcPP>*i+u2cTTal;6pj5phd!oKabl`C6^{4FSX_*Zh zo)(3e!*BN+8>DM5yr3Z@E_!HgITeV*n7KWvwgjEX1epiMKKgPw-EtRtactd+uvc-1 zr*B%*kzKNKu}dz5t@8%PXA2WLin)#5-mB(t(}-3*`^;~-Q+Pi$gYjS{T%skx>=Uz* zJR9;BNijy;7A4}F$WL!rqpV4R$s zfBOtR->ljAedn`7i~`O~p_QFMZ29i{zeJ@x0wjTK$3phy$gvu-UU zMiC^qYsqn_L9kwDgVw-lI~Pf;=i4|xh}e-#rs`qDtP4K1X#U>om)tvjYOhmOpStd% z-79YS?%Jnc`_?D<*cX;>+4#_xhqvCdH{{M#Z@Xpll1Yn}#NN7N<@lR6-Lt-HJ#)1x zbX8xwXVv`KGnM=9T5`?x7w^4!)1Pl$b?5jOmQK6xs%r+8{qCio?93$;&N%L&OJ`iR zsiS$*nD4+do2Nc=`RXTHhz#ig_pukS{{gJv`&uFo@-WZlxriZRj94O8F(O37UZGbU z5C%j-^YETJiWN<~qnHc#GopYWttRnC#vn;N&k-tVVp$W@YaB2l<57uRaP;y6Sl&Cz z^;!lj$Z}L9$?NfT1#v9fiv|!vNAV)jI?6z6EtB#_Kg865*{Ayj$eujeL*2Z%IoX5d zsIikhAm4c&`5Ptw^)o%BsjaLdzlu6k&EjAh zNVpLE6?-Xj1KvLZxMd$t`~gGUJa!q2*q50(_!k)bjUfPM`n7TRCNUjB-MAS5$H56q zQ1JKW5RxH04zVbt!T+bbFAa?1xDu}FWA4%1nnTC*+>%CfNHe1wsf7+C#4Q98Afs!L z1VR#$z(5?M#0HE2gR$dauVaWEd>aNZSb$@b_1ZbSiOGJ6<9L(La)Q0duGwW1?6qTS z=6lsM62dt)$bk4Ds;ghUSMSw($6<-bYRq98uak-yvgtp=<(M&RA;_!?^RImi z5n=nd9WDhy!h9!xE~fai?-NIluDG!RZoNNVPj6-KMPJ6Hyq@1Ryo(y&g{!5Fw5YC8 zR7XpzC-FDWNbm4fYXN)D0#^x60j>lv_(E_Ra7J)?q^I6H>!R;ytk%Id2Z%me1a1)A zI&iC?$TD!F;C6u9M!mkYma_g=bl*CZ}JYa^TUUh|E1(+6hDwCO6r z^sl`Se}s)M{2&5^iz!fLo))4c>#BNMoy>zULG6gGS)lr1ENAE*7!tZ#S|<{1YZkTy z0zXXdj}n=eq~$7+NL*A@Ty)cNA=%7NzX_}fEjCy8nqcY*zS$JL?t#i_)UBDGIlKLW z;VUBKbT~zPof$VNPK;05Wi1 zm1kc0+R<&Ri$cz7m{G-rZdZXFa%itUr!6AZW)#jVE4AhvTuw_(wgR`O&}NhYR!ac} zH_et%ZbTSlVzdoC4XJr&C>$WGiB6*twOkJ1aR4jXX4K4jm9+FGEM_-9k>uRI#ju+&|BGiTB)J86M@{Lswhtb%=4TiXW?1+3P5wb@frv)LNF^QGF*zLl8XVumd zdsca}4SuW2ZPe!$ZD{24>KETPx?;`R^L2}dt9O2DU#lw=$jPYIWa+Z|=2aFntv|47 z`Py}7U2E^EFJC?w3AXR5KDdeK8#DnF{Q>vQxcJP07@FHPuJ;XZG2)Q#&)a z+xFA_AG8Z+xzPZaiKmO4vd{>FJa{ks#S7%3avpWn}YdHSf{R^M@+Or$K zfzzk|jm95-W$l>*=XM@{n_wG&IIySKMW~9-Pw^ZzjM$VxbSQ|*igR2_XFqu^<((tuiDs;=g}d^KH7 zz|bM9BfJf5*X*6KO0O_myuNUQf_r$1^tVLRcUIYVk^EY*Cj#_gvx$mVA< zTx2LREFz193`K^!#GR76eeJcBM+RYrOWEY-0@!Ec0&2TPZP&sK_i3v{YH^0h!a*w@ zUrvUnw5lwll*LR2Yu1`F%x*hrHBg*U;pwfz<%H>J(zk8~saRR=-lUJ0SwCP1~C)-y0NM3pLmZCh$u z&j)a>Jy1!vw+Y%r`fWYlp+HBqAW@4)yhsqMRc-L}mr!{`w$`Cmk^`c@;dP2qhe=-Q z2j^%=FLejgg@dE#(@X6+>4bMWbtb)3Po!|=g4ud1X~C}4C()MLIc;ePk;+vG%ACQ| zCiNz8Nza?~DsN@L&fO*^doJyQz5BKqiCrR%AV6Chi{@w?C@RKy4zE_HOO~3^EH4t% zwb-#^>ze6{WtoNysW|vS{Hjk|v?y*3xhjVnFdzSD^U-c7-IMV_>jC88#5? zo4G@ZQCOfJ>}qtBNUl-@wWeke>$)HSO~p}Vohd02bB!` zR|lE3KqJY~G2TKn!*UW%$^;O{a-x8I2o1?a9U?5MR?*9m7>ETK_;P`4pdf^h1VVsL zoR`Z{2aDNnLn1>cD8$g77jXwH1(!r}(pwAL0k^xvQ9+8QhN&wQ%aJ`JMM_9&%MC&( z5b}rY8?_4?NWwpmL`llWHHYq@jI%_~LHzp^#iRV9OqBD5+wt~4Efa-^Ocanse}haE zMfeApo`06*q%s%}50W4;^`UO6F7~2hpB=0|9^Q8rlg1!(-OIep(TiwNh!IAeM2e=Lkj(doC+f;#UdnZPRd1k zIiyM?WbCDsUMi&!guQ2^EZ~G*B%krz35y`cYdHE1 zs~jUa2P8Nx|3vXG7lboYW*CMM(+ALB(+%?tAiBUuf%dCrVp?aK5Yso$-OmKDL_MXR z5-tR~rZhd8X){YSJ?bz9uw%qnjPVKF89!bIW8YB{KaRUflt!;z25GTYn|8_oT@)Zg5HlEOWie8j3}-yD~mc8G%fJ1pFfPbM-Q)m6W=|(j(+&;bF0_hf4c2w@ssgaU)v3!qb~6t zdxhPEh-xmN;3+qMHq6UQ3&4fI<$&{n^Miwqr<}gjLSIKb_;z=j3<*L81Ze$oJF)=0C?3KUWlfE>iPc;Cc`TgSJTibH0UN=hQY# zM6?9U>2x)(Kt8{}$Qr@12#%11a*4Vg(WZKdG=jqFFc+r7_ZH0Oyv5ccTr^NIo{#ef z#(mf~U|oP!3-E%|Y9}6d9&?^@(oUiaPR|5uY8EY07vO@^^8yuzDh^lB6_9aWky(G4 z2)WP>UaqfSrof8E#e_2_&{M*JZNe~4?kBa6Tx%b>+Ai!i5x8-qJ*lgPL{EODxNt&r<;|8 zp=D?B%2!^BpPZbGpL*#PyzPpZdvN?TbdO@wXy+1#QD$i@#yZw%Ls7>cy0Nq0(rM-{o(PEFV+@WEqRsGmZ2E zC>Q-FultGwXCggADOA~6Sq37=;}nd6$dzHI({A_3E%}rjWx4`FveIe`?{Xe@#+;X( zjF6&}l7d!-O$YQurP5_viTL>^=LrDHbONdIE8aqEAGTzlur4iZ zyY~sFw^r}eJ>S&*#6QlDtZVPJ`77!RoVWFL(fg-Qtyvk_NnM<7Y^~Y->nP!5E=pXb zo7q9ijby@}&+X`|fa92X1yyCkHcerJm%`SYyF3wsajZ+cPnQG4vLiqG%{i$=6{ILa ztd#^K;Xtq|xHPyvc!zYq^n~Jsz?V#0Sinh`2{9VGK z)$`|M^=4S|C+QV@hJ(+Q<35Dk`Qp>>W?@wp&f4o%Z%+RpKRAguzv$+<{9rzne~D6} z01A@*$4Ax(G|BV_0s^&VOHv#SRZV|fLB#%N_fe4W3XC% zSND%k{HU{`dhLDHhLo*%%-?z9{w+HycRjcw=o-j$7Bny1a&mj?rpAZ+zP0a0bwIGc zR87Wvb>b@HpidzSa-x6WyC<~!(jV47rJdBWcd5Rrrc{iR0z%WM!AO+tGK!^0*p6sZ z$n7qToJ$iH*}%BuxFjaIEMX)P6+=@Dc4k;;J$9;4C0c@LH9CZjpvTY|1SkwQNf*AT z=bfIgzQ(2g*h_XHwp>dde}v#QFPXf_4T_u0G_p+6BJrGUhvZOb$%ccNESnm2s8C1i zpXtq(=PX)7JL#o-B%Iy%;WuBta-{d}P)1;E`HQEH!Z#l;xI26DjV|Na3+ zM@|fU^IUvod?VgK#$zzPkp2;S0O*eboOW&>Q0bJ6XupH6UPH`-o6^)_R+cWKl*$|~ zhjahVZrAxD5^S2pk~0Q_WfBmFG#%hoX zrE)Bnt0aV5nMG7Rk&(>0NEaei;uGFUVrtbP6%|musiIUWlfh7sPLUJV=?aAaE*N?; z@zDzeNB}<;l4)Al{TWFbj;)vhAJ@EI@UKBAsk$*F zY!AWMCsnpwD=ig}oD@f^9cC#2_mq^oI6Zl61%Szns3UnNkuXfz)I=5;uD_9TA5z9ndf&O&9lkzf0%`;$CMl7|^P6EPOK zix`y@DP)mx`?zB~a#zt|`(el7$o)l^?Ux;wBbSS=*snOQgs()d6iwNu98=+`$W+mF z`*p|l@b#iB&3ER@58CPP%$FT>WMyU&8pN7ZGE!7%%d%u-iY-~08S*UFdo;hu zX5*g9c75e~Ax4F`uo7kCU^btZdN!MFsUVcW-CBx%Q_E|XX(-Jf$~Pv7Uc%YC z+P;L4zl(2d0ZdI`(F@FZGUWq8zIvLNiT_;4P2ysj*}d@8VNg?2zwZ`6jdaDK)S>63 zwyvA%0bE2Oh}f2t&76a_lYMb9;r8zNp+m&V)m8CJyjme+X_Z1BU~c=ot&M&Xm(Po9 z|7Uq&b5-f8bYI%8=*Hc_re9oIRjOw-tEXcXX;N0gabh;T5^q~zR4etPf9PT#{Y?5$ z_T?Q5>*h6=mv;_tT`+&q*cqdZd>8cq!##k_s89wv%%`s~cbTaPdavP0!$m2xR=G(z zET#R3f8GBB#`PH321hpp-2FGy-U10Z7fu53!gRq&!(Y zflhKjYzU~4*JQ#cK&YE7*8qxCXuPGRg4TcGps>JS^o%nC=fAxt>$Af2Ix-)t={lJmNcfb7jTR8Cjd*4}hHNH*PU*xd_itjNV2Zj zkN5zV!M{?2qw$b#z4?mN>YpgS2+Zxc>$k#;Ygek|J;8_|$?Us9W)V~P%n^yYuT=*b zoQr{x%xY7ZZfJ7otiu-B^&tf!tq7Y;#8*^T8C`mkly|)kFeIMBbe>FO+9K8#(;N5g z4zg=ADAm$rM{J3uGj+P8qo7bm7nOoa333{{kCxCZ1sTj-4!{|xtFuxq2K}e8C?M51 z49Jd>G?Wuybl>5-jCT^)Dh+;0MYDR@Dzw^SWl_~e z{5&ten>kVc%}Eh{3UP6)v3MJSe$}Ts3+)#VgHlOGumXOYKmqBoLpNt>>s|`j@7av7 znQ8B-89Y<}w3dm#u$$c54hhhQv)a<+0n$uCLKH0#tl+XTNx{?8Vz5`4NM zGNra``=`0?W!Q^@fo@{b<135uAkSrL_Q4~^GDfmiRyt~l@QiZF?S8H7F{rb(` z)@enNGJ5rP#;Horm(n;Tj8tLYEp|N>{%-cT`F;8j%K<0rOf2pV3%)5rQ&`MP76WVA z`sB!DDeV;cbIl{|2yH2~X=IL69?S2HTGrL|i?h|3RoM&*zG*BCP2sF^nLZQM9Of)w zwHiM0l8W#FR6$$g^bV-1#^{+NcpTMFbRTk0e?J&qM39Hqyo;G?#r9jK0j>X=+<-K||=9tk!ILc>FArZ|H^~A!PbZ zufNFaz6Y5ijAga`gGPl$0a;HBo)$8K!W2P)|7ZrREyvTApP$~&m-y+y5NWJ@xr<bZHn^Q5$WmjxzII#S=4&rk@M!u58gh!G*K5{X#<^GQd2kb^LsJVc^O+vKzryL{& z=nm}XFQSc%)@9Cw*3Gf>sSJW(>=fC=GNzo_gPi-~z`elAsYVn2>U#~J1O5%la3;dA ztZvV!C}wK+E6Wt1SK9=Q?S=1?N2De{3LiF2@+4Z5v$Hb~ z^r)y4yN#$$HOAC&G$|mRKMxof%LtdTKT5h5A6-+;Y!Sr+xYk%2TYd`}CsC<93&|*w zB^>I#EhQ%&ff30p_)Ab)G}W^)-uyPYXJ^!kx1B(nVxJ7i7#ZVP2Xzu<;eYhed$*a4 z|ItfisdMnJq6|c3y9a;-J&AsYOKE+Yt;kCqR#o1=x$}R|e$(*pjH)%1bTOu+-a}u0 z#52nyyCSL1D(Z#+ZIYRv$x&nEg3IooIX!MAXBbdYpJ{AR-+& zB)raEeO>B*O8$k2$|*-P3lv|w4m3jQKw!wDA*UppBYEzWpr;YVc_-2Ya{zDG9IMLD z1xRtjJ~2_;TRIUMWa3 z{*NiUpL5$p7Pz^C5Z{jNKi&I5Lf=ZendJ*297|2Y-P++CQMm!FV#Kj1KhQo?M%O|N zrH~ovhfWrIT$j#JE`W8|-5$`dF>;eJR>AgA&U0xh*on?`@i_vlUW#%?G}tb2KKH9!XVb%`^x`JEx*9HEIu`mO-_*#;&lo2qTk+K5d!PvXDiOpPN2OSRSDueV*AH z2bZ=1DL>l9q>P$OVL*78E_S0MeO*C1mq@JhoZHKAGPP}G*>ug?rsor@_RQ6JINr!t z<_JA9A7}3uvx2M)-QUm)%5K2NpT)N{N(7lo1+_4>`GeCl?Nyv2p3N~nHr;kRo2mAP z$}>|moYj@)>zu4CfZS5XI~Ph$`r71hETdgcmKEu0>o0Rsu|MZL6z6**kor(rnOyCd zEuA&&p>BilTnmT`WyUv!vD}FZ4GB?__z(C#sJJ}4!|D`<=EDe^*ij+9@##XT+_r`$ zRf8B+6ZXw6E2gG*0g zxnuKCi^L-?PPb$=2&YQWe?+9`MBJd!g7k1hH5&-r3BQ;vWJiNL;1-sPeWP6}@c#~p zLv8mSY=pIyI+rSnFg%HegN@T=Fwv^0Pqc1%g@+M+&XHjY8ZoOe#AVPQ+AfFZ1j4I6U(yB#Urg2NAwNGzT?)q zG{H&OOuNh@;H1l^{uOP8vb2)^ek&?BR{&MiS%%xQpC9LJG#^DqBA*K4?wOKY9 zBAV#M^dsab$9}WL>L94<68+jfGF$WUU9IERt-XyX@_^#h-L2}>bEWDjFRQN4)K~hr zvh@7D0BnxsX2t1j zv!QduW&q{8J+_Pu%(TE&-wU0<^nq9AYO}8V;JwT2#0o1~sU`PuTaK%c?gcmkv93gk z1dSvaa;%6vYG~a)969oYnKlrfzV?_&Fc|SRUqnJYMTX>HxmTi8X@%JWm4s2EMOVC- zFPI{b3YQxK6rpMsBD4UUJ4A*q%+TDy?hi-|DY9nT6d1~CK(=6aCve)7ux|do&zPJ# zd^u7GR1rFQfuXWc^jN;5a=>wclyXSryti_Yr2>AXIIKLVr3maiNi!BbKzg2~8Lvig z+ML`HP&H?{6uB{{xr9*cjCn4`M-}-iUw0|&eO{~?8a{v894Y+Lpcy=-khvLsE4H-= z-<+}ol`rCVAr^PcOuo}8$@{N&Y){ND44-KJvh4!7MYB`sN9o6^M>j5fv*SiiT(gtE z&jem*Os0?G-IH%ZH!$BL+w5O;-4~yFo*X2PwwpWiJg8}JA=?Hbw^YX!11qmtQ9leX%i*&whFZXwJy3ndH8g?06_j^|7Z6kui**Qw_0G zjlfm+*{TODtNS&p2R*I(&ep-Fa&VSvla>j>6i5+77`wpy~!= z9+10J>xQNsptob!4bi)!b45mP-r{s&)PWiv{^}yY*!lf8q|*U0b|1bS^JUMs3)yY} z)SZ=JNZ1|AuAkH$EpD&I9k&PHZj@(83-TlAR{E{wyuYA-I)^mt9nwp@&`3)hVtsyZ z=DM7!quVRrsmXY9rJ%uFZq?t~{^Gdybj;lECcoUwTtDAQgclG0EEXYFl7~asyxFN< zoB@p>Bo(4?VQ(hkbXU-MFkJ>J=JDk@Mv_~6w2<_xC@Xz0pr*+BW$t)7r?3Zq&}SZi z+&nL^G#HEE9Q(}7Q$#BKIH&(l_Sz>L{{lBcECXIxOFSL^YqRjt{KwUmt%II>OiZ$9 zO8-Y6Z371jCplJ(;{}%3l!%*qLafdD3J*!RmwT^uF6H!8{b!D7nd|uluCvRkxXDY& zIr>p@101lYfL@_o;CDYWfBpS^{he@KlVzd>>7}pU5hhk>eIs$wdb;yndHb8%f=}vN z!p$XiEI8esGQ+;C;X5F=yt$)HfE#3xe?m2`Z%x{=qloY8HdMqVXG?3eu#kM*P}(d~ zQp;4RaK<>|_a5+3&N$@`6VevLRhNcX`HU-!joWN9zU)dgg_YRJQuNHqrCjRSzmlg^ z>Q@Rk;0%_Ol#23f@C!_ECFSw#;GZ_&Fr8?Gc_Fty(qfxXWlEG4=MX8w9hVo8Zk(_o zZjZAxHnIT^>68R9J!FA$x{w8ubf^UsddUD>u$^>>hOv;Bq5*QTK;%l_`4U_el15lp zJ;Ku<4r)k?6STHnSTk|B+dyR#$bNVIKAfQSVO{OhYN{6a9kRqtSTaC81VeqcvW z&Dh*vZ+^#K7i1rk$ZBJPb1v8#@sb(SK}SUU(QrF$-&F6GtLOF>3>7 z6A=?5J7bf7Uu8^e&794NelfGd!|?ON!~B;U_iUY%E!z!2B(c1{oBFgfQLycdVUb9Z zJ5(};1=SLjx_;gA5<@y82KSFlKGZ@qYCxWutLu#Kg+a4A&_~#bd@rl z&;82wS+SiC8dn!5d&FK0T(8zY%~w0_(XuxqXOh-5BvEZPA1+?ew#k;fwN=Cw*L87& z`*G2EtN#RizrS273sc4|O7L>CH*K&xZJff_AKYKN+E12mJ^t7{>3P%8ZC*_ZY+mQ) z_9RXSQ2$6uDsC^4RS=bvP){o?7E@q&3Go$}miuQG=_*7O!-&#H$jaAUo+!|=oRNna zGz$IO(##m#Eu+F3GK_4b0anT1eQ?ehq`W<13SSNe5KS1&k;6b7kvU=wSq>l_OL|~| zx!S=Qdty<*qQM2=^ZNX@#`nQ^+`lWxmy1K}H#`m+o`PKKeiK~X_OAc>ryCs%IFr$b z$}a08Vnu@kw}pX|S`9>uqz(L6_m+Aa#=F0=uPi&UkJ6d`IKgD#!~pa4cm>-#mxtp$>kP&4ZTNj z)zbSlf5gmZ;Dn33x{qAj(HtBAki@{X!n2-nTz$nb$Pg?00!dM^ntDIGiim(XQr`M-xQGt2*s+@v4Gf9!XmUYOMX%{}Y?-90M{ zI~(VJcNAtKHV(FbKP&#vHix=A^p%&_IlX88OkT3OJ=6bt*vH9|{^bI_7t5~&cpjcHkzoTkaw5&kcAn#OWeC9gc_&@vX z+M_H?Bb_99FVN&7NEk z(e=JZT6rb&u0ty5--SK}82UmHyHuN9Ef{t`qXt*gtLe5_WF)?%kvKox9jVpzs*Vc` z2>D5;K52WjB>FjX3H=qo)bkO&dn-E;&g;F_;6<Q)jww=}N`@J~4-E{4I_ zn8yS5={~4J1))jx`&d;8R{Js|T0}OS>66wAB3K!~fgAk0SJE+x%#uoKd{0Csm~+Gd zwVprYfGJdq1Jx@!2I`{g-g*cn)bpoaj2dcI=#`a@zS_(jHXrDi@Ble-@bw^%B-tIf zV2L<*0TP+UMwn_bT)qUOfCkI41-YOj3)#}&`2Zp~v*2gN1FB`Ponk9|&iK@BViHQ$ zM%0|Us|s|R2X&~mx@|{Y^={sVs3n`daC=D5^j&up$NfXKhmQmCk zd2TcjL`YhVwE2=w9%agCco3?l3$LKc;Ja$?O&4oN)4UhMzK7s_3+SfjStt0{8L@Zt z+>;xL^PmsZQ@?vFzyDmTfD%rES`X|ODtlp0xHuRzRnTtCInP*CxNz_XKgypoM=FDB zfNt=}H`pFpupEriXwRN%fxW@en&b$KL^M^wE2bz%5!5@_R+z5P)~W13zN>cZF$qRz zJT9_!T&V#t7jjq&RltBb&bf#y8~PVG?wqf31phGVyegh3>pY?Y)U+VNQlPK@^PZ%U zpRm?Ek2|<0M6NH2G*xWr!MG9S9NiMvGjA7Yfy1e9GbC;T6uTxK!3UD3dRS`_>8TD| z=y3sLyU(07Wd~FZffvEFxZQ!rYhwcn8+eTvMh*?W)9~wSK=Hc9f4LXma(YHtyTOL{bVXTwc$S+dZDMm=r zZhXE--&kFMU)VOq{`%B%$Z-Rbk*oXS^r`BjlKP*ty%(BadqlY)d_Q=8;Xgyw zru?C~d4i;;c<+qaeYCeR|1_iy8jG|>bA_4H3&4D208aX8d{IW~18MzD0%W-3F~xCQ zL*9K9Yl}uMMs+|j#`#yj9@(ZYI8N~&33jbWuKR8haWjCgR~jz#yRe(_OdVJ~;qb-u z^bxG;2{!G4)b=#f*InG9ej;8a(x*%?m_PpTjQ)!8K?Dy_?U+||cO>tC-U`eWADzpa z-ehDev`10Rc~%PG-d&AJ zEtsxf3A*(H|3YS6i~5>dbmv9))bvl=ySQWUX7mLUh(+Af+c)^+@W%PcY9GrvByddr z48$WHjE<9JwwVf=(z1^KBK-$eh*Z$qD;YRr-ct9hwzOVdLmb^E#7$_B2SMA3rT}uO z5z^9s?wspB6|X;roUfa|3Ap|})~j?1x4UaK1)FdDHMV-k=CG2P@P zJWXXC5`0d%iK4jiMC(KUyE2)9IUZNLGyIw1k!md*Zj)3s3X16k+wH%-zin{!m+~}i zD2N}@*B#Lb{0)0uR=YhEdvtrC2VC0>HTnVBF|hofcDAg{>hx$DdZ~?YG0WD_4^#tJ6z7EYqPa! za|+u7Lt}s)5FGwU(}=HRqLE*i&JU$GtY_XEjQNiuFR0nv!6|9q`;7xaly$&UVOzk% z+q`c6MsFeTT2QYcX?;+SU|0rT=4dWhwwc%tRkOoIM%FFY0?4WJM79^j(MVqqA&{=< zTRHL-q!bVX$<1kRk)Bcf@4q~sg#SRi?BZBFkt}fu^v2O1Iq>gqQ>&1geGH%3+v$9_8?s6r?|E%S`v90hp3T52LP5I@&m25OSlgk0|zx znAQ6}*`-V%^oRre-h{FvZutQNC~RPk!y!eSuuE(MHoLA4a!!zc@*H}PY3Ez&tzJMd zexhdrm!Nis>oM{Q83R_d3|^84zAXY2WFW9z(a#KZMNsP@pMVf$fOc#{*wZ1?wIRE$ zh1~{xJ>iVU?B=lPcHd6TPB|~}C@&v|Z++PxS>bg+)b+v$Ag|p~3H%eu$Kn+0f9n~L z){4tJF<^T2uGQKBPMoess@qqmT z7ZvPi9U$;Q%hiHvHW1-gp7jZarlFt0sv@OL$7}#CEx*N!P>5avy4kIKUn)(JN9B_40w3$PkJ-shuP1BNt(gwXi%-%c-KvU4$o z)YuXvA1bxL^xE^H5QY3S|#E7uw92ABLH7QypK%Z^mTJEKWvfZlRTHp&6DP z9)VXelm@#8hC&G@fchZL4(J;^ou&dczzk-Fs?ILDdMCOJu16e@+)%xi)iJTWYXn(> zy8jDKCNw6fKPQxGIr!yhZMa-dW66d(5L6A*Q2i^e76nn5a!Rn1SJ9M6hhfm0BqN3P zJ~#0)icZ)y$dO10c!sCT5q_er6$6#sMaqy!C6#Z!5FB@x4QwC~0)mWIfIXgSHrE6C zKAoBfb)-4@%~Y_ye=~g^IEkIM1!}5Sff6k6JpDfC9Gh{pi08==`zTHcrjsNvIp6jsWgYxw39xChT+H*7t># zDuA+nZmVY&IZgxe0n#(lg$#;}efZa0{1(WK7g(mifVGfhxo`A(bR$rnu`O6;>GXFz z2hGi!Fn_{Ct9b@x`o$5&MY`_V0*MoP6HOjEsCb4rH6KeJyt%Wpcis`W*R$xc-4u;+ zkZM_eiV|D*ShW~7lru#TD2}kJT2wA}um!?EV>pvoG(oaa#G4HPci;=(uyw!{Da&Yj zO&^8mv4yGDHUk2_Nl$WCPEmK?2LVK6fqtL<6he!6dKh&G(@!w^PuXW{6KF#Ron-{G zTOkY-7{(K+gpWvy>#>uB4}$qSp8Nw>{;?C*@QGk^ICelLvU!pLzX;#dhdE|2B=NLR zTGoAiVAzoeSpwhG-#%?bT4KDAmO**X1OE{TaaW&h!;~x?IS%)Ss3|XV3NVl$f!}V2 znMG4CM-`Vi_8w=Ty^~gt_0Fr*?f#G)N_bsk)&{NPv<)h{0pEE5jMKb7lD_WNf_5{{ zz|UsFuJA)V#Bjo#@BtyFO$G=}^B_=gY&UpJnT@4IQ@n3`)E-7DuOzJ4rTiMYHRB#$ z5(E#$hJoxy-QSn9<{&8n%Sk3Nba}JkO|dMC{=TLxtoPC)SRd8AkJ5zM%<`-8HJlSu z@vDYnx^T3^9#vYuWu~mqIx?B^*%uR<$Ke+}S`-+5W44hc;nZ_Ak<3{H@ov&sIx)BS z_h<^r(qAUgU}LWX_k%3;29Hm$P85b9Jp)d|`aoiv=6GQ_X9CNoCTJBw7i$1UNLYO~ z@Z6xl>hMYtnZ%dDwoBK^3?^0>=X9DBm^K_7j=#|9tmyg4&f z>E-!_>gGhTBQ_~P0h6BdpAw{u+ai%skkt#w;?db0D4at3{iIMl{ZewMwH< z9saSG3s;Lz7opCB+_iax`(bZMpV+wTa^Dq_pkiSExblVJD!bm#ox zAH+z_;QKm`Qt?)yL7V1v0uED5IQooP_P7%kRUlHYX4wD67m8ec4T}(Dukmp!I1;jk%LF_ z=-&9jeP^6-Z+sw9=zI@ln-}6n_kZ5=OFycuNc#j_S7SMT2woIH31DCF$JTwIdQ2b<=r>rZ!ZHsu`i3UF$vutwagFu^&QaKdDze{PSKeE-Cp z3H1=}CplI^?)zZoY7v!*gwG00#`E27!c(KJ!DC?y-1TWIAiNH}!j%27{;u!ciD-p-^af2?xF7 zcT(e6%-$%>T^P)~D9pTg%y`3u1xU(ZX%N&rUx1}SXcJE4EyrB?p8o1qyPZmP|y8FpbpqZnz zBOq@;KkTcXId*{Ut-$@HFWlCFoI;>$)K8@0A+~?eTdb-1SJ%C(Hxm0E71{~lqG&pI zx=i2xb=;c-#l63w6QZAhiLcZ-Vn~w@K8{ z*W@9AFHX?t{eDseAaL)@XR~Noht6_alX1gynK&WN}puLRw7xO z-gQahKoSi^lW74St&cZnf} z=djo1!M5%DPO`DtxK_d9yd-TxFlX|)A;ry8+TJ~DQB3hgGcj}@dFjGXZr^v;G90eW zU0SxXWn56UelgAu82;T({eGTJ`TZk4v+B3g9Ch+6aCLD$yD*eqXQk7zgbK&v?BA_WCdwc5?^9AWCz zH+qS?nrr-A+Uf1}KmY!ecrw%w5ZdziAGgltdg<3TH`5E~;_MLg6xLYjkF0cT|G2Nl z!roMFzV|w}rnst#@30rW_*Gn&EVG_=dY=9NVk*IU=qB4)jxKkR?Ijqa*-0^_whJ_G zVbDhR2+^sDFC>@Lp8*EHGYiKK&yizo7|I>W^IK>WF-(B>jhI#W zm$qwTbOn8^e@`XsAXM*{PLi%0JpFGYkJkIHvww^4`1~gRUbu_H$fx^(zC1++fy~g@ z1xx}tzby4KWnEH%!sObI)X;)J*WT~U$DdEy)QQ!Ob}-`FV9*C7nc9^gu-<_x2<#SP zQM?bBpk|t9^yt5qxn3bmjJp`c{R-aHjwK;ZF-0+~!A&vvMKR^r3j-WTDym@904FpO z?SVo&kf}Kil&~H#VAt^b4>F-kwZG2F5oQvk2rD(j0hN)Jxs^I9a@;#j-6x-GZzccu zrk&fqK5q!e47hE=A3zWO&$b^)Q%Rcq`c`eyDmf}ySidLDTZ*L`&$4a|{K`F&zbcL$ zaLYy|*rn_Il&+M(LHO0El57% zrz|q-Q@g29B(`hUxsgXmPgluQX3#9a&HrBZU1nZ}Mz>R}Q9xE{we)*0VH+>bT4Y^> zU9ej4Im%Pr+3<%( zOG(QFAuXwX{n%c4T!TVgC#9yQqNd{4$$o=79bPR$<{)z>$~~^J?9Y2;qXTlB!l*@e!wQS5>{Oef!4^R)ljr9iVcf6k-m=R28cN(#0rhnB7F^+4 zlc}eND+4RZ=KAAndSA~*O@vn;yjv|8P2aG{Wpn9_c-zX@11?=$Qf7*gk!EHc8G)pX z@|+5-(yjb%6|2A5e^tKmKC++LpV_ZQFGn|={&LlNl8OW3Ta}$ z49i$nmrAU>F6F0}nn^p z9EIjn^zNK6G_6acA}97iclRSTVEa5Z6GfuTLp4-QPU!W4fzP{FgGkANhT>5B;>?2h zp0mb~Izmihp^J5Z_gNMNs*U;4dDC&w?4L(n|3ECBO~Cx!(h|vtZo(oG17v>jKt+8) zc2w>^tjsKh4X%`_4(FhrPl}CFmpck(cK@=_c5^ux^e=a_Y}MxDJ~>%MuT{^D5}!4S zD1}|UYG1bk!K=aJ8Hf0zQcjR2`BWRpH68;9XN!AfA{bI4p3U;0-vx%-UZef|8h*Gc&7N& z?=?+l+~rl$y{79XQs=wbSSkxH4}VHj)7cb|=vd|ibCy)y3N3?;>P_Pgb`R-y-NmMk zq7JurXPc~1w9Rz;Bz_s;1vd0$uDe<<9`V0V=@ZE&cm6=l%v{i9-THKi1n z3G$Yy$&TWiqO3HV=8xj3#XLQ4g}uqP;+8bk@LULKHqG}ZL{HlaP2Y#TuoLfZZ7U_y z&ea1B`zn|iIl@j)MGa0Rf^47Z`=d7guMkQ@X)L|8QG_*(KLX zs1c=+w{keRp<*?vlo7%cCKL#?O*0ALEk525AxwUedMtS{0&T_>$m=DBOvf2Rz za$yc5c9R^3PyFYbr>b@ zM^RZ3nI#Rfw1lLpinaJ&fe1GTTy`pd;XJMrja%{c$9<2qTiGJM^9At1MaW@A%l$F# z89L6<)6I3wO-ch<7eIsH{A$F?tLS$wVwk?)(f~vN{?H^(_%(4P$UiFDXB9U=*Bjx% z!jUs&F%e8qOp!48sn7V{j-l(Xtf{d;DUl|9WGQzuk!HC4S;SB{|1fG`_M($WR`S*{}&`RTT#%0#Fo32YTFy_;@E~XaI{;97+I9X8_F=m48*qpDvTkn$6ac*1tVVE#sw; zmU%>V2^>>)No^Sip$E@?%s(b`&+85njT=sBER*T%1u-&urxeGk2W6phmzl|)Qvu63 zvN#psE`rnLoqzm6_ab5e*_@{_8Y+K@o)J%7aKfs?KpVKo+^9~}1E{6}sgX1tvD`+n zLgOa2V!1NqT+Kwz+(V%tlBgH~_Dw1zS7hE1qK~9;(|e=7O{;M^uHk}Q zqi4=E-RPj6{_S24@&!AZ86yY&Sg>>LG;X883L=rK{}LW__b@O2%|k7qZ% zUml#6h$n#ux0vF!9qt2oquVtftv!#_tv^?LVYTS=Dmq?+^=PPorb_V3VrVa{^2ekT z=O-M3w0X%D*{W;0LA=pBh1@q#kF>Y$u!e`_zaj%&QF87P!^U6@@fa~e@)9>3-C#7y zZ9^EyvO$MF<9LyxL;9S>G2tWj|1P0GK#UWTdvOvVFA|Z104I%?yD%PLsUG1E!9s)v zv>?XvQR zPeCe~B#NXYf)ORUk3xbz&ek7n1$Zm7M3{V;kSVPwiA@y$%LN<-J_Ur%MZgshVyC9k zB6%heKa$r)K$kaGizvJ*-nmDoVjK9I8FHfHg8UhrD-75O&4y!5VM%7|kzhDx$Z1e9 zus>t77M?phrQo&Wae1K;aps3S6uvO<8vyMlosNkijqFOi!0umL3-6?yGfD^Q8Y{Fy z7-Ixk92U94E&;QdKG73tiEl|B=~xA6C~4>py_cHe z34IWD?WT-#$n{=oW+Bl3)FCw(ROaB0Tvunw3uZYdXEzS@UZ!#H+SaRg|Q% z+>3d;t(Mtc2hdiC0Q2g9KtobJRZ+AQ7!~ss^>;Lugu_#i<$CFA36*Q%EWrzjF!67C z%R1JFEZ74ue)qVcvlY8^4EF$>VbS4%bJ!yRqp61RzDTS+b=6?cxM`D=r&d!+ZSXGa z5z7kkMSV&`2Olc~SFZ&ywAqnMXh;sRe)~U8u zKb0-G>>s$Yk~c+&2UTVv8D7PRu6#o!3wftR)BgNbt@!?Q44L=v@^?`vaglFKgCw=b zUtSqsx|h=e0@eeiZef7fUMnW`L{F)e){kcQ8g^RxFvUZEQ2ZU-`W)s_b*VWmsvtGJcGilG$%Oj9wp$ z%~8>_MG0A-_?zToY7Hg)$N@u{lEmuY8Gxipa1d(}=k=<}gFkknd?_Ew1%;l?i@GMG zl-2>#;y-iRHl0_$K4_3Z2+RS*Kk4ft+lpzc3MqeC{6}`&P5q`Ls z(6kE7L}?nYWmi$Y*=Y}#`ocQx^#ht@g>QT>(|-i>UXurV);e%_65kJK^t%kL=1tC zk3aWGm2V%4>IzJApBy08;>0_L-2t{_mP!HZ))FccG82wQI){S~OW#96;8G$lu&2{R z$bOhjWQ|55q^51tq$j)G)MrB5_ekMJ!W+V)Ql%mp* zAA~5F`re9L9tWbn4ce8QhQ%S$*tjPRp1ICv@ zU@>`5kHpyGajD=&hfLp6!oqnSKy^hmxm!$|3Ls!KF;q7d&}vg$qVc9V^7y5>js~ypX^ZKc4_jD+E^svI#-3J5mi@#d2!Qlrde>0OhvTCGK~(cOWLw zy8ZQ1ZPiBIC@Q&KW2wEQfu`CQe%tJ4zp$~%-tqENfjOIYTjp6oMe9jjr=3EQdik|u zxJ+_2S*N(4rpshy_lrDtIA&=hL3|Q%a{mQ+8+lPFE=I;#D*99xJLo|2wbI-NnT|sp z#*^SUE<@*f1&fy8$w3jb!e~{r5DF!E-Ke7E`d#zCS$8C6R%L<*!&t`b$ez5SJeh`v z){ACcO4^|ghc1yo?UdZ7%opkxVVRrS)M<*tDlKCHL5Bn6Q8&*n%ox)R8g@Z7Qh*n3Lzx`Y&;2@vCMs%uU=wSeYY53^};$N?up$3B$}x*S~b z>(6Ofy+1D(Lb>7`tFzyic{&Hzg=kFZk839ZAaGRSX418Kp7z>t^iE47>A<8ZtfdR( zF8mQG>>zWv8q}#X8R}D>12C~BOp?IUELi1)c}4P({`72U1Q4*?bRn3b7Kup%h#;U$ z8X~X_5`)~;wC6=E!L`)9V3y@G_<{Vbc+qOBz~tF#jA$Pbj{2`W;x*;S#pOsbq$~)V z_VPf3GLMj-!EG8>ssj(qb`fPmIs>;9LF5Qck8cgaMt7uX6PTl>-ORCH(erUNnq`D3 z_A~9?k#wZoDZfjA*8MLgz-mX8ZqW>qaxeBi9({!3ykL8kdX?7peRH}fEI*X_LJ5@e ztja8-45BQ`q-8nW?JyyDG25E0M>MkgM#`@)MBMvU6)-`dm|w?4Od%D!EzEh87p zv$S=O<8ZATsH~@P1^#@cwed%z)^!CeCUNt>FIQemDs2_q!P?)R@#p1CY*`SwsewWy zaWYuAFza;Blwu}>gNGpR>OpoHGRQupaKW@44qI|vJkSnP074c29*;p=c<0%wWuE?p zU~=~vi%Tq&yM>h`*u?)$3ByPCZsIiemU)^q-ES`DRTPgzQXo)TUP_wX_U;d!&9}+NLXxdm&7U9QoM~&9($#GOfEClXQ(!OdR9AqU z&01XA$bSw^+85Al&``G#IwG7-1>@GwsuWP*OwZluN z`(h@5zrPW;;a&d76_42*mK|z@MqJ#OgsYY<8w`2Sf8asl4=D(RqguI~Cjz=|FRbbdbwIF^mXe^_gzFJnkRaC^*rNTWmY9bbDn?C$@CvLXKXyL{V z#3st4OHMao&A&k7Q*A)Ifjp;w46kx;UciS_C51(=Bv$Dv9kW*9MVO$Rk~!h<8?o|j zzPjg26S3l7b2(asEn}ePjVe-WDHcM8^hHR!(R3Ik7@XT3pe+5{cwoQBCEfAGOX-8K zG7r4;OU2Qut7}Z0U9xQAs0H#;K~1qp@gT->jcubVBnlL37al|2pji=3GC>_d^2{;3 z(vk?Ig1X>$Ga~btk|}eDNWRy`LOW_Ru4lNueVXqbVu%09f>i)LNStG6u>>z>VNS3) zCGp01CQ>SNFD%YPL~H`|@KeypeFwk`dw>*;A5xCq86%Ho0o#5>loK5)5-^Yz9hh*N zV9zGwo}*i}db;eH+QwszFwm((khVH}3&xs043{TGxfuMCB^)I$1FjIU{0EAXGdxgi zhXikB6q7g&RM7&i!tTxX&W=`{vU{zRC2_w2b2$uMI2Lt=FbMc4&#Y|9>8ZfQO{e2@ z^guf3th93P3D;MLx!@L~D(26{!gcwmX(jD!hZ3*H=k#}#ZC*=pXN}tn>CegSwKze? z)hVR=csmabXzgvl{9;H_6om@dd2PYp7W{foI5rdd4#d}#k!fVzng#Qgpx4nv$!|I| zD`rDBnrc;r%2h3pLvkS`WGLc#J_HLkON_HOzaGx+ zB6Ou-!biH9;`D`+_PZ+F51qkT943U4DCFGIN^-&7yJ`Cyr zD=Z|;vJE6dGnQ){>eeF&%YNRjW${QHJ`8<+ zTX_30QCj(JZ@;m_?x^7A56XJM5Fp%`tpd4B^(=~_j|fy|(fpFF<{wgq86-WxHto&~ zjF{a6{*QlHPW)A%(vtGEYAkK}ZvB!U^F91G2pM>{jdzya&Vf;? zMc}o;{&S*rHqUgK0jt<~ud8vvyP&^@SZ-jR>2%~+eE(>>HY=`Q_iLr;G?7+0X{H>F z90^%lUT|Kda=5v%aFvMbkHcCdWuXmOiYdf({O3aN+UVfb5)i@z1Pxu}QKZO`#+}4gK@^+= z!HuC(NyLFobU!((haN#~R2f}CaEac}krRkyrAh0fOwp8OOv{Ke=+u%%VCij7NzKF;@5`gyW|UjU(x^9MIJzQdc0?A1r1_S4TX93w^h&gf zs;J8FcL)SmM|wm{D~|&s?3|d0#;KLBN5&Fzta?7Ta0wr`9_CE^d=8G*w#SMbuy@>B@Bk0R(ap&t$6DGje8x0x*nSiCv9|HS~=am=dI7@v=nl03VTl| zX0I#MX)nt)=e~c&W+D9ZLhQ?wZ4Vp7E>)068(kx?uCdFA}6qj_VdBncwCY4_>G~N7?~e$Y1sUcFa93@YCx608N_=e zt;s4{iS+}$feez@2k_f!bd>O5aQg5Ul1EZ^s`sfGwI?FHy)&d7kB8i0MY5d*$##ma zJP_+y;E^NUpy-b(Op>8YlA%nJp-hswz$6Qb$;blUp#@u14A`QgAVX+MVcw=!&I`Ln zWII#xhiIoE+G&V(8ls(s=&@r+vgnFui(T6}nf;;*#0%)9cQxI;ILHK5EWPODS>-@m zkyTCwn-SpCxQ<-6boA3I+;wF4_X~wRk9Re-q~o1ej4u`A7p*JoE1dP#aMKHg?S=<$ zdgX@GTboMj(yf8El%T(McK-)h@d;5a2mICGnbKN6y|>i)vBrO$pH$Sf*L2oBfnJBL zQ&NLBqKzdReYc|RCEIKeq}*LwH;88s1jlc14dT*Uz#u#eHa|UKn<1pvrl~6duyHqa zC2&!T5dLUPcO+m)4HAU}?gcn3pVP^fdX=N* zyDkUJFzz9V(#D9}q;s^@myR|n>Cyjkjh^8QbGi!^#XMsMt2!A@5-vUe2P44>`&YrklYdMJB%D-TLv`RT*;sU z`64vXHSB_f-lOr>SUWtoI_~i7^zJB8uQIQ)Y%*`M>@YvUKWTW(`Ag@UUM=rHu?dcr zk}Zx~oVR*!E_t3k>epss%f*fS2EzvLt=1zZRjtu%iCl1Cut|^%K4rETxs^V~xYDk{ z3o>SG_VmPX%o1IF7-waL9yC#nNh@lJw!`f{+wr$MN;k_|~LmNeW2}C-VF^V)`QDH?Ky`mPgWky ziq8SP8@0$+OLlsM5}}57ggO||B5qE+^vnZ&zpHGX|LPC7{C>mQFCY6uVgK`Q;;xr> zJ~-bU$f&qgh1B4ycWt=;@S(!*clYeLX5*@#;)#PVce)-P@RQKkQDP=YAb$N2qpKG>jClCrZ$=ppljGtS6?i1fzzSIqLP4czhm)kH!MV z@FL_F+>3Bb1F4W+T!cLqh$320veCDP8|Tj{oz+dGmM@AX%CanW8)30>m9N~z33Tn6 zAOGuiZ_}KLJ-=S_n>8DMcjK=MD{)era%J3!Y)QN|JtbaJ61(S*-w(Jy{Q0dXuDh*J zcXin0R9`|_R?I>cE=e@2kL1Yp zA+D%<15Ek%4+yi#T3;1DV#*gAVk#hghD=T$r zS*vT5H~GZ2iEUHbtY*5wdAhxw^8S7o-&NLH=43UMlgkRX^Dn2o)l0wnVxch-iU5uQ z(acW($691SyCqk%0asznAeMmoWdil_|+olcR8vLT>DSf$n(FpG}jZxDyHM3D4q z%&GMTdap~=M;Q%ttilT=SB7n7iHQ|i!g@@IVjj7T3g%DAXB!=78)eP388q&5)I~sM zW>ooSfrFV$CdHJs;wt$9Cuk1V2F+FE=FQh%Ul=LaufVtCF=oX#_a7?^GI6;&MjZ*S?OI~zQa4{ecfwJSQEB7 zROgw9CK|5fuT)*Be<1TDdeZZr+W?a`WDNR@k=Lt4-tKmYc7guy1FXo|j38uE_IM(a zHfAytJ#L%F;|7(^WpFebE~g7-FajEb8IRiti>b25GblonnBzQ=Pt&{nrpTv$yUoV) z9PdH8g_S2O&r~wF$W=O>9+N#|C!k7$4!|Xofp{+77H8sb1k;Ec<_PDmsD!$K z;Lk5{$r3|8WB}5bL9c1jYi0VN#!QDm9WkgZHy2GTSZ8&4I&D1fCu3A3zKnza7e5)b z(5P;dg-RNMVHT5*bL9g+tCb$&D_IpL-_hq4{Q$%a{%7I0Z7t>aAC-yhzN^PoHsSj6 zhPJ{NODo%#Uwq}HTy{LhYPHGbP1MB5b3dAFj7CYw73(S7g}wKWiOQ*P(!jJL@_rkVN-WgJW1$82TQIO99tk2R@PfeWA|fvz?cs>X z$wzzoh$zsbJx3UxvlLGxDLhnGo-@nt9Q2a-Km0k0yI67KfO7mlE^G(Bb=sKz z^@aNLNg&K2(oyR6SnyY~%A~uazASzE^g<`r|T9 zwW?h;)jHKVrFyP&nfhL|xB4-B2p>}Gt5kSP({6T8*$*pO)YRFu*s-u_t@A$ne*9R& zOZa4yR_*9)T0f4NtR{Agos6SzdDU5edK}JHslj|qmnPDs(R69DvFe$sqg4!BHNL8& z>V~TCRXtesld2c1epB^-sz$1GJyp1BoJ}26FI8WoW{G;7db)bEdWZT!_2cT-)qhZH zbZW1+9@SkQl667lyS|MtbJ?sEqk3ttY8I+ImZWk+ zkd%FR#*NQ)CWn)xA}J+1lRe3O$^PU}Qk68qzIBVBSEbArNx&6?ByK)b4XL#0Dtt4qoj$H=N@Y#F^-^y7=;-F&;oEk9byG#nQueV~))Fs?jy_sg*cTo* zrQz9=?{zjH#RHCQ2WY~|NMXS#5)?77Sj$hk#C5* zWcte}^p`2pU#3WZSU#Xv97sSSa@FVE=#;Il$f9bia!6iu7OiD|%d5-k3fD|pGjU+~ z?B&lbpRjzKMqkmoed?;HE1JobITLedfEa!2YFjYC20QM#v}xbA7ww~0S|=)lu4>+K+0!4hICL8lDiyAGoWEcxTpsyidY5u(w1^(p-nJzKBeQ}R^F zUE#Q4HZ6K=hD=5?uf z6TZQk^hSJ%I_l{*8d+7XirmmS<%(?&<8{=fZFK9B2EWxa6Q7kG+%U?3jdTLA-#}iK zrp0}`MdB$D8i?fyKW;EwTXDF7u^4S)Ox#HBGw!K;1D|MA3o1b^I0YB$a;jDIm`zl5 zs?Mkwm5O)gs$)?hLXUSrCDfUkBQ;^3uGSW-yLnH|ks4B7hBH3DXvp}CqM?EQHz5rs zl|e14+&+)!j+8~kNKHenSaXEOJmy5+WpawHuox1<)tQ`FUG6s`mY3tO`@zh!88Sa} zXXb?rlkweedbZ((24;T4oef`_m^r5HrUx4s-$YY`&17mQD|#sad|kTLV$Xe4hA%GL zQub`wJ7sJcwipr?TaLqa9K~z#&6wL^ct!kDWM+#uiFb=nitHnX4-DrF%pG_)K8l$? z02{m9AleKDu|cwgfw!3qri`h96|ra#GhzeVkSP;=CIeRU7gFw;>PVP(yHvb(U*k|C zX@ns?Z!+f^!3?5nbjWXN1|sK=U}{zQ^O;?~7csDAvJs5~HFM%X@SoHQIy-W1^lW!p zv4FbeqcR%gvrK1wZ*O|Lv74 zuzk|9%>-S@S>>b@!haY}-;Hti|5FW^xu))P@nXT|b7_sBH9};hk)KAW= zZdYUDht!+v`b>A)1xc{QdXao)?5R$-r^!mRLU*NqW%(2MS@GGxVew7F-wawzT{Wmj zmeq0ovj&irarrFpf{#{hEu$E8s^aGl&f4$TbY%6zvn#!s(J#mQ0<+pPyxJNpE!@@C zdsW9nGiOu~-kVc%jC)F~GhBwJjbGVH#uwgtDD5PX2Xq{Dmp8A zD)v=y6>3G&HzkvuDV(|?Gk$}@)|7j;4*BB;I{k} z3}GRILqSbkpFyS&L?BV&0p%Hbbk(~S5VzKP;Z&!n<;YGo;cB^9KFn1Fqs;$estWQ# zc;+~F?Trgp@9l{B$}YmcFR7nyHZ-4or+?v1S9v5*fTF>M^`pxVZJ4q6r^iY1vKc04 zG+JIBxOjB*^zZT+>Gh|`1J~4tFe-YQ*U8`TouHoPXY#sw`2agJtvbg|B&3s`U#mEd zcknTuH5pI{m5K%-B$V=&{l=G!#EX$NA{rI%@;DWIAx%Uy$lm2a>RrA#oQQ~};V|~X zqsX<4RfU2N zWW@pNF)IT*-sExV!9IS8~Od{5!7Xfa(7x1J551 z$TASf3Cu6K_`6=@LB)$ac;1WLNUw8(=e@{{RQ?#Lhl!Ei`WXMa7rAogu$F!~ia?ka zT}A$f4>_+gpZ^@{TQBmCE$wq}NP=*UW!)A_+MAeOYO;1IdedZNZfySfh_$_HxQ~>c<8r`nB zt?cgPbL?SFK6$A8Oyr9;t+q;2&DZne0y8)@sB}q9Qmhjvi+8GTN$u4$@0~!rI|uW3!@E8#*-(z8V1LPWwqSU zfE%)|wJL(wiYlC;-%K&Qlq_wP;30@i&6!qgY86{a>*Sz73kA7Qz$QTirZ&iMk}a02 zfUZamn{r}~J;xWs%f2Sr2g5$ z2o+kzc(l9s8?fg_mtV5=$s32~wO_t%<+@w1J=xzqwV`un zO=D+S;F@K@`VEiV@u10jHS@#Om5G{hOYXjy8<&jG{eR0PcLXad=TwwWaZ794w^dZ` zTe0JfrfUZ8U9 z%iA2b*P^e*{vdoR{98~Zg=nfys7Y&xxW@i~h+Ks%u^xkUNq7N|6*q(Yu#VzBsqRstsmi{At$+*Q=6 zmGU_-J5K?X^~xs=*zgyh3WCp@B-Y{6!Aqdg3fBMMoVTahnOC)jgqsmXf&(O^K~ zYbPZQ^bx!qo~JVzfG%VRy~q$cqA-7?c0&wbDI+!~E$M%I0dJ+0HSW%eIuc~__%Y?Tt@4dg?NL}?+b#+g5 zPt{l7T{fI(t$ET8PXzKsUN0szy`#BbAIC(WnBx{CKZcu&4aIh+5tDmSFygk17dK?Q zxD{ibY{LDXIO$D#8H*-=`jntDWKx0>PjNxg%y*DRQY-S!;RNoQ8l#WnQjQ-LBkphl zqi|gMiJ-(lIDxTxcr^FN>gaA<{Yjfn^N?UbWxq=K_hRn~P_rd!I;)h`Hw9uRF}ZQ-MecGi<@WPRCV3z4M)OyeUQwbc?hvv@%(9~ z<_o^r6c~*@LFKJf=uIe%ntdj`%r&!6QRxWz%%jx#6M;m?SAYS*9Hittep%yAbzFG_mg~9reuQ?c$2ND&2Imo=}lC?7LT9ryBN6l=ywjgRYsaga) zZbXE=)Eg*6EeBdgTF$n}S}>2H)9ZbDN?+)7U?RgoD2itsuR7j!(1K&1gK~W84-_U7 z_*6nXm3TGrZh{sP`w~>*Q>3r-RZ^9O^>yMR;|Y{?)m^Bg4%Cg*ovou&IC-y*u5-+8 z8Ko8<_Y)EzF8SGr>%WMo(-V_-jT8fx}H&6IByc0r|g535fJ%C^f_7 zQEM5tIO2}XV3J;7TE%Aa&W}TK-kdEMOKW<|`Md&$cjC)B<*a=C7=bC|U=HB!Nx~ znTQ_oMIYxZ8O*+YaU2hMF~`J;W;FNtRE`N#u^#7QS+ADL`uuq=e;v+A`KY@3>PRO7 zC?X-sd%ykf$rs{-l$Ray9S$ z=9H_zpDM@aym@E2TbDE}S+-(f$32f_|6xNJrfQg|s~aBP+33$?vZ@|unCNPPGp>V& zZx=!qUu#yiI>TP$Ls2cHV~RG z*+di)n}`Ms^vZkH+tu4cr|Iv>M%h!LQ;}1Js>Wb*OeowNyQ`3SBC@~m5c^H}VfCBg zAI9W!b#_7y4%or_w#R-$K=e#D9)Lq zCGk+gR09~r@CRtTn%ce>)(^h`C2){aw8pAMe@cWH zE#|huXrEBA3bw>Lgx>lxvn+<%kqVh3J7OJ(I-D=*-8W86TfO8PQTVjTzc% zQDP!;ucCP${Wrl#rdboJ$11!+q!&$}9mg!)M>hV^QD(9t!x;laKX{5%_)9)?7M zuN>&D)+y&bcK~zrWtiW59=`!63ZZw2m+TkEG}S!D0GQ^gUJ!x(_Di-){9gjHLWLWF zh8O+vc+n}37`#HuiIadOlmg!7P31-8 zg_0EtDSU-P94`^Vv?0G32dS8=>4u2~c|W)X5XwIHVE4yTvZ0dG$U#K8MpGF(2gx;ajA}hSM_Kf$1uPEx z`|nD^i?;EJNso&!1rnGB!?LFC?k0RRHg~TgIektn;$vcHl?1IKW7w3tNdJL8gxs)O za2hFuS9)XwS+Tdn)?r`hJ*Bze{oE_}5^SfE}C92 zdDDydSJ_-lW}?7bvYoehNoT#JvlM4=XMiL+BB3-_i zK%h2c=FG)r+FXHWDPCJnM%s$aAeP2Dh~Q)_Lwuzq` zUj)7=Hnb=rVRtAL)$tx>AfOk+Zxx5VbO+RhU$e z4Y+uYr}$qwo;J#yrJ))6C>}MKcG5XYN=HF<+)tJqjA7GK*o{ksIzUMdGvp$5ki@^- zxQK8?|K%}JC?VRtiq>IyF#{2{$K#TtxulGaC;UOHosrwZfru^4MvB5gE01w8N#gQk z3jFpENrJd8m|zMCa=z-%JV_0Aic&SfxTE;f1QjWY7gq;5itZ}t{_KS*ls^3Fxq$~JK73$r%k13`LuJLny)Ere zQtu{&>mPbz%`I0^`{L(2S3O}AwyapOISms}W!vzmn!R`N%Kd4AW#{5wTZ4aX9)0ID z3J}eyQ}QOP<&0%~KnN@hoDIl|F+jmD@Xwiynhb1RpKTeaL*ytVdepg%^adAc=85 zJVrgiKB0I_vtN6VI;eSzc}w|y&v`hn)lxFKf>p9AyogaYjZJIyDAzjHx^HH-YqmMI zdG_m1+E04UyFOQ_m+5rnh_;r?l}5G0*PoAHhVh$23M$Yh&_Fv=d~fHtE$yu-+nq_0r(w!k&mZq6{+;htuw)h_7%Mzb981ED8+SSPU67 zx-e+n6i&gUvWAgUh7-(`;=d`A+BgYtg9gbwIiX;U)y!yaTu>XUDZ8;+gAZyn_sKCs zHD*veD zkh3xkgu1f zXo{`8FFu=@7uGbCoW49Rt9ZQ;lMq(D$2epCL?_j;ajw&w)EL6~=%3Ud$j*LfSV;JV zN_S?ugNBQ!>4FlQgE<+@%3Nh%2%57u2QwE`P^=PE1FEws*-D&HDhDshH(f4I*#$og z_|N*OV!z;D>EGoa!39=S*AX&}yDEU0G{7W=j(BPR@7Nq`DfNfxp%$q(CH!P-s1Ap} zg0I<)Vf>{2+;8Y%rWdc!?+QM--lp%3-xA+r*<<~>=~3&qj0de}OzMO?>g6jIX-^0DWbnZ=Osl!2k_15&_?O)R#I{cl@t@oB!AG+U%XB14p zZuc?Dh~*XP2M9z@1tmQBVkCm`4DnSs!D$0O*Nno4$B{E;AEn-TQSbCQDJOYNYDo#? zD423r80!@M6)q7c#(a?0i`V)qBwb;ZDHL(LJT8hghINs!DzFN?2Info>oF8mM^=H$ zy+dx_p1KwLf~M=OrVZ|QR{{`>90B2QiY<3H^G z!RDPm-Tv?JNcJ5?dD5Rqwlu`&6fnK+S{@#h zj^8w{`s6syannx(9R^~gR!0&={*;ECQeuE5wXI}&>M?+Sjw2LprYM?tv>Hw(qG@7v zJ4%%a`dR6sBxcZQnJRs|3tXg*?#ZukJlsnb5;oal7g#X1oW6VYtj#HG$LPBbqOq49LybB>^qX);P8 z#sZ8@{nL19n`E*!Wg4G%MS=f)6E=Kh=3Vr;E5ZY>zwyw%SI#|P)j1pnm0fSPYHex* zr*>#$g%7>{{rm2H{d*6Yb#{!LoLY-XO{2Dz&H36>EoBxpp|h%J z3pIpipBi%-RmaR}b`;(`rAZ^WoxFC?zUVl1y8#Rs5|qy@jxIDy4Gzwyk@+YUT?n=c{PmB+kA3T+9~`~2>^o_qd|-G}3$aQev3`H?`) zx9(}h*mXtjV>kq5xIcjtXb!8!eJ}}XURjKZSchiQJ!JM?=_HXmaN+Vx0Kd-qs88TRmfxK{y!%e*AWz}J)Xsj9 z+8I1%B-+3)FdarRVY{Z9bG!AN+vCw|Ydi{Zt+fRLREA*@M~qf%wH&rsspA%C(DiIu0Lif$Js%_WF-5N zaAx4R2jPHwgd1@yP^Ug{l@hB%I7Z22IZHhqEFOfj%WD0BE9=)c@mb$MyC+^h ziT3q*g(G$st8a-XV8d{>@Lwl>i0qe#apUR zQ?KaWr#_|rs%1P%r#j*e1OmZI_fqW|?Pl$E!!GUpu7|Xb=^x|1Fp$&Lq{7oK5n15NCvm)aHYtL{A7eq7vrvVA_Ea(Oe4~#!<-_mz@$1!MGt#o zN`dJELuJJ@@tu6qoKLilpyie?tF&JGw+4Ta0N+fnxO45#_c#J&Sv;i+Pp1oJWj%R2 zoh!S4R#)S4g%sg1UAk*c_Iq#G1F}%auCvVoeeGewZ0{K~qd>fO* zsyf|gGLQ)vl+_`tP*ZN5&^3zWMooF+1QK)y(Lvw2^tmuGStv@DJs5`YDAWteN&%Oi zsf5Z`p&s!lNfn}b=%-MMe{2VL$vHL@C;#|kcXDHK@=wTQe4xxw=a}P9zva^Qu^|#G zksBxBj=3>W0T21O-y$6+uc){h;#gF`dnwyggr-Q8=$xcwX%k9QF?Bzxzz3sx5kUNIZZXOc#~FP^7*X_ZGBO!HgQX`XuaD}YprgnO=Pwh z?DU12^liapb6r_%%gnSbP|{FS5U-~}HY1!4IHK{|+1J-rl$F<1T;Es~Eyy$kipYz^ zce+_?AZv*scab?pA3{ac@)Jg6fFiPt93n&@ zj88VpJ8~%43EkaZ>0q3>YZG zOOU`LQ90@1p}ZYaACub?DjkXBD78$~IZR0j21PLeAyS==ys)5CG9{d{flgmlLJSgD zP)T^8m=qoi>i!lIbraVL6yjg0q?i;hC?x;TLE<1P`5}387l@S{SxEEw7lO)AZB>}7 zZTNsmB?TR%C-oGPnj-qY^e&|@=FsJ`zf?sXrSN`nh`(pI%9}{Rud2MB-8VZUm0(F$ z#It{OQ{SDqjym}D6t4@1-A2RG>?5$z-WnsA&SA5*;^M*!Pc1F|HHDc*kc2vr=0IPNhKh$uv32kVA3Z>Pi0jBa9d@ z4!kr5Qm_<}ezS;w1+wPLXUIX{eaD;P&ZF68`Yrkd;=wAcRoLxz>d$y60b^`Iv#HsJ zIi?P@%+QP0Qfs+&hVv@z$11RSquxqWle)#VPR()#FzYGWX8_(u8R>$#@u~a5qnkpSjkuivwrg-Pxosu6ii8Z6o`+g6KaS!|; zMZYSQyuPBeAEKfKN03C*w%MoyfU*y#3)&-hs>9UvopYAN>Oaq3hQ}%cZRL0CBHEL4 z7Z+61hpznP-@aD%*mu5p^CRO~hFl2w>`$=XgRG z+eus$F&?k3(w!kbTL2ugQ8m@omKvTI9ANwuk7P8B z$B+0MVyqyrz&aHmU_#a*myp8vV44J{lL8y2#BD6b#-vDR3OwdXxPvKx4E!*Zg9Sjg z@$$>E#w*9^w$t#vMezD?_L=PS*Yx;dAymb*Gt__AUpb4e?Js?`zbc)vjKzzO94OH$ zRB0@uY_>^UhS!iwxYIZr|NHxH!aXksh{+l+zf8AXIWD_5+i+cW=DpAb*W;zlc$D?0t@J*+=bfJ3e)M8k1MsL0)7-VN`(@l&maSSh^nbS|wa5+39JZ zbXVzvr3Xq!N|oo}-ICv+|3bMEX0vj$V@tsv<(-ZL=#XUuy^fT2M+`*^Ql-^s4&OXu z2n~S}aV{>i3xU$%kSmochr{l4Du@JwLcf)P2T8_EHlxSD7ht{@PZ3U|_i#R^*W;T} zSnQc0$YL_29?k7OZda=?F>$NV7gNZ2r{vG6NW==vu~>mdiUy!g*llJ!L6s_{LRDaQ zVAz4l^@3O-Zd7Q~s8uqq!0Avb*&rI0I2iJG8J z1+QRoAV#H;fb3KT!yKkzNsxS^Ri)M)pRO?wDS_#Pz?UchJekSjZ~T(-Kyi&0VVXW6 zE(M0D{%`aO(+hv<6v+U>sAJY8Z#I6akjHa_FUYGJfVf``ioV^VwH47eOeq}16(3B| zBqbVS$tNiQi3E`UAyQ^$tFz0a*^%r6;cR_lg+R@lotgovpH(GG>N3Cj-4u}xN1kWC5jx3? z+E0c?BO|GgL&|DLb5KaF^R5YQ4{i(H5>atcVxnxl6Am3VwG9X zP@fQ2TtTZhmR(3eG9~Jv@ZuaNqC06fj4^U_PFb~psF@cLfNl~KNI}J~B@*M)Gl@Rz z>=dOflCJ4*<55lOo~EcjLK`w84WW_^*$=FB74s(Kvqj9GeQo9ZI%?Qcn_Bp%@#~#| z>+w&n^cKF9wPZ*8N~dr=M>TzCCWONQQ|O^=2A+6qhRf(+!lK?d`vCJt%$r(K1l|#v zWa?f=uX|lsW>o7{raAgKroGyG_4jc181FUhwWu1QLDd^r7k)y!pWAPI!gA35ZT`8) z5A;7UX{|&v%zbU5mAXu5`-{1QfbtThUHX7m9>tWYrIQ;w@I^I zvz@!yx;?Nhe6MQ1{rm8Jm2#2pdn&RG%KL&{Zzxk2;N&3s4f?&BM(Uu;R&Joht$M;m zWtd&AI6==~%Q4RH5e#bIzaRy>+^BOz3pR*ad&w?S(4rvO$EnTiJexP*S8I)B1(K#s zR5r&uFA-()scCIqBu!jI-Aqo7b&!Bp=}W|DGcz`6~L@)CuY{rWa|E1Klg|Ds`dyGx{^N>`CrXg+KwT{103BN4k#de%hX(d7p_f4Fbo4?7PoU$OJH zj*i=IV|qIdt=RX&AMRUmsN)W?1|Q;Hy}1vmjHoZF5IhJVBdKu^joEWGeS`$zJVF)8 zUTz{WKShn1WCnLtJ%Uj^mB}{jf>)XKf8E9mi=0>PB7GjeGZ*r~CgC+TqxQNOmlsns zO3ETbO4`gIC2LS1rJPf{RB}#Z*UCA)O(*A!HXUm)*>tqoYSU2`hh0lqoGuk*al2Hs z*<;tzX0Kh#8hkDlYf!md8KgAhX{WW@Gd7*sX44srMz7cBV;D9gmn#%%wML`YbF5CQ zRjHJSmdV_1kH=&(XDk-0)!}eDDZ&T3@B(i`DvOzj3k1ERjQDM(IGQWfv9w4~72!%A z6N074e#CZ{_DF`f*!Wd|VPv=rkc0{lgem_=b=oFLnHIxVJB zP;4FLz^mrmv1J6X`Bz*^UQ$YN|W1qRV!--}ij_!@n-uvn>0I6U{d zNo$c(V^&i-pqtgoQ92@M)hcAf>J(%hJ|e@lFj$b{O)xUoMFEp{iD{)1>|cQw50-ei186y9ia7l`|lmI!Y&W|E&F zLL9NoS)^Pq)?YZLGfhPh-T4N&7xxbL4iXJZh_5{i4NCl?cw-u0sML!d9fH!}&QNxo z;M@G+C^0!l7;Sa<{pCRXp5;M<-vZJGrVUsAg`ytoUQ*@`(xxmWoc(s(ZKan4+g1bT zx^klbVI=K3$}Yr|TP<{-Ml*>IZb8{h@|vE)1hWEET6IcYI|t@y`?cH9Ui2h9sXZ`r z6kgGcYERXU%)Ek(2WEmiX-n3^EbZddlG>YKT~dK`wY7M<)FzXugkBDEtwP*q)EWpR zcu(YpKxJ)}r;-K6!*aaGazoI^lc1vd3aChxdn(>aK`QxXEhG!{wPt)5K$3|^LZ>zB zbXruaB@1_RFe65+svqyUh znOY)Ru{$I^#o*)?vmad>2*F5RvVu_monO*POww)F>Lv2zn<(8AjV|-fo%rV@29c$c z0R=!lY2f~4?my4!=VLBPay)t|{Gw-0dF{lkhUg91cS`JytrJV8G5z0c!aTnQ{@fS0 zE~gB$7d=cjO}ubhg2$Au*IKv*_7-LzxT)+*b~k37-?1*c0`@O0jab!mILyShA;^6O zPs=#Uiq|Zcpv4SSRtgn;RcVo#3>7WoF8@mAho^55E$M#?SMW;5Avd~>#BuZ>C-n&O zQV$>ZDDe!W9fH#^$EJSJd%#P1@x0ZT=Qxqz@Rgx+lAO?pVbDlMB}ICTPeW;lc3Sx= z3#`L4Wq(h$DkYw`M7xmRWC{0Z;-kz|Y)1%2qS2|K%5phNPgi7bD3V9ZQa8+PSy@u< z4m7M>+0d}^MmRn6jSt>f+IHj0IrHB8U`zI&S2l`gx=4h!Y_q%(KUo7>2K$9t1~@%u z<~&?rx$A|*O9_RK<4i`I(HWR^uZx}Q>UHgK(ce)t6c?l7Bx+a;YMI>;EpBLRLuY6M z0@^5;1zlGV8oLC!JIz_Za=W}M?ii&#g1+tHiV7c|(W?4$i*HWC890n*>1x3xdz?!` zGP!Ntc|Z@_|37f9r9_s5awAD@T+4g*8L5PdYmKsIiApLZMT^Q>S;~4PqWvn_6D=r7 z*;+)FXu-8do0}-{oBR3R-tYI%JpExg&b;Tm&h|KGX5Q1~E6*+^*IHET6n(yz*=b2Z z#q59rUhTl>W}Q3Ssqlyedwcee{xT`G-@xdeVVjNe8tc;xCww+-9vRZBLM!KKIZxa= zblqX%`+3v4RZeU;p1E?dL-6F(fzTNri4hh}&n?C93MkF4qXPr(tf6^bS z*Q9T=>02NBh6UG8xK1C&)r~olt$KJ{O`iy|$EGg{-uGUH%-i>)Lw>~FE(g4##!(u& z2^&LGwpqJ63^V9;K7UX4#G(1*fs6Mvnr=mu>TOSscM`kh0;|d0F2waJdvs&Q*IAp6 zZKygJFs3DPO4;|S+?Dgxx_?>xrXceCtFoq)v=z*ftMi`)wm+q^d&Q4`UcO)4^1|M6 zj@i2pHJO_%-6q*s7nZn%ZJm<*DEQQ|neW0gruS}5b$*dmNt!fvo7iKM_M8nzR%Prn zjyS4*E8E`mW>%*STaQM#1~!`Rb}Syao@@E&e%krOJQG`!r|#P2{Oa!qZaDIh2S<-Q zS^24Kf_Yxe+e1}eOwe^7XCu$-ziMy9(;GdS-Es`Q%WO*nM;c~VZ|&f7!Tx!-kK=sq z9t}NyYwPd*gDi4}XLjDRb@zuIHwSx93!dPtnQAiQ_WpX?x|?H{X#Q%U_a!b><;|U$ zTW0wNMQiO^NZY*AIg&Kp?slKzYtu{CY>l|oNq_%mw@00$??h(Von!+R1Zu|X1bnY7 z>tmNTta9corq(jCsP$}938TF{H;iMSbtrOuzhPB%igB9n$#tXd&LQFh%_=S~Ppq~5 z`XRY_?cCM9$tCXBT^3BM**A4()x_S-Jz|gAd^;Z6Jh9b7`@)UX#Ly=TF5Z|F#5|o= z>RbG^-P#q;zP8JIl4W3OAFpn(@?pE++mp}zkyCaugHLlNrw55wp7m+a)fBlvE$dg){U)wY4@1nA4`(AwW zK6$m9?2^`D54zY?y=CU&55q>9#&vz*^Jd~3-YQ~-f9Yf$hwB4c?)l^&8>3>bd$r5< z$G6=>Mq0eBf0LGcE3)s4b07X{u<*ENbYn_v8LO?+F5c4P(yNAjJC1)$nD_9P8!6s% zhh|n*elK=s54bK&bEtfAV{ZB5g^OQy`SQx|$}P=q+Qafo9?zP6Y~TFWuFFoJH5xMG zOzf4WAAdLGdY9WqlMCk@d6(UyV$9j^>ytm^(&iE;HQUdP2l{6@R?T!7&z?72S$ipM zl1x~*u4nUvke;6X@9S#&O!B$ITRy#3SYOomF(|vhe))lO$r)$6KOE{^XY`Fr9Qb>4 z-wiv)6lT9S-9L7=|IkmqM{^1eUD>s4L66%>Ca*diEI7Dq=WJPS_1|l$%YKUwKA)*Z zMi}i~KQH9bJCCti;`8WNd!H&Q^-0#= zFu=Sn!KK6SX(`0Sgdv@an>>cR*dC#|G)2=Veo;!%yQ}})e(=R|uc2|qowN3gRhORI zrym?!HZ{&{f&IPTt*3kEUM%X=r+0O~A+Iu%YqOuuKax^9?OR5C>T}1tjy*;`NWZ2kvEIND>nNk4e_&?6s9@BihSLp+28tP zlI+<*bN^7AnwjlRxSS(hD%?(tiF>4?=hL;1%hba+9V7isoW9m-uF>l`>dsBOXq}Ez zZw9KF6vTxO`BdVv@9SG;^00_V&680bJ*SK}u?}!vqdR?N_JES0qaDxd)#yfqYjoJY zuWs}5L#a;L>(;(e_3-mP{H?PUyS(mKSI1lF#F_H_vp(7Abvn1sSLbBU-KU&7b)9I; z#!u;W&^RT_;b{C?pFlIe;LP-_%L(~K;)=AlXTLwI#$RF2o${kJzG7mR(R zaYSedx_a{UAsch9#{aGAe4E!R-rRnD@67ULqq+oaE^~67^LEwE8hzsF<(tb3Lf(gV zG_GnYtLnCOaDU$tw?j|d?!OD+i#F~J&UrIoV9^9$HTC@C?RMpNvT(kxYO&&+=GAk& z?$vWX!#6IkU!SMBeXx0-7PXjhGpC+&Q}db8e#fmkZ8gi`y1B%6&P>NV^pBgmL-Jov z-DxG9QNMHRhW0XVo%&Dhqn35m_t|#5Yn)+Hqpw-wZc1y{@CjDW*6NME{?dHOfbjFH zH)_x9u~p@Te%^|mW$iz&d+>4ZrfUoLHx1DZ`7I)GU&tZ-TUM_hyfm6T;IP`uc_TWl z8BwINW<=D$o5YBFL+9plbHb;Od9`zwb?~iKd(}0@Cr&RO;U2}MtSdS7#(i-*RqwUY zb5uk+f8w^r)Uw=9YSky=&yRm}M&n3qqIY0ZYeK1_^Rmiq z$L$t<-v8;2%aooA)!hm_dPVxxFAa~4_`n$sdm8Gtta7|gfa&2GHu2++jJ~?Iur!T0 z*1{&=cr!R%=YSsFFWMzdG)Sm zob7tLy}iV&$;<kMBz0K>d%`>Alx_9ajSox+gebL0? zpcOn3nd5rO;?!VgnT5sdjXMr+E?o3&Qi99GzFjV+4w)o84*NYb(Z(yREQ$Ceoh$C>jvQm;Uu76FXKfzive_lm-AOn0lF?0XtruU` z|7z)KH0sHjzV(G+>L1r9Mz1Z&o%Y!zN;4#+sX) zyfA(3rIzT~Z_oMdx{L1({AahlZO*P5izX|oe^yQS-`zKP+pZsK<@F~uY4qo$>Cr0m zlXv5aONCwWgx1)sO%7Xt&I6)Xg40x;*dIQ>Uf%0#os|KU>h+rPrR&{l{a2i)UQZum3X1 zPEUJqL+5XiFHDLw?!4L_w<^Ar%4xsrhIU|plU`t2#Qd-Am*80_WuLKYeD6Kef@anfOC5YR%EUJ)amv9oXJynQx=vpmWoS`6^D0h6WEj zmJRs6XM5$@gn;H5hDAGfb)0WiZ;;CK^dyTbVV`Q_7Hu;i=hf%xo2tdhhL0nxw`ruC z1nns4X1)0jEA8QyeUdb6Vx6tG+;bXwIEb7yZf(*)CdQ&P)G@vy=&tIR9gD>WBhI`{^O-#=WfdWl#H|()#iHhMLhOxvia> zM(jG7QS~Z+k8#ub1o4Nr=9OD!^yn4Y5>TT*A1`msaDQ2IbJe9a zPlM*ac>CqYy9tx$7wumB+ulnW^|ayV}k|wn_Wb?{m&> z8ldy6W54vA4vXvB_Xt!S*K>T&VAYAS?Uv0{^)TGrafn{0JXwc7Vl;2Z=nRk1NRH|6 z9Mkunthb|C=Z;BR{G2vgIBj-}nD&CdYU>o_d$;o^yY?ftny(%(BG}-pW_ZpTr;zUR z^s1gz%?&mEdUs! z*I(STV%F(vF^_GgWzF$7S=;pbK|sKXmf$(=6-iH?WOvREe-Ih$7qNCi#Z$k!;n`|) za{IsCbm44wzt|pbn;XxzXUChmZf>u&Rqt`Pg&RNQ{ZTdXN~l)C(kS~sJctpm{%M~Y zPX02%N^L=rOfzhIt;?IzeHS|qTt3RgJ7|9Ns^D1}x{EW9sqZ}3EB_v;L1nay9XnNT zz^KWxu-F}AN95Lp`9_$n^O`%*(WBKgu8-E!k@-GhOE2>It^r!^jZ6I*-NdIJ6+>-n z@*_Tsv0WVE@wl^X|K>|)n%6%and`9Gpk?(m)45}ad1>ulMNzd3@!fI_KO_EG7QBG`uG3-`$ZCi{`a>*Zi+M+ z_g|VKAHh(Pd?dk0(rB49A5968d@@3M4wi09QMXF zvXB%fsRNP)`8b09`Mfe2*>(Wbuf{^!r52ucz!#gmfQ#442>OVh&7 zagYonujjTpB^j2G{d`_Aj<(N}$04S*)s<2j)po3MTHAS*)7sidIjt=Y<+QdsRZeTG zE9JDddQnc3)V)kbfjH#tp>!+_;-EnsG>C%+anK+R8pJ_^IOP3axqKiF8ng!k;$T1= z@-d@y4*8f?P6Kf;APxq^!GQK)KpYH+g9UN0APyF^2MgMR1#z$-4i?10f;d5QlueS1L0P z+Cx5fD(3@n2p|smJgIc70OAlp90G_#0C5PQJp>Skd>&UWi!=^GCXGWx@4tCmaV#N| z#zDwUR?a7lLtHF?&y&VMp!I=F+OG&1h(m6VQdtNP2La-c8?SsUh(o?EQO*bAklU!7 z55z%$I7rYQ^0k!G=aC=|x#!CHKpZ4!4-&*7U4zI7;5h+2CxGV!1=@oGaZu9nK~NwL zamD$6YfPnhKz;gn4P5{pd;5h+2CxGV!@SFgi6Tovq zz6Vq4&%kp6cuoM%3E(*aJSTwX1n`^yo)f@xLXi4F0?$d{ISD)`f#;-5I?hSpIVqF+ zK?2W7;5i9ACxPcA@SFsmlfZLQzQn_0?$d{ISD)`f#)RfoCKbez;hCK zP6E#<;5h|6r-0`a@SFmkQ^0cycuoP&Dd0H;Jg0!?6!4q^o{JZ+C2dXt&nd7!rwFO% z6!4q^o>Rbc3V2Qd&ne(J1w5yK=M?aqlGsfPlzd)my9O^_rUsrRbcMZZ_9+bQ5V1w5yK=M>nVQ^0e@ z{XC`f0?#SnIR!kYfaetOoC2Oxz;gRbc3V2Qd&ne(J1w5yK=M?ZvTx<}@_@#m8 zH1M1Tp3}f{8hEaFenYA5f#)>voCcoLz;haSP6N*seOI|G((4Q~@LYUALRx>oa~gO~ z1J7yTISo9gf#}F_I?u^nnm#<@$$_zZGf#>1} zO6wkYP6N+rus^3ICNnfIkGHMNj2MVyu46d43vKzt@e4dxJU^rqFYufOp3}f{8hB32 z>sjd>z;haSP6N-yN|4qw@SFyo)4+2Yc&>QPNU6-gb8+V*Eer6R2AQPfJZHiFoCTh1e&Sg9W@@SFvnv%qr}c+LXPS>QPf zJZFLDEbyEKp0mJn7I@AA&spF(3p{6m=PdA?m0O|IuYl()@SFvnv%qu3br7X<0MA+A zIV<-_`B>?Cmj#})z;nfSl9WCVc+LXPS>QPfJZFLDEZCp365~aa!Ty{D_s?00`!X2^ z_UD|$_Lk;5i38 z=YZ!N@SFqta}IdU0na($IS2OV9Ppe2o^!x+4tUN1&pF^Z2R!G1=N#~y1DLk;5i38 z=YZ!N@SFplb6|hY0na($IR`xFfae_WoCBV7z;h0G&H>Lk;5i38=YZ!N@SFplbHH;B zc+LUOIp8@5Jm-Mt9Ppe2o^xP-&H>Lk;5i38=fM7)1DLk;5i38SKKF2E}wM0%K^`M;5iRG=Yi)u@SF#pE51{$C?5|z=Yi)u@SF#p^T2Z+ zc+LaQdEhw@_UAnCoClusz;hmW&I8YR;5iRG=Yi*nYd1>u3_Rz7=REM72cGl5a~^ok z1J8NjIS)MNf#*E%oClusz;hmW&I8YRus`R4=REM72cGl5a~^ok1J8NjIS)MNf#*E% zoClusz;ner8m^=JQslH0`Ob_o(sTp0eCI|&jsMQAhBD# z(m_LuV>}*N!RTH z@LT|%3&3*$?9T<@xd1#Dfae16TmYU6z;gk3E&$I3us;`o=K}Ct0Gm^=JQw8ivr-)Z&jsMQ06Z6f=K}Ctka{k@PDb+lm6#@ZzC=uu zTyGcCB=| zo{RZF98%B4d>{^~=i+O7KpYa|#b~9Ti)o-eq@IiUKzm3%7xRJkknYdLe4ss~`*ZR2 zL!e(tJs0zVIHaD7`9K^}&&7No4yos2J`ji0b3**0!_R95G3}>*Al8aZK9|VXG^Ao( ztdu4nt8HoG6SMMuDqs7E=Kyg?_vd0h5Qo%r@ikA9IR1S-&;K8r_#zsad>plvPkdrl zK7PeCuQhfnT^-h_tBoD2t~Pq|#6b(kGL8(pOnlhP!QR215Wk!+P|IZ`Z7+VURInEu z3D#uLSklgsC6~(x2a>XvIZ%$v?H$C?{_pS9vSrI0?MxQ^`(bX5?t{dt9W+b)$1Hbu uuR&s&|M!pCEBze)d#|O5iMpDnm)#n#|9jn~`0f(%^1Zs6fr0r9i~k3~@D-N; literal 0 HcmV?d00001 From 37f1e03ebcd5356e0f0b403a5c0cdd20fc133997 Mon Sep 17 00:00:00 2001 From: Kilian Schuettler Date: Fri, 10 Feb 2023 14:49:10 +0100 Subject: [PATCH 6/6] RED-6126: performance-test *refactor to improve cleanness *closed inputStream --- .../ImagePositionRetrievalService.java | 24 ++++-- .../ocr/v1/server/service/OCRService.java | 78 +++++++++++++------ .../v1/server/service/OcrMessageReceiver.java | 12 +-- .../v1/server/OcrServiceIntegrationTest.java | 36 +++++---- 4 files changed, 99 insertions(+), 51 deletions(-) diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalService.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalService.java index a6c8a0e..ae251a1 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalService.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalService.java @@ -101,18 +101,13 @@ public class ImagePositionRetrievalService { // Sometimes images are split up into stripes, here we merge the positions of aligned and intersecting rectangles into one larger rectangle private void mergeRectangleList(List rectangleList) { - int idx = 0; - while (rectangleList.size() >= idx + 2) { + for (int idx = 0; rectangleList.size() >= idx + 2; ) { var rect1 = rectangleList.get(idx); var rect2 = rectangleList.get(idx + 1); - boolean isAlignedX = Math.abs(rect1.getMinX() - rect2.getMinX()) < TOLERANCE && Math.abs(rect1.getMaxX() - rect2.getMaxX()) < TOLERANCE; - boolean isAlignedY = Math.abs(rect1.getMinY() - rect2.getMinY()) < TOLERANCE && Math.abs(rect1.getMaxY() - rect2.getMaxY()) < TOLERANCE; - boolean intersects = rect1.intersects(rect2.getMinX() - TOLERANCE, rect2.getMinY() - TOLERANCE, rect2.getWidth() + (2 * TOLERANCE), rect2.getHeight() + (2 * TOLERANCE)); - - if (intersects && (isAlignedX || isAlignedY)) { + if (intersects(rect1, rect2) && isAlignedXOrY(rect1, rect2)) { rectangleList.remove(idx + 1); rectangleList.remove(idx); rectangleList.add(idx, rect1.createUnion(rect2)); @@ -123,6 +118,21 @@ public class ImagePositionRetrievalService { } + private boolean intersects(Rectangle2D rect1, Rectangle2D rect2) { + + return rect1.intersects(rect2.getMinX() - TOLERANCE, rect2.getMinY() - TOLERANCE, rect2.getWidth() + (2 * TOLERANCE), rect2.getHeight() + (2 * TOLERANCE)); + } + + + private boolean isAlignedXOrY(Rectangle2D rect1, Rectangle2D rect2) { + + boolean isAlignedX = Math.abs(rect1.getMinX() - rect2.getMinX()) < TOLERANCE && Math.abs(rect1.getMaxX() - rect2.getMaxX()) < TOLERANCE; + boolean isAlignedY = Math.abs(rect1.getMinY() - rect2.getMinY()) < TOLERANCE && Math.abs(rect1.getMaxY() - rect2.getMaxY()) < TOLERANCE; + + return isAlignedX || isAlignedY; + } + + private Rect toRotationAdjustedRect(Rect bbox, Page page, boolean mirrorY) throws PDFNetException { int rotation = page.getRotation(); diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java index 7901ca3..c1cb635 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OCRService.java @@ -90,36 +90,26 @@ public class OCRService { Map pageIdToRectCollection = imagePositionRetrievalService.getImagePositionPerPage(pdfDoc, true); + // Optimization: + // When a page does not have a TextZone, PDFTron whites out the page. But, PDFTron scans it anyway, resulting in a longer runtime. + // So, we need to remove pages without images. + // Furthermore, creating a new document is *much* faster than reusing the same document and adding/removing pages one by one. + // Therefore, we create a new Document with a single page for every page that contains text. int numProcessedPages = 0; - // optimization: only scanning pages that contain images for (Integer pageId : pageIdToRectCollection.keySet()) { try { - // optimization: creating a new document is faster than reusing the same and adding/removing pages one by one - OCROptions options = new OCROptions(); - PDFDoc ocrPageDoc = new PDFDoc(); - Page pdfPage = pdfDoc.getPage(pageId); - // optimization: this line ensures the ocr text is placed correctly by PDFTron - pdfPage.setMediaBox(pdfPage.getCropBox()); - ocrPageDoc.pagePushBack(pdfPage); - options.addTextZonesForPage(pageIdToRectCollection.get(pageId), 1); - options.addLang(ENGLISH); - options.addDPI(settings.getOcrDPI()); - - OCRModule.processPDF(ocrPageDoc, options); + PDFDoc singlePagePdfDoc = extractSinglePagePdfDoc(pdfDoc, pageId); + processOcr(pageIdToRectCollection, pageId, singlePagePdfDoc); ++numProcessedPages; - StringBuilder zonesString = new StringBuilder(); - for (int j = 0; j < pageIdToRectCollection.get(pageId).getNumRects(); ++j) { - var r = pageIdToRectCollection.get(pageId).getRectAt(j); - zonesString.append(format("[lower left (%.1f|%.1f) upper right (%.1f|%.1f)]", r.getX1(), r.getY1(), r.getX2(), r.getY2())); - } - log.info("{}/{} Page {} done, OCR regions {}", numProcessedPages, pageIdToRectCollection.size(), pageId, zonesString); + log.info("{}/{} Page {} done, OCR regions {}", + numProcessedPages, + pageIdToRectCollection.size(), + pageId, + getAllOcrTextZonesAsString(pageIdToRectCollection, pageId)); - // re-adding OCR pages - Page ocrPage = ocrPageDoc.getPage(1); - pdfDoc.pageInsert(pdfDoc.getPageIterator(pageId), ocrPage); - pdfDoc.pageRemove(pdfDoc.getPageIterator(pageId + 1)); - ocrPageDoc.close(); + replaceOriginalPageWithOcrPage(pdfDoc, pageId, singlePagePdfDoc); + singlePagePdfDoc.close(); rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_STATUS_UPDATE_RESPONSE_QUEUE, objectMapper.writeValueAsString(OCRStatusUpdateResponse.builder() @@ -151,4 +141,44 @@ public class OCRService { } } + + private void processOcr(Map pageIdToRectCollection, Integer pageId, PDFDoc singlePagePdfDoc) throws PDFNetException { + + OCROptions options = new OCROptions(); + options.addTextZonesForPage(pageIdToRectCollection.get(pageId), 1); + options.addLang(ENGLISH); + options.addDPI(settings.getOcrDPI()); + + OCRModule.processPDF(singlePagePdfDoc, options); + } + + + private static PDFDoc extractSinglePagePdfDoc(PDFDoc pdfDoc, Integer pageId) throws PDFNetException { + + PDFDoc singlePagePdfDoc = new PDFDoc(); + Page page = pdfDoc.getPage(pageId); + page.setMediaBox(page.getCropBox()); // this line ensures the ocr text is placed correctly by PDFTron, see TestFile MediaBoxBiggerThanCropBox.pdf + singlePagePdfDoc.pagePushBack(page); + return singlePagePdfDoc; + } + + + private static void replaceOriginalPageWithOcrPage(PDFDoc pdfDoc, Integer pageId, PDFDoc ocrPageDoc) throws PDFNetException { + + Page ocrPage = ocrPageDoc.getPage(1); + pdfDoc.pageInsert(pdfDoc.getPageIterator(pageId), ocrPage); + pdfDoc.pageRemove(pdfDoc.getPageIterator(pageId + 1)); + } + + + private static StringBuilder getAllOcrTextZonesAsString(Map pageIdToRectCollection, Integer pageId) throws PDFNetException { + + StringBuilder zonesString = new StringBuilder(); + for (int j = 0; j < pageIdToRectCollection.get(pageId).getNumRects(); ++j) { + var r = pageIdToRectCollection.get(pageId).getRectAt(j); + zonesString.append(format("[lower left (%.1f|%.1f) upper right (%.1f|%.1f)]", r.getX1(), r.getY1(), r.getX2(), r.getY2())); + } + return zonesString; + } + } diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java index 7ddbdf4..1683ae1 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/OcrMessageReceiver.java @@ -31,13 +31,13 @@ public class OcrMessageReceiver { private final OCRService ocrService; + @RabbitHandler @RabbitListener(queues = MessagingConfiguration.OCR_QUEUE, concurrency = "1") public void receiveOcr(String in) throws JsonProcessingException { DocumentRequest ocrRequestMessage = objectMapper.readValue(in, DocumentRequest.class); - log.info("Start ocr for file with dossierId {} and fileId {}", ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId()); setStatusOcrProcessing(ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId()); @@ -47,16 +47,16 @@ public class OcrMessageReceiver { fileStorageService.storeUntouchedFile(ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId(), originalFile); } - try (var out = new ByteArrayOutputStream()) { - ocrService.runOcrOnDocument(ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId(), out); - - fileStorageService.storeOriginalFile(ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId(), new ByteArrayInputStream(out.toByteArray())); + try (var transferStream = new ByteArrayOutputStream()) { + ocrService.runOcrOnDocument(ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId(), transferStream); + try (var inputStream = new ByteArrayInputStream(transferStream.toByteArray())) { + fileStorageService.storeOriginalFile(ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId(), inputStream); + } } catch (IOException e) { log.error("Failed to store file with dossierId {} and fileId {}", ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId()); throw new RuntimeException(e); } - fileStatusProcessingUpdateClient.ocrSuccessful(ocrRequestMessage.getDossierId(), ocrRequestMessage.getFileId()); } diff --git a/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/OcrServiceIntegrationTest.java b/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/OcrServiceIntegrationTest.java index b21a331..cbd57ff 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/OcrServiceIntegrationTest.java +++ b/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/OcrServiceIntegrationTest.java @@ -5,12 +5,12 @@ import static org.assertj.core.api.Assertions.assertThat; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; -import io.micrometer.prometheus.PrometheusMeterRegistry; -import io.micrometer.prometheus.PrometheusTimer; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; @@ -36,12 +36,15 @@ import com.iqser.red.service.ocr.v1.server.utils.FileSystemBackedStorageService; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; +import com.pdftron.common.PDFNetException; import com.pdftron.pdf.OCRModule; import com.pdftron.pdf.PDFDoc; import com.pdftron.pdf.Page; import com.pdftron.pdf.PageIterator; import com.pdftron.pdf.TextExtractor; +import io.micrometer.prometheus.PrometheusMeterRegistry; +import io.micrometer.prometheus.PrometheusTimer; import lombok.SneakyThrows; @ExtendWith(SpringExtension.class) @@ -80,19 +83,20 @@ public class OcrServiceIntegrationTest { @Test @Disabled // OCRModule is not available on build server. If you want to run the test set the property at the top. - public void testOCRMetrics(){ + public void testOCRMetrics() { + testOCR("Watermark"); testOCR("Watermark"); testOCR("Watermark"); - var ocrOnDocumentMeter = registry.getMeters().stream() - .filter(m -> m.getId().getName().equalsIgnoreCase("redactmanager_runOcrOnDocument")).findAny(); + var ocrOnDocumentMeter = registry.getMeters().stream().filter(m -> m.getId().getName().equalsIgnoreCase("redactmanager_runOcrOnDocument")).findAny(); assertThat(ocrOnDocumentMeter.isPresent()).isTrue(); PrometheusTimer timer = (PrometheusTimer) ocrOnDocumentMeter.get(); assertThat(timer.count()).isEqualTo(3); assertThat(timer.mean(TimeUnit.SECONDS)).isGreaterThan(0.1); } + @Test @Disabled // OCRModule is not available on build server. If you want to run the test set the property at the top. public void testOcr() { @@ -153,30 +157,34 @@ public class OcrServiceIntegrationTest { private String testOCR(String fileName) { ClassPathResource pdfFileResource = new ClassPathResource("files/" + fileName + ".pdf"); - var originId = FileStorageService.getStorageId("dossier", "file", FileType.ORIGIN); try (var fileStream = pdfFileResource.getInputStream()) { storageService.storeObject(originId, fileStream); } - try (var out = new FileOutputStream(getTemporaryDirectory() + "/" + fileName + ".pdf")) { ocrService.runOcrOnDocument("dossier", "file", out); } + System.out.println("File:" + getTemporaryDirectory() + "/" + fileName + ".pdf"); + try (var fileStream = new FileInputStream(getTemporaryDirectory() + "/" + fileName + ".pdf")) { + return extractAllTextFromDocument(fileStream); + } + } + + + private static String extractAllTextFromDocument(InputStream fileStream) throws IOException, PDFNetException { + + PDFDoc pdfDoc = new PDFDoc(fileStream); TextExtractor extractor = new TextExtractor(); List texts = new ArrayList<>(); - PDFDoc pdfDoc; - try (var fileStream = new FileInputStream(getTemporaryDirectory() + "/" + fileName + ".pdf")) { - pdfDoc = new PDFDoc(fileStream); - } PageIterator iterator = pdfDoc.getPageIterator(); while (iterator.hasNext()) { Page page = iterator.next(); extractor.begin(page); texts.add(extractor.getAsText()); } - System.out.println("File:" + getTemporaryDirectory() + "/" + fileName + ".pdf"); + return String.join("\n", texts); } @@ -184,7 +192,7 @@ public class OcrServiceIntegrationTest { @SneakyThrows public void dummyTest() { - // Build needs one text to not fail. + // Build needs one test to not fail. assertThat(1).isEqualTo(1); } @@ -204,7 +212,7 @@ public class OcrServiceIntegrationTest { @Bean @Primary - public StorageService inmemoryStorage() { + public StorageService inMemoryStorage() { return new FileSystemBackedStorageService(); }