From 656fa3f29630c70b9ed746bebe6edec8f29844f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=9B=E5=AE=8F=E7=A5=A5?= <14281818+xue-hongxiang@user.noreply.gitee.com> Date: Tue, 31 Dec 2024 11:39:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A1=E6=A3=80=E8=AE=A1=E5=88=92=E6=8A=A5?= =?UTF-8?q?=E5=91=8Asheet2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contraller/MaintenanceController.java | 4 +- .../excel/CustomCellWriteHeightConfig.java | 65 ++++++++++++++ .../excel/CustomCellWriteWidthConfig.java | 77 ++++++++++++++++ .../business/excel/MergeColumnStrategy.java | 37 ++++++++ .../business/pojo/entity/BigTitle.java | 21 +++++ .../business/pojo/entity/DeviceVO.java | 45 ++++++++++ .../IMaintenancePlanDetailService.java | 1 - .../service/IMaintenancePlanService.java | 4 + .../MaintenancePlanDetailServiceImpl.java | 83 ++++++++++++++++-- .../impl/MaintenancePlanServiceImpl.java | 12 ++- .../excel/MaintenancePlanReport.xlsx | Bin 19328 -> 10667 bytes 11 files changed, 337 insertions(+), 12 deletions(-) create mode 100644 src/main/java/org/springblade/modules/business/excel/CustomCellWriteHeightConfig.java create mode 100644 src/main/java/org/springblade/modules/business/excel/CustomCellWriteWidthConfig.java create mode 100644 src/main/java/org/springblade/modules/business/excel/MergeColumnStrategy.java create mode 100644 src/main/java/org/springblade/modules/business/pojo/entity/BigTitle.java create mode 100644 src/main/java/org/springblade/modules/business/pojo/entity/DeviceVO.java diff --git a/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java b/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java index 0e80b64..029958b 100644 --- a/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java +++ b/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.PostConstruct; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import org.springblade.common.constant.CommonConstant; @@ -27,6 +28,7 @@ import org.springblade.modules.business.sms.SmsService; import org.springblade.modules.system.pojo.entity.User; import org.springblade.modules.system.service.IUserService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; @@ -472,7 +474,7 @@ public class MaintenanceController extends BladeController { @PostMapping("/maintenance-plan-report") @Operation(summary = "导出巡检计划报告", description = "导出巡检计划报告") - private void maintenancePlanReport(@RequestBody MaintenancePlan maintenancePlan, HttpServletResponse response) throws IOException { + public void maintenancePlanReport(@RequestBody MaintenancePlan maintenancePlan, HttpServletResponse response) throws IOException { planDetailService.maintenancePlanReport(maintenancePlan, response); } } diff --git a/src/main/java/org/springblade/modules/business/excel/CustomCellWriteHeightConfig.java b/src/main/java/org/springblade/modules/business/excel/CustomCellWriteHeightConfig.java new file mode 100644 index 0000000..2b09ca6 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/excel/CustomCellWriteHeightConfig.java @@ -0,0 +1,65 @@ +package org.springblade.modules.business.excel; + +import com.alibaba.excel.write.handler.context.RowWriteHandlerContext; +import com.alibaba.excel.write.style.row.AbstractRowHeightStyleStrategy; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import java.util.Iterator; + +public class CustomCellWriteHeightConfig extends AbstractRowHeightStyleStrategy { + + /** + * 默认高度 + */ + private static final Integer DEFAULT_HEIGHT = 300; + + @Override + protected void setHeadColumnHeight(Row row, int relativeRowIndex) { + + } + + @Override + protected void setContentColumnHeight(Row row, int relativeRowIndex) { + Iterator cellIterator = row.cellIterator(); + if (!cellIterator.hasNext()) { + return; + } + // 默认为 1 行高度 + int maxHeight = 1; + while (cellIterator.hasNext()) { + Cell cell = cellIterator.next(); + if (cell.getCellType() == CellType.STRING) { + String value = cell.getStringCellValue(); + for (int i = 0; i < value.length(); i += 10) { + if (i + 10 < value.length()) { + value = value.substring(0, i) + "\n" + value.substring(i, i + 10) + value.substring(i + 10); + } else { + value = value.substring(0, i) + "\n" + value.substring(i); + } + } + if (value.contains("\n")) { + int length = value.split("\n").length; + maxHeight = Math.max(maxHeight, length); + } + } + } + row.setHeight((short) (maxHeight * DEFAULT_HEIGHT)); + } + + @Override + public void afterRowDispose(RowWriteHandlerContext context) { + if (context.getHead() != null) { + if (ObjectUtils.isEmpty(context.getRelativeRowIndex())) { + return; + } + if (Boolean.TRUE.equals(context.getHead())) { + this.setHeadColumnHeight(context.getRow(), context.getRelativeRowIndex()); + } else { + this.setContentColumnHeight(context.getRow(), context.getRelativeRowIndex()); + } + + } + } +} diff --git a/src/main/java/org/springblade/modules/business/excel/CustomCellWriteWidthConfig.java b/src/main/java/org/springblade/modules/business/excel/CustomCellWriteWidthConfig.java new file mode 100644 index 0000000..989b0b9 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/excel/CustomCellWriteWidthConfig.java @@ -0,0 +1,77 @@ +package org.springblade.modules.business.excel; + +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.metadata.data.CellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Sheet; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CustomCellWriteWidthConfig extends AbstractColumnWidthStyleStrategy { + + private final Map> CACHE = new HashMap<>(); + + @Override + protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List> cellDataList, Cell cell, Head head, Integer integer, Boolean isHead) { + boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList); + if (needSetWidth) { + Map maxColumnWidthMap = CACHE.computeIfAbsent(writeSheetHolder.getSheetNo(), k -> new HashMap<>()); + Integer columnWidth = this.dataLength(cellDataList, cell, isHead); + if (columnWidth > 0) { + if (columnWidth > 10) { + columnWidth = 20; + }else{ + columnWidth = 10; + } + Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex()); + if (maxColumnWidth == null || columnWidth > maxColumnWidth) { + maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth); + Sheet sheet = writeSheetHolder.getSheet(); + sheet.setColumnWidth(cell.getColumnIndex(), 256 * columnWidth + 184); + } + } + } + } + + /** + * 计算长度 + * + * @param cellDataList + * @param cell + * @param isHead + * @return + */ + private Integer dataLength(List> cellDataList, Cell cell, Boolean isHead) { + if (isHead) { + return cell.getStringCellValue().getBytes().length; + } else { + CellData cellData = cellDataList.get(0); + CellDataTypeEnum type = cellData.getType(); + if (type == null) { + return -1; + } else { + switch (type) { + case STRING: + // 换行符(数据需要提前解析好) + int index = cellData.getStringValue().indexOf("\n"); + return index != -1 ? + cellData.getStringValue().substring(0, index).getBytes().length + 1 : cellData.getStringValue().getBytes().length + 1; + case BOOLEAN: + return cellData.getBooleanValue().toString().getBytes().length; + case NUMBER: + return cellData.getNumberValue().toString().getBytes().length; + default: + return -1; + } + } + } + } + +} diff --git a/src/main/java/org/springblade/modules/business/excel/MergeColumnStrategy.java b/src/main/java/org/springblade/modules/business/excel/MergeColumnStrategy.java new file mode 100644 index 0000000..58e5927 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/excel/MergeColumnStrategy.java @@ -0,0 +1,37 @@ +package org.springblade.modules.business.excel; + +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.write.handler.CellWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; + +import java.util.List; + +@Data +public class MergeColumnStrategy implements CellWriteHandler { + + private Integer firstColumnIndex; + + private Integer lastColumnIndex; + + + public MergeColumnStrategy(Integer firstColumnIndex, Integer lastColumnIndex) { + this.firstColumnIndex = firstColumnIndex; + this.lastColumnIndex = lastColumnIndex; + } + + @Override + public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + + Sheet sheet = writeSheetHolder.getSheet(); + int lastRowNum = sheet.getLastRowNum(); + CellRangeAddress cellAddresses = new CellRangeAddress(lastRowNum, lastRowNum, firstColumnIndex, lastColumnIndex); + sheet.addMergedRegion(cellAddresses); + } +} diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/BigTitle.java b/src/main/java/org/springblade/modules/business/pojo/entity/BigTitle.java new file mode 100644 index 0000000..f23cd56 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/pojo/entity/BigTitle.java @@ -0,0 +1,21 @@ +package org.springblade.modules.business.pojo.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ContentFontStyle; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum; +import com.alibaba.excel.enums.poi.VerticalAlignmentEnum; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +public class BigTitle { + + @ContentFontStyle(fontHeightInPoints = 15, fontName = "微软雅黑") + @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER, borderTop = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN) + private String title; + + +} diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/DeviceVO.java b/src/main/java/org/springblade/modules/business/pojo/entity/DeviceVO.java new file mode 100644 index 0000000..ad94ad1 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/pojo/entity/DeviceVO.java @@ -0,0 +1,45 @@ +package org.springblade.modules.business.pojo.entity; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ContentFontStyle; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum; +import com.alibaba.excel.enums.poi.VerticalAlignmentEnum; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +@ContentFontStyle(fontHeightInPoints = 10, fontName = "微软雅黑") +@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER, borderTop = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN) +public class DeviceVO { + + @ExcelProperty("楼层") + private String floor; + + @ExcelProperty("房间") + private String dept; + + @ExcelProperty("设备名称") + private String deviceName; + + @ExcelProperty("单位") + private String unit; + + @ExcelProperty("数量") + private Integer num; + + @ExcelProperty("维保内容及频次") + private String checkContent; + + @ExcelProperty("巡检工艺") + private String craft; + + @ExcelProperty("巡检频次") + private String period; + + @ExcelIgnore + private String type; +} diff --git a/src/main/java/org/springblade/modules/business/service/IMaintenancePlanDetailService.java b/src/main/java/org/springblade/modules/business/service/IMaintenancePlanDetailService.java index d049dd3..3b068d4 100644 --- a/src/main/java/org/springblade/modules/business/service/IMaintenancePlanDetailService.java +++ b/src/main/java/org/springblade/modules/business/service/IMaintenancePlanDetailService.java @@ -14,6 +14,5 @@ import java.io.IOException; * @since 2024-10-14 */ public interface IMaintenancePlanDetailService extends BaseService { - void maintenancePlanReport(MaintenancePlan maintenancePlan, HttpServletResponse response) throws IOException; } diff --git a/src/main/java/org/springblade/modules/business/service/IMaintenancePlanService.java b/src/main/java/org/springblade/modules/business/service/IMaintenancePlanService.java index 02c4449..17075d1 100644 --- a/src/main/java/org/springblade/modules/business/service/IMaintenancePlanService.java +++ b/src/main/java/org/springblade/modules/business/service/IMaintenancePlanService.java @@ -1,8 +1,10 @@ package org.springblade.modules.business.service; +import jakarta.servlet.http.HttpServletResponse; import org.springblade.core.mp.base.BaseService; import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlan; +import java.io.IOException; import java.time.LocalDate; import java.util.Date; import java.util.List; @@ -26,4 +28,6 @@ public interface IMaintenancePlanService extends BaseService { boolean planRemove(List ids); MaintenancePlan planDetail(MaintenancePlan plan); + + } diff --git a/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanDetailServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanDetailServiceImpl.java index 7da7001..e266f59 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanDetailServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanDetailServiceImpl.java @@ -4,23 +4,32 @@ package org.springblade.modules.business.service.impl; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.WriteTable; import com.alibaba.excel.write.metadata.fill.FillConfig; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.modules.business.excel.CustomCellWriteHeightConfig; +import org.springblade.modules.business.excel.CustomCellWriteWidthConfig; +import org.springblade.modules.business.excel.MergeColumnStrategy; +import org.springblade.modules.business.pojo.entity.BigTitle; +import org.springblade.modules.business.pojo.entity.Device; +import org.springblade.modules.business.pojo.entity.DeviceVO; import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlan; import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlanOutputData; +import org.springblade.modules.business.service.IDeviceService; import org.springblade.modules.business.service.IMaintenancePlanDetailService; import org.springblade.modules.business.mapper.MaintenancePlanDetailMapper; import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlanDetail; +import org.springblade.modules.system.pojo.entity.Dept; +import org.springblade.modules.system.service.IDeptService; import org.springframework.stereotype.Service; import java.io.IOException; -import java.io.OutputStream; import java.util.*; -import java.util.zip.ZipOutputStream; +import java.util.stream.Collectors; /** * 巡检计划详情 服务实现类 @@ -31,6 +40,8 @@ import java.util.zip.ZipOutputStream; @Service @AllArgsConstructor public class MaintenancePlanDetailServiceImpl extends BaseServiceImpl implements IMaintenancePlanDetailService { + private final IDeviceService deviceService; + private final IDeptService deptService; @Override public void maintenancePlanReport(MaintenancePlan maintenancePlan, HttpServletResponse response) throws IOException { @@ -38,11 +49,22 @@ public class MaintenancePlanDetailServiceImpl extends BaseServiceImpl maintenancePlanDetailsList = baseMapper.selectList(Wrappers.lambdaQuery(MaintenancePlanDetail.class).eq(MaintenancePlanDetail::getPlanId, maintenancePlan.getId())); + List deviceVOList = new ArrayList<>(); List maintenancePlanOutputDataList = new ArrayList<>(); for (MaintenancePlanDetail maintenancePlanDetail : maintenancePlanDetailsList) { + //sheet1数据获取 MaintenancePlanOutputData maintenancePlanOutputData = new MaintenancePlanOutputData(); - maintenancePlanOutputData.setMajorName(maintenancePlanDetail.getMajorName()); - maintenancePlanOutputData.setAddress(maintenancePlan.getAddress()); + Device device = deviceService.getById(maintenancePlanDetail.getDeviceId()); + maintenancePlanOutputData.setMajorName(device.getName()); + Long limsId = device.getLimsId(); + String deptAddress = ""; + Dept lims = deptService.getById(limsId); + deptAddress = deptAddress + lims.getDeptName(); + Dept floor = deptService.getById(device.getFloorId()); + deptAddress = deptAddress + "/" + floor.getDeptName(); + Dept dept = deptService.getById(device.getRoomId()); + deptAddress = deptAddress + "/" + dept.getDeptName(); + maintenancePlanOutputData.setAddress(deptAddress); maintenancePlanOutputData.setCraft(maintenancePlanDetail.getCraft()); maintenancePlanOutputData.setCheckContent(maintenancePlanDetail.getCheckContent()); Optional period = Optional.ofNullable(maintenancePlanDetail.getPeriod()); @@ -58,12 +80,61 @@ public class MaintenancePlanDetailServiceImpl extends BaseServiceImpl> deviceVOGroups = deviceVOList.stream().collect(Collectors.groupingBy(DeviceVO::getType)); + int tableNo = 0; //导出到Excel中 ServletOutputStream outputStream = response.getOutputStream(); try (ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(templateFile).build()) { - WriteSheet writeSheet = EasyExcel.writerSheet().build(); - excelWriter.fill(maintenancePlanOutputDataList, fillConfig, writeSheet); + WriteSheet firstSheet = EasyExcel.writerSheet(0).build(); + WriteSheet secondSheet = EasyExcel + .writerSheet(1) + .registerWriteHandler(new CustomCellWriteHeightConfig()) + .registerWriteHandler(new CustomCellWriteWidthConfig()) + .build(); + excelWriter.fill(maintenancePlanOutputDataList, fillConfig, firstSheet); + for (Map.Entry> entry : deviceVOGroups.entrySet()) { + List bigTitleList = new ArrayList<>(); + BigTitle bigTitle = new BigTitle(); + bigTitle.setTitle(entry.getValue().get(0).getType() + "维保清单"); + bigTitleList.add(bigTitle); + WriteTable writeTable1 = EasyExcel.writerTable() + .tableNo(tableNo++) + .registerWriteHandler(new MergeColumnStrategy(0, 7)) + .needHead(false) + .head(BigTitle.class) + .build(); + excelWriter.write(bigTitleList, secondSheet, writeTable1); + WriteTable writeTable = EasyExcel.writerTable() + .tableNo(tableNo++) + .needHead(true) + .head(DeviceVO.class) + .build(); + excelWriter.write(entry.getValue(), secondSheet, writeTable); + } excelWriter.finish(); outputStream.flush(); outputStream.close(); diff --git a/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java index 9e52ae2..099ee03 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java @@ -1,7 +1,13 @@ package org.springblade.modules.business.service.impl; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import org.apache.commons.collections.CollectionUtils; import org.springblade.common.cache.UserCache; @@ -11,10 +17,7 @@ import org.springblade.core.tool.utils.DateUtil; import org.springblade.modules.business.enums.MaintenanceStatusEnum; import org.springblade.modules.business.mapper.MaintenancePlanMapper; import org.springblade.modules.business.pojo.entity.DeviceAttach; -import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlan; -import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlanDetail; -import org.springblade.modules.business.pojo.entity.maintenance.MaintenanceTask; -import org.springblade.modules.business.pojo.entity.maintenance.MaintenanceTaskDetail; +import org.springblade.modules.business.pojo.entity.maintenance.*; import org.springblade.modules.business.service.*; import org.springblade.modules.business.sms.SmsService; import org.springblade.modules.resource.pojo.entity.Sms; @@ -23,6 +26,7 @@ import org.springblade.modules.system.service.IUserService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.IOException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.ZoneId; diff --git a/src/main/resources/excel/MaintenancePlanReport.xlsx b/src/main/resources/excel/MaintenancePlanReport.xlsx index a218551469ff8327875153cf8c266202005ddee6..bb4f3b4a19c0acca1a9d3a391f69efc1e85f5b01 100644 GIT binary patch delta 6554 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 delta 15264 zcmZ8|b8x3k({60rwr%?t+qUg&@{65pw6Sg5*w{`s&c@EhKKnfHd(Kzix&N5DYwGH* zneLfus(YrZ)B@8$>svt~t4jhd1(Ul#>4C*LZ!iwfbX~42+7|n9p$GQ#TsAU=Tc14! ztIJV_-niS;O51KpGsu;2LIa(RE4YQIqM+6)ld9Kj_xcQjv~bzSx_>HH5(>z9IA)!k zR87*$8LRCb`d`uX=Q5kk2F+oZdO!ehL8!3ogWMu2bv zX`61}(84WQ3Jqz8^ErrH&mdHd%SD17krpHOomN6Lu4ds4TqP?Ph!yzNjGlfm4)YS6 zgwR9R+hmplI`JHU(MG9C=Z;JDOJxSIA}=<=m|g+vwXS->-NHv%%dc_qzi&Bkhf|85 zxf5mQJgpE!YN%>2`{RyL7R-&EE}O;1>IJcD zZntzh73!L;Yw#bCDuBJjICU6VkZD*dvE)B3&3*(fVk2eyRE2!dH>zEjTeW^49X~xf zrG7to7(_CF+ODjxu0)AQSOLJoQbEcGo5Q-qvNBq)Q)ImodN0z-2T|+oRqmwdjq
ENRIp3t{^oq_>&f0U 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 RF$`Yv4_Xu`Lg|0H{|{2o$gThY