From 3fef97ee5b6448ed9239a7cc129fc38454945613 Mon Sep 17 00:00:00 2001 From: leebeomjun Date: Tue, 25 Jul 2023 13:23:37 +0900 Subject: [PATCH] =?UTF-8?q?=ED=95=9C=EA=B8=80=ED=8C=8C=EC=9D=BC=EC=97=90?= =?UTF-8?q?=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=B2=A8=EB=B6=80=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hwp/AddingParagraphBetweenHWPFile.java | 23 ++ .../xit/fims/cmmn/hwp/InsertingImageCell.java | 253 ++++++++++++++++++ .../crdn/service/bean/Crdn01ServiceBean.java | 62 +++-- .../xit/fims/crdn/web/Crdn01Controller.java | 5 +- .../resources/format/cvlcptOrgnl_photo.hwp | Bin 0 -> 15360 bytes .../{cvlcptOrgnl.hwp => cvlcptOrgnl_text.hwp} | Bin 21504 -> 20992 bytes 6 files changed, 322 insertions(+), 21 deletions(-) create mode 100644 src/main/java/cokr/xit/fims/cmmn/hwp/AddingParagraphBetweenHWPFile.java create mode 100644 src/main/java/cokr/xit/fims/cmmn/hwp/InsertingImageCell.java create mode 100644 src/main/webapp/resources/format/cvlcptOrgnl_photo.hwp rename src/main/webapp/resources/format/{cvlcptOrgnl.hwp => cvlcptOrgnl_text.hwp} (75%) diff --git a/src/main/java/cokr/xit/fims/cmmn/hwp/AddingParagraphBetweenHWPFile.java b/src/main/java/cokr/xit/fims/cmmn/hwp/AddingParagraphBetweenHWPFile.java new file mode 100644 index 00000000..d8cc0f98 --- /dev/null +++ b/src/main/java/cokr/xit/fims/cmmn/hwp/AddingParagraphBetweenHWPFile.java @@ -0,0 +1,23 @@ +package cokr.xit.fims.cmmn.hwp; +import kr.dogfoot.hwplib.object.HWPFile; +import kr.dogfoot.hwplib.object.bodytext.ParagraphListInterface; +import kr.dogfoot.hwplib.object.bodytext.paragraph.Paragraph; +import kr.dogfoot.hwplib.tool.paragraphadder.ParagraphAdder; + +public class AddingParagraphBetweenHWPFile { + public static void fileMerge(HWPFile sourceHWPFile, HWPFile targetHWPFile) throws Exception { + + if (sourceHWPFile != null && targetHWPFile != null) { + + ParagraphListInterface targetFirstSection = targetHWPFile.getBodyText().getSectionList().get(0); + + Paragraph sourceParagraph = sourceHWPFile.getBodyText().getSectionList().get(0).getParagraph(0); + + ParagraphAdder paraAdder = new ParagraphAdder(targetHWPFile, targetFirstSection); + paraAdder.add(sourceHWPFile, sourceParagraph); + + + + } + } +} diff --git a/src/main/java/cokr/xit/fims/cmmn/hwp/InsertingImageCell.java b/src/main/java/cokr/xit/fims/cmmn/hwp/InsertingImageCell.java new file mode 100644 index 00000000..90034080 --- /dev/null +++ b/src/main/java/cokr/xit/fims/cmmn/hwp/InsertingImageCell.java @@ -0,0 +1,253 @@ +package cokr.xit.fims.cmmn.hwp; + +import java.awt.Rectangle; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; + +import kr.dogfoot.hwplib.object.HWPFile; +import kr.dogfoot.hwplib.object.bodytext.control.ctrlheader.CtrlHeaderGso; +import kr.dogfoot.hwplib.object.bodytext.control.ctrlheader.gso.GsoHeaderProperty; +import kr.dogfoot.hwplib.object.bodytext.control.ctrlheader.gso.HeightCriterion; +import kr.dogfoot.hwplib.object.bodytext.control.ctrlheader.gso.HorzRelTo; +import kr.dogfoot.hwplib.object.bodytext.control.ctrlheader.gso.ObjectNumberSort; +import kr.dogfoot.hwplib.object.bodytext.control.ctrlheader.gso.RelativeArrange; +import kr.dogfoot.hwplib.object.bodytext.control.ctrlheader.gso.TextFlowMethod; +import kr.dogfoot.hwplib.object.bodytext.control.ctrlheader.gso.TextHorzArrange; +import kr.dogfoot.hwplib.object.bodytext.control.ctrlheader.gso.VertRelTo; +import kr.dogfoot.hwplib.object.bodytext.control.ctrlheader.gso.WidthCriterion; +import kr.dogfoot.hwplib.object.bodytext.control.gso.ControlRectangle; +import kr.dogfoot.hwplib.object.bodytext.control.gso.GsoControlType; +import kr.dogfoot.hwplib.object.bodytext.control.gso.shapecomponent.ShapeComponentNormal; +import kr.dogfoot.hwplib.object.bodytext.control.gso.shapecomponent.lineinfo.LineArrowShape; +import kr.dogfoot.hwplib.object.bodytext.control.gso.shapecomponent.lineinfo.LineArrowSize; +import kr.dogfoot.hwplib.object.bodytext.control.gso.shapecomponent.lineinfo.LineEndShape; +import kr.dogfoot.hwplib.object.bodytext.control.gso.shapecomponent.lineinfo.LineInfo; +import kr.dogfoot.hwplib.object.bodytext.control.gso.shapecomponent.lineinfo.LineType; +import kr.dogfoot.hwplib.object.bodytext.control.gso.shapecomponent.lineinfo.OutlineStyle; +import kr.dogfoot.hwplib.object.bodytext.control.gso.shapecomponent.shadowinfo.ShadowInfo; +import kr.dogfoot.hwplib.object.bodytext.control.gso.shapecomponent.shadowinfo.ShadowType; +import kr.dogfoot.hwplib.object.bodytext.control.gso.shapecomponenteach.ShapeComponentRectangle; +import kr.dogfoot.hwplib.object.bodytext.control.table.Cell; +import kr.dogfoot.hwplib.object.bodytext.paragraph.Paragraph; +import kr.dogfoot.hwplib.object.bodytext.paragraph.text.ParaText; +import kr.dogfoot.hwplib.object.docinfo.BinData; +import kr.dogfoot.hwplib.object.docinfo.bindata.BinDataCompress; +import kr.dogfoot.hwplib.object.docinfo.bindata.BinDataState; +import kr.dogfoot.hwplib.object.docinfo.bindata.BinDataType; +import kr.dogfoot.hwplib.object.docinfo.borderfill.fillinfo.FillInfo; +import kr.dogfoot.hwplib.object.docinfo.borderfill.fillinfo.ImageFill; +import kr.dogfoot.hwplib.object.docinfo.borderfill.fillinfo.ImageFillType; +import kr.dogfoot.hwplib.object.docinfo.borderfill.fillinfo.PictureEffect; +import kr.dogfoot.hwplib.tool.objectfinder.CellFinder; + +public class InsertingImageCell { + + public static void IMPL_InsertPicture(HWPFile hwpFile, String fieldName, String imgFilePath) throws IOException { + InsertingImageCell tii = new InsertingImageCell(); + tii.insertShapeWithImage(hwpFile, fieldName, imgFilePath); + } + + private final String imageFileExt = "jpg"; + private final BinDataCompress compressMethod = BinDataCompress.ByStorageDefault; + + private int instanceID = 0x5bb840e1; + private HWPFile hwpFile; + private String imageFilePath; + private String fieldName; + private int streamIndex; + private int binDataID; + + private ControlRectangle rectangle; + private Rectangle shapePosition = new Rectangle(1, 1, 20, 20); + + + private void insertShapeWithImage(HWPFile hwpFile, String fieldName, String imgFilePath) throws IOException { + this.hwpFile = hwpFile; + this.fieldName = fieldName; + this.imageFilePath = imgFilePath; + + addBinData(); + binDataID = addBinDataInDocInfo(streamIndex); + addGsoControl(); + } + + private void addBinData() throws IOException { + streamIndex = hwpFile.getBinData().getEmbeddedBinaryDataList().size() + 1; + String streamName = getStreamName(); + byte[] fileBinary = loadFile(); + + hwpFile.getBinData().addNewEmbeddedBinaryData(streamName, fileBinary, compressMethod); + } + + private String getStreamName() { + return "Bin" + String.format("%04X", streamIndex) + "." + imageFileExt; + } + + private byte[] loadFile() throws IOException { + File file = new File(imageFilePath); + byte[] buffer = new byte[(int) file.length()]; + InputStream ios = null; + try { + ios = new FileInputStream(file); + ios.read(buffer); + } finally { + try { + if (ios != null) + ios.close(); + } catch (IOException e) { + } + } + return buffer; + } + + private int addBinDataInDocInfo(int streamIndex) { + BinData bd = new BinData(); + bd.getProperty().setType(BinDataType.Embedding); + bd.getProperty().setCompress(compressMethod); + bd.getProperty().setState(BinDataState.NotAccess); + bd.setBinDataID(streamIndex); + bd.setExtensionForEmbedding(imageFileExt); + hwpFile.getDocInfo().getBinDataList().add(bd); + return hwpFile.getDocInfo().getBinDataList().size(); + } + + private void addGsoControl() { + createRectangleControlAtCell(); + + setCtrlHeaderGso(); + setShapeComponent(); + setShapeComponentRectangle(); + } + + private void createRectangleControlAtCell() { + ArrayList cellList = CellFinder.findAll(hwpFile, fieldName); + for (Cell c : cellList) { + + int cellWidth = (int)c.getListHeader().getWidth(); + int cellHeight = (int)c.getListHeader().getHeight(); + shapePosition = new Rectangle(1, 1, cellWidth, cellHeight); + + Paragraph firstPara = c.getParagraphList().getParagraph(0); + ParaText paraText = firstPara.getText(); + if (paraText == null) { + firstPara.createText(); + paraText = firstPara.getText(); + } + + // 문단에서 사각형 컨트롤의 위치를 표현하기 위한 확장 문자를 넣는다. + paraText.addExtendCharForGSO(); + + // 문단에 사각형 컨트롤 추가한다. + rectangle = (ControlRectangle) firstPara.addNewGsoControl(GsoControlType.Rectangle); + break; + } + } + + private void setCtrlHeaderGso() { + CtrlHeaderGso hdr = rectangle.getHeader(); + GsoHeaderProperty prop = hdr.getProperty(); + prop.setLikeWord(false); + prop.setApplyLineSpace(false); + prop.setVertRelTo(VertRelTo.Para); + prop.setVertRelativeArrange(RelativeArrange.TopOrLeft); + prop.setHorzRelTo(HorzRelTo.Para); + prop.setHorzRelativeArrange(RelativeArrange.TopOrLeft); + prop.setVertRelToParaLimit(true); + prop.setAllowOverlap(true); + prop.setWidthCriterion(WidthCriterion.Absolute); + prop.setHeightCriterion(HeightCriterion.Absolute); + prop.setProtectSize(false); + prop.setTextFlowMethod(TextFlowMethod.FitWithText); + prop.setTextHorzArrange(TextHorzArrange.BothSides); + prop.setObjectNumberSort(ObjectNumberSort.Figure); + + hdr.setyOffset(shapePosition.y); + hdr.setxOffset(shapePosition.x); + hdr.setWidth(shapePosition.width); + hdr.setHeight(shapePosition.height); + hdr.setzOrder(0); + hdr.setOutterMarginLeft(0); + hdr.setOutterMarginRight(0); + hdr.setOutterMarginTop(0); + hdr.setOutterMarginBottom(0); + hdr.setInstanceId(instanceID); + hdr.setPreventPageDivide(false); + hdr.getExplanation().setBytes(null); + } + + private int fromMM(int mm) { + if (mm == 0) { + return 1; + } + + return (int) ((double) mm * 72000.0f / 254.0f + 0.5f); + } + + private void setShapeComponent() { + ShapeComponentNormal sc = (ShapeComponentNormal) rectangle.getShapeComponent(); + sc.setOffsetX(0); + sc.setOffsetY(0); + sc.setGroupingCount(0); + sc.setLocalFileVersion(1); + sc.setWidthAtCreate(shapePosition.width); + sc.setHeightAtCreate(shapePosition.height); + sc.setWidthAtCurrent(shapePosition.width); + sc.setHeightAtCurrent(shapePosition.height); + sc.setRotateAngle(0); + sc.setRotateXCenter((shapePosition.width / 2)); + sc.setRotateYCenter((shapePosition.height / 2)); + + sc.createLineInfo(); + LineInfo li = sc.getLineInfo(); + li.getProperty().setLineEndShape(LineEndShape.Flat); + li.getProperty().setStartArrowShape(LineArrowShape.None); + li.getProperty().setStartArrowSize(LineArrowSize.MiddleMiddle); + li.getProperty().setEndArrowShape(LineArrowShape.None); + li.getProperty().setEndArrowSize(LineArrowSize.MiddleMiddle); + li.getProperty().setFillStartArrow(true); + li.getProperty().setFillEndArrow(true); + li.getProperty().setLineType(LineType.None); + li.setOutlineStyle(OutlineStyle.Normal); + li.setThickness(0); + li.getColor().setValue(0); + + sc.createFillInfo(); + FillInfo fi = sc.getFillInfo(); + fi.getType().setPatternFill(false); + fi.getType().setImageFill(true); + fi.getType().setGradientFill(false); + fi.createImageFill(); + ImageFill imgF = fi.getImageFill(); + imgF.setImageFillType(ImageFillType.FitSize); + imgF.getPictureInfo().setBrightness((byte) 0); + imgF.getPictureInfo().setContrast((byte) 0); + imgF.getPictureInfo().setEffect(PictureEffect.RealPicture); + imgF.getPictureInfo().setBinItemID(binDataID); + + sc.createShadowInfo(); + ShadowInfo si = sc.getShadowInfo(); + si.setType(ShadowType.None); + si.getColor().setValue(0xc4c4c4); + si.setOffsetX(283); + si.setOffsetY(283); + si.setTransparent((short) 0); + + sc.setMatrixsNormal(); + } + + private void setShapeComponentRectangle() { + ShapeComponentRectangle scr = rectangle.getShapeComponentRectangle(); + scr.setRoundRate((byte) 0); + scr.setX1(0); + scr.setY1(0); + scr.setX2(shapePosition.width); + scr.setY2(0); + scr.setX3(shapePosition.width); + scr.setY3(shapePosition.height); + scr.setX4(0); + scr.setY4(shapePosition.height); + } +} diff --git a/src/main/java/cokr/xit/fims/crdn/service/bean/Crdn01ServiceBean.java b/src/main/java/cokr/xit/fims/crdn/service/bean/Crdn01ServiceBean.java index c12a5388..f029cdb9 100644 --- a/src/main/java/cokr/xit/fims/crdn/service/bean/Crdn01ServiceBean.java +++ b/src/main/java/cokr/xit/fims/crdn/service/bean/Crdn01ServiceBean.java @@ -11,8 +11,12 @@ import javax.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.web.servlet.ModelAndView; -import cokr.xit.base.file.FileInfo; +import cokr.xit.base.file.service.FileQuery; +import cokr.xit.base.file.service.FileService; import cokr.xit.fims.cmmn.CmmnUtil; +import cokr.xit.fims.cmmn.hwp.AddingParagraphBetweenHWPFile; +import cokr.xit.fims.cmmn.hwp.InsertingImageCell; +import cokr.xit.fims.crdn.Crdn; import cokr.xit.fims.crdn.CrdnQuery; import cokr.xit.fims.crdn.dao.Crdn01Mapper; import cokr.xit.fims.crdn.service.CrdnService; @@ -29,6 +33,9 @@ import kr.dogfoot.hwplib.writer.HWPWriter; @Service("crdn01Service") public class Crdn01ServiceBean extends AbstractServiceBean implements CrdnService { + @Resource(name="fileService") + protected FileService fileService; + @Resource(name="crdn01Mapper") protected Crdn01Mapper crdn01Mapper; @@ -58,7 +65,7 @@ public class Crdn01ServiceBean extends AbstractServiceBean implements CrdnServic return crdn01Bean.removeCivilComplaint(crdnIDs); } - public ModelAndView makeFileFromHwpFormat(CrdnQuery crdnQuery, String formatFilePath) { + public ModelAndView makeFileFromHwpFormat(CrdnQuery crdnQuery, String baseFormatFilePath, String attachFormatFilePath) { crdnQuery.setView("hwp"); DataObject dataObject = crdn01Bean.getCivilComplaintOriginalInfo(crdnQuery); @@ -66,51 +73,67 @@ public class Crdn01ServiceBean extends AbstractServiceBean implements CrdnServic SimpleDateFormat ymdFormat = new SimpleDateFormat("yyyyMMdd"); SimpleDateFormat ymdHypenFormat = new SimpleDateFormat("yyyy-MM-dd"); - HWPFile hwpFile; try { - hwpFile = HWPReader.fromFile(formatFilePath); + HWPFile baseFormatFile = HWPReader.fromFile(baseFormatFilePath); ArrayList strings = new ArrayList(); strings.add(dataObject.string("CVLCPT_APLCNT_NM")); - FieldFinder.setClickHereText(hwpFile, "신청자", strings); + FieldFinder.setClickHereText(baseFormatFile, "신청자", strings); strings = new ArrayList(); String cvlcptRcptYmd = dataObject.string("CVLCPT_RCPT_YMD"); cvlcptRcptYmd = ymdHypenFormat.format(ymdFormat.parse(cvlcptRcptYmd)); strings.add(cvlcptRcptYmd); - FieldFinder.setClickHereText(hwpFile, "접수일자", strings); + FieldFinder.setClickHereText(baseFormatFile, "접수일자", strings); strings = new ArrayList(); String cvlcptRrcsPrnmntDt = dataObject.string("CVLCPT_PRCS_PRNMNT_DT"); cvlcptRrcsPrnmntDt = ymdHypenFormat.format(ymdFormat.parse(cvlcptRrcsPrnmntDt)); strings.add(cvlcptRrcsPrnmntDt); - FieldFinder.setClickHereText(hwpFile, "처리기한", strings); + FieldFinder.setClickHereText(baseFormatFile, "처리기한", strings); strings = new ArrayList(); strings.add(dataObject.string("CVLCPT_RCPT_NO")); - FieldFinder.setClickHereText(hwpFile, "접수번호", strings); + FieldFinder.setClickHereText(baseFormatFile, "접수번호", strings); strings = new ArrayList(); String cvlcptAplyCn = dataObject.string("CVLCPT_APLY_CN"); cvlcptAplyCn = CmmnUtil.escapeHTMLEntity(cvlcptAplyCn); strings.add(cvlcptAplyCn); - FieldFinder.setClickHereText(hwpFile, "민원내용", strings); - - //TODO : 사진삽입 + FieldFinder.setClickHereText(baseFormatFile, "민원내용", strings); String currentTime = ymdhmsFormat.format(new Date()); String resultPath = "files" + File.separator + "result" + File.separator + currentTime + ".hwp"; - HWPWriter.toFile(hwpFile, resultPath); + HWPWriter.toFile(baseFormatFile, resultPath); - FileInfo fileInfo = new FileInfo(); - fileInfo.setPath(resultPath); - fileInfo.setName(currentTime+".hwp"); - fileInfo.setMimeType("application/vnd.hancom.hwpx"); - fileInfo.setExtension("hwp"); - fileInfo.setSize(new File(resultPath).length()); + HWPFile resultFile = HWPReader.fromFile(resultPath); - String downlaodFileName = "민원내역원본_" + currentTime + ".hwp"; + FileQuery fileQuery = new FileQuery(); + fileQuery.setInfoType(Crdn.INF_TYPE); + fileQuery.setInfoKeys(crdnQuery.getCrdnId()); + List fileInfoList = fileService.getFileList(fileQuery); + + if(fileInfoList != null && fileInfoList.size() > 0) { + int photoCnt = fileInfoList.size(); + int PHOTO_COUNT_PER_PAGE = 4; + + for(int i=0; i < photoCnt; i += PHOTO_COUNT_PER_PAGE) { + HWPFile attachFormatFile = HWPReader.fromFile(attachFormatFilePath); + InsertingImageCell.IMPL_InsertPicture(attachFormatFile, "왼쪽위사진", fileInfoList.get(i).string("URL")); + if(i+1 < photoCnt) + InsertingImageCell.IMPL_InsertPicture(attachFormatFile, "오른쪽위사진", fileInfoList.get(i+1).string("URL")); + if(i+2 < photoCnt) + InsertingImageCell.IMPL_InsertPicture(attachFormatFile, "왼쪽아래사진", fileInfoList.get(i+2).string("URL")); + if(i+3 < photoCnt) + InsertingImageCell.IMPL_InsertPicture(attachFormatFile, "오른쪽아래사진", fileInfoList.get(i+3).string("URL")); + AddingParagraphBetweenHWPFile.fileMerge(attachFormatFile, resultFile); + } + HWPWriter.toFile(resultFile, resultPath); + } + + + String downlaodFileName = "민원내역원본_" + currentTime + ".hwp"; ModelAndView mav = new ModelAndView("jsonView"); mav.addObject("filePath", resultPath); mav.addObject("fileName", downlaodFileName); @@ -123,4 +146,5 @@ public class Crdn01ServiceBean extends AbstractServiceBean implements CrdnServic } + } diff --git a/src/main/java/cokr/xit/fims/crdn/web/Crdn01Controller.java b/src/main/java/cokr/xit/fims/crdn/web/Crdn01Controller.java index 8105ab25..3ddfe187 100644 --- a/src/main/java/cokr/xit/fims/crdn/web/Crdn01Controller.java +++ b/src/main/java/cokr/xit/fims/crdn/web/Crdn01Controller.java @@ -181,8 +181,9 @@ public class Crdn01Controller extends ApplicationController { @RequestMapping(name="민원내역 원본 한글 파일 생성", value="/050/makeFileFromHwpFormat.do") public ModelAndView makeFileFromHwpFormat(CrdnQuery crdnQuery, HttpServletRequest request) { - String formatFilePath = request.getServletContext().getRealPath("resources/format/cvlcptOrgnl.hwp"); + String baseFormatFilePath = request.getServletContext().getRealPath("resources/format/cvlcptOrgnl_text.hwp"); + String attachFormatFilePath = request.getServletContext().getRealPath("resources/format/cvlcptOrgnl_photo.hwp"); - return crdn01Service.makeFileFromHwpFormat(crdnQuery, formatFilePath); + return crdn01Service.makeFileFromHwpFormat(crdnQuery, baseFormatFilePath, attachFormatFilePath); } } diff --git a/src/main/webapp/resources/format/cvlcptOrgnl_photo.hwp b/src/main/webapp/resources/format/cvlcptOrgnl_photo.hwp new file mode 100644 index 0000000000000000000000000000000000000000..9c162ae2e48b92131b29ca5357baebd612ab3997 GIT binary patch literal 15360 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 S`}`Nat$6+m!#MPL68IM|6YL8B literal 0 HcmV?d00001 diff --git a/src/main/webapp/resources/format/cvlcptOrgnl.hwp b/src/main/webapp/resources/format/cvlcptOrgnl_text.hwp similarity index 75% rename from src/main/webapp/resources/format/cvlcptOrgnl.hwp rename to src/main/webapp/resources/format/cvlcptOrgnl_text.hwp index a20edc00d1ccbaa0d7548d9e06620b61c8268540..9e6ba1de57843d14fada4ee1fd8b455506d3a820 100644 GIT binary patch delta 2695 zcmZ8jXH=8f7X7{uOeleb8V3-hiV-P-6e*zyIuLO1WsUFn3L(R+G!x3RS49nV4w?UH6s8>5_o~TWTHZ^-?nk7-H*KN3- z_I%naQuK;&2YuJ&j-_v_f9fBfBwMP=9TQ6F*&a!|qH7`F1>bYKY2INrxAiEgQiCJ) zsZf1e#PzX4T$K1gcH0=7tr=QCCs5RfFV-YA|K_w-UQm0WG@5G@<=EFPCHLyptGZ43 znjB@v-B6#Vle&Pn-35Gs^3mz3s$Nh3wXvjZ*376#Apgrx7s!G*_choL?!oL4^O_u2 zqsHOJjc+y9Q~Tf7c*)lgJG(5G zuAcu_!!Dw;E4AllAm@6}U$baO^FUV4(7S{K!4;S=Mj<9_xH_dFGj;#OYvFJGUj72j zj=eFol3f2r#H?8IrAGxn+!Ha_Vk#yy@BZ zp1t;^FW+=tI?;zE;o@I1N&`CI$OP{mo+4+D270iHOA#LafwLh$m?ME*-zc^&n{P)Y zf}4sMLxy6vB9#NUL+|G(1MfX-Wqx)yqeSXuj6qW{8G*Vtt7UMW{T`k5Ro4LV6r_1D zg-u1r;1OwG_J<3UU7`5hXs4O8KqEKA1A7au#Ik}Y(MI??=Qmk+Vj*fad|Rct5uAIm zYeavbI^eu!0@rW8I9K>}Y(&>Wb$cd$Q<}9V8PUEwpq5$rH`1}-;AOF+e9BU7idYkCMJ=R80*%@5QK#c@ z8C4?|-NU5t z`rSICUs`{?G8$c_NBA5iuAWGL8>eFJbX^(LhEehJz$Zm?0tN|(QLUE2-MqjdZ)xGF zs!j?R_{(MmQtY@Q8VSE&1)~x#XtdQyMyo@$;*JygMVa2W1y9QUka(xi#-2j#tSS+5~ zPze7Zf?cIh1eM0b^DzLR*Nnw!iRR7+eYOJQ1%*$>0s!Y-LNSuph6v*Opf+(AX&pcZ z&;twrE#MTe56}np0_OoTaHd*Y;tU9B!QfiqU5^2fcVcTDaE1A9{Qi_{IWL}kmaFhPn}+bu z5R*oEeeM~@@NW~akdia{+D>bivJG)qtVsM8IZr|y2pxEkiJzayFAEyW9*klBxHLMH z!r0!zIo)zcf9XfdyJ-0(qc&wdpv^%SxcWX@NHfQ-P+}X5_JLvnO3dKT>!!`RQgiRP z4AU;$+wPS52v_H6Gc7sfFR)n_ySL8#Tc|U3+=CX37R*d8Ijq(Xwpq_r2UKq$|@Oy$q&&p2Xd#JN3 zNtZI*#>TxDHz?1}dB$_PgK|UMQi3!XqsPY27gBRBKi2Tb08ZE!99Y|X!CAv!T0ipo zlc&oJhtkHG;6BqXTD@hDb?ygrtgm!6NOEC6+aSj)99}chi%%_H9PT%0>jRk^PJMSO zzu@X7OMX)gcgNN?DRtl~?qj+hksVTr(*BsTcuxKfIZ7*`?uD}5g!U9&*QDfdmv#Zp z#2tI?_KdWe)KF_4l^#e^(RZ-TU9?HkFmveLRpXu$m?w_L#QNCifDwBL+Z5n_{Y*J{#T9|eUrdB@&~ZDFZCWE&&9Rn-d>>YY z$C;Aul=STo#i1cPhX}k<_ zkzuqi?!>}V(w`fd*d`a!KRq0Z`#6!EQEWABg@e5&igeo!TK)A&#ptU=4XQ$yuEb29 zJfltzMRfK!6}lcGIV;HE|Fbc9GhlaPPN@Qrg#Z| z;%jacEdm~=SmkcmytCR_o8$I2;+b*tlF4mmYW&B0ccTKXpGGj6Qd(1)ag0}+l@||e zxK3Kd6sLVv$EF9mB@4ZfGDv*m;InVS{&R(~e9D_W-#e$<#;#667#UOfh`WCD883gX zft=Yw_RgP;E^!s~?N3KcqC?H0V+pELHvrFFUki>q6Gw<~B9OMkT)ON@)cXbA)bqUE zFNA_+X&?$(;q6sWgq%O>U+4D=s~6-hYW*(-1s|b-D$vRi3a9{u+EYMPXvLngO_Mj& yNBMZ;`+GIZ!3sofIk_!62%(8~@U4R9^JM={Vu@I|+E(i>@gJrMuKTx}wE7PNq1Al= delta 3012 zcmZ8jc{r5q9)4$GhAcC7WAhDQV^m-}jyCobz1Q{oMEOe(v{rulJAl_xvLBA(2IpL>%N`xq&K_$A2YY z-|dDGhzbAzcogj#bQ>Z{3xa`caF(G}`4grMVY6UKMw0cLWT?-7^1H|XoyYFw*;p=X zG5=oNEd86MX(%g6HU>+`(KL}xXjzuMTgm^;jLQ2+Zm22_Fa&nN4RG%9Kl=Y`&c8CW zEVMMZc-Pnmb5!8wWJA{Q?W|`mhdssmFO0FPnF#Qids~qoaBD=Dlvwd%72W80>#yJV3kbZVLvJrEu)#tTNK-v8h#v&h@zO9D?m8S)l-Xv7$eSgTHa39 zTGJ`zhCSU~%$N77&nC2Gr3`44TwlulH46bNZj@{anHppL*DZ0X?!>OP1(Vy32Ttv&*<^-RtM2 z4Qk8XZLgl+<-HNmgB^KPH*zz)ruf$p&4{7ckR5K!>?xbA2V&J8M?!SATGyA6v%Z?u zL;VxdF+ryak=rCB+o@x~UWClj9)zu&IpNw4uK>!4xKa%M)q!PHET~ z&F?VT9)o8YmkH0QWTsixML*OIxSmwxJX=}PyI0U34GEXO=nCEr8h^aC9h7ix z%h5WdaHZ-+xW&ugH<1zVezmXT+VlI=&vTBM*PUM2nc!X68C=%`S7-DJ>tqtB2~GXJ z9Rm}|VOz&7$+yHijwUXrj+dWaS6J0MNFF!rcta9&+m?~gLL-Jr+*~Ws3=r7JgwdZ#oZWD4AoD_3&x8)(^Nj)%=i13uXawk_=^*bmR6%- zJd^BOjT6SvcW>)p^<%xQz-!%8@4oel2VUjuqVx%4pPjuj%q{`B#vz_qh1F^j5D676 zZ&E(KzYW`H2r(^ehR5R!QRlQDSo08na@z<#^Gr9s{H7`f zxF7cw(|5^+%W)^KmJo3lm+WW*ktMF&``7oc23j{xwjapSc1P*C3wPyx@6w31vqkBC zS$UOWA~bbkKbOBm9FK$({UPMWaH)qvvj=*8w=d|9Q8*?jc0G-EMAS+ZX`W{WxOVB0sOX@iLtj$!{-w7;p!) z0S!P6I0Cq`_z>U^_yQLz*Z40&XlhWnn$Ey50Aamg7y74dTz792mIO?@hk=>RpXYaZ zjm5h;o~@tfX#spX;P`3d{kj4w-%8ZPCOC*R5Mr5-sb)kRc}5}N4kl-<6{%lyXT z^Fddb0a3=FDQ+)u+sek}tr69vd#u1kXsht$y`UeJRT?RnBbNq%g7Vnay6}`r8 zU%pk#cHL*9po2T*P+7gW>m;8C9Yc9mh9vlS`%93=XDf=3GYf$C68vnf1r|Zf_SL>` z8gma1rG|kWJ-kZRq93Bc@MIU+TFsm*7jHFX`7UngXpAVbA%|@yI)eL7r}hUQrnfoY z%gBa%9S$_OIm%J-`2FLtISnjSZ86Ul2Cu>CxdkJqp-zQ6b7s~|KY{>h{>f1G$Dj+% zgZDklZb2x8H#kc|HrDtadBCgw#6SrO-<~3eToIsk!tF`9F*iQBwKR2$WO3^Qb0RG% z;tIg*3A=qW-z+A3@n-5zQbZ5Rp8T0+K|5DeJoT^QQ|i6Q7=L`yOmXC5i5wdWYFk1~ z^GTJW#NFZ9e(`iW+zBe>el6PYu1Q29^=T%*f^x+s2V=00tMnrkvieGLoEjlwTm#U5 zY|emwuy-@>sWZftqZ0tvYt+2>N34+-;z@|`ub_iRs%DfW#-lTIf)Njl7Kow++Pp<6 zlfgA+Pv;5#{2J!kLvxNzdV?BDgPhI6ACynFaLSLiPAOkN)u&lraktNd$(ecs`{=q= z)gBS)xsF=Bk21VA6jjdRjN$~T7xWRIJc(f8Jx|WKi|plUc_*{RY)p;bpnJN8-@UVl zHQxMlw)f1$*z(}{eBbquQ`J0cFU==Q}8R@kuHWn3D&R1*Y><6AU9&k%uXnnv? zMq_fVwtMQ0m#~x@kL-zlb0eLd2170{T(T#Bi@!P3W^x&9HPDjEN90Ff!2OyWX0+d+ zv~Wn+=cue(iHlvL$?*=QH{1*|TOJ!d6J2k1b4cHJ?4nTZMfcp5oxrt3_MCX!?ZNKg zQmyNmx3jy|qh8vtqJ(S+X*JQM-8l$zmmZkC{dcroLwNOf++1V1Bf>gl;4$-Ye-2_^ zNmIA`+UU2&qqn9|m39|aW$U!=;J(O~fEU`X3UeG4GRo;t`q5m)KiM`bWUl_+Vxxdv zLL?j6#ARjdm%Zl4_9}&QN}KgBGnuZgs~>+fHn#(?IMQ>Od*mt0eX!R?tzcX|S3Q>x z39aKl?LmTjc>?93P3e*%@H1B%UvXjai=8u#@BtdM>>oH{e?G