From d8ae33eadb7dd9c6ac3fbb09c75bff17940e6a4e Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Mon, 20 Mar 2023 15:32:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8C=BA=E5=9F=9F=E3=80=81=E7=82=B9=E4=BD=8D?= =?UTF-8?q?=E3=80=81=E4=BB=BB=E5=8A=A1=E7=AE=A1=E7=90=86=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9B=E8=A1=A8=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E6=9B=B4=E6=96=B0=EF=BC=9B=E4=BB=A3=E7=A0=81=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=8A=9F=E8=83=BD=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mes/hd/nladmin-system/pom.xml | 11 + .../modules/generator/domain/ColumnInfo.java | 98 ++++ .../modules/generator/domain/GenConfig.java | 79 +++ .../generator/domain/vo/TableInfo.java | 48 ++ .../repository/ColumnInfoRepository.java | 35 ++ .../repository/GenConfigRepository.java | 33 ++ .../generator/rest/GenConfigController.java | 51 ++ .../generator/rest/GeneratorController.java | 108 ++++ .../generator/service/GenConfigService.java | 40 ++ .../generator/service/GeneratorService.java | 98 ++++ .../service/impl/GenConfigServiceImpl.java | 71 +++ .../service/impl/GeneratorServiceImpl.java | 203 +++++++ .../nl/modules/generator/utils/ColUtil.java | 56 ++ .../nl/modules/generator/utils/GenUtil.java | 426 +++++++++++++++ .../org/nl/wms/basedata/master/wql/mdpb.xls | Bin 193024 -> 192512 bytes .../main/java/org/nl/wms/enums/PointEnum.java | 27 + .../mps/rest/ProduceWorkorderController.java | 2 +- .../org/nl/wms/sch/rest/PointController.java | 54 +- .../org/nl/wms/sch/rest/RegionController.java | 12 +- .../org/nl/wms/sch/service/PointService.java | 25 +- .../org/nl/wms/sch/service/RegionService.java | 8 +- .../org/nl/wms/sch/service/dto/PointDto.java | 158 +++--- .../org/nl/wms/sch/service/dto/RegionDto.java | 4 +- .../org/nl/wms/sch/service/dto/TaskDto.java | 118 ++-- .../sch/service/impl/PointServiceImpl.java | 194 ++++--- .../sch/service/impl/RegionServiceImpl.java | 16 +- .../wms/sch/service/impl/TaskServiceImpl.java | 65 ++- .../nl/wms/sch/tasks/CallMaterialTask.java | 4 +- .../nl/wms/sch/tasks/SendMaterialTask.java | 4 +- .../org/nl/wms/sch/wql/QSCH_BASE_POINT.wql | 70 ++- .../java/org/nl/wms/sch/wql/QSCH_TASK_01.wql | 51 +- .../src/main/java/org/nl/wms/sch/wql/sch.xls | Bin 176128 -> 212480 bytes .../template/generator/admin/Dto.ftl | 34 +- mes/qd/src/api/wms/sch/point.js | 33 +- mes/qd/src/api/wms/sch/region.js | 15 +- .../views/wms/sch/point/MaterialDialog.vue | 155 ++++++ mes/qd/src/views/wms/sch/point/ViewDialog.vue | 212 ++++++++ .../views/wms/sch/point/WorkOrderDialog.vue | 158 ++++++ mes/qd/src/views/wms/sch/point/index.vue | 512 +++++++++++++----- mes/qd/src/views/wms/sch/task/index.vue | 261 ++++----- 40 files changed, 2966 insertions(+), 583 deletions(-) create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/domain/ColumnInfo.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/domain/GenConfig.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/domain/vo/TableInfo.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/repository/ColumnInfoRepository.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/repository/GenConfigRepository.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/rest/GenConfigController.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/rest/GeneratorController.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/GenConfigService.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/GeneratorService.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GenConfigServiceImpl.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GeneratorServiceImpl.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/utils/ColUtil.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/utils/GenUtil.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/enums/PointEnum.java create mode 100644 mes/qd/src/views/wms/sch/point/MaterialDialog.vue create mode 100644 mes/qd/src/views/wms/sch/point/ViewDialog.vue create mode 100644 mes/qd/src/views/wms/sch/point/WorkOrderDialog.vue diff --git a/mes/hd/nladmin-system/pom.xml b/mes/hd/nladmin-system/pom.xml index 793e6bc3..99d69a25 100644 --- a/mes/hd/nladmin-system/pom.xml +++ b/mes/hd/nladmin-system/pom.xml @@ -253,6 +253,17 @@ mybatis-plus-generator 3.4.0 + + + commons-configuration + commons-configuration + 1.9 + + + + org.springframework.boot + spring-boot-starter-freemarker + diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/domain/ColumnInfo.java b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/domain/ColumnInfo.java new file mode 100644 index 00000000..cc23dd56 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/domain/ColumnInfo.java @@ -0,0 +1,98 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.modules.generator.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.nl.modules.generator.utils.GenUtil; + +import javax.persistence.*; +import java.io.Serializable; + +/** + * 列的数据信息 + * @author Zheng Jie + * @date 2019-01-02 + */ +@Getter +@Setter +@Entity +@NoArgsConstructor +@Table(name = "code_column_config") +public class ColumnInfo implements Serializable { + + @Id + @Column(name = "column_id") + @ApiModelProperty(value = "ID", hidden = true) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ApiModelProperty(value = "表名") + private String tableName; + + @ApiModelProperty(value = "数据库字段名称") + private String columnName; + + @ApiModelProperty(value = "数据库字段类型") + private String columnType; + + @ApiModelProperty(value = "数据库字段键类型") + private String keyType; + + @ApiModelProperty(value = "字段额外的参数") + private String extra; + + @ApiModelProperty(value = "数据库字段描述") + private String remark; + + @ApiModelProperty(value = "是否必填") + private Boolean notNull; + + @ApiModelProperty(value = "是否在列表显示") + private Boolean listShow; + + @ApiModelProperty(value = "是否表单显示") + private Boolean formShow; + + @ApiModelProperty(value = "表单类型") + private String formType; + + @ApiModelProperty(value = "查询 1:模糊 2:精确") + private String queryType; + + @ApiModelProperty(value = "字典名称") + private String dictName; + + @ApiModelProperty(value = "日期注解") + private String dateAnnotation; + + public ColumnInfo(String tableName, String columnName, Boolean notNull, String columnType, String remark, String keyType, String extra) { + this.tableName = tableName; + this.columnName = columnName; + this.columnType = columnType; + this.keyType = keyType; + this.extra = extra; + this.notNull = notNull; + if(GenUtil.PK.equalsIgnoreCase(keyType) && GenUtil.EXTRA.equalsIgnoreCase(extra)){ + this.notNull = false; + } + this.remark = remark; + this.listShow = true; + this.formShow = true; + } +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/domain/GenConfig.java b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/domain/GenConfig.java new file mode 100644 index 00000000..454b1e93 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/domain/GenConfig.java @@ -0,0 +1,79 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.modules.generator.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.persistence.*; +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 代码生成配置 + * @author Zheng Jie + * @date 2019-01-03 + */ +@Getter +@Setter +@Entity +@NoArgsConstructor +@Table(name = "code_gen_config") +public class GenConfig implements Serializable { + + public GenConfig(String tableName) { + this.tableName = tableName; + } + + @Id + @Column(name = "config_id") + @ApiModelProperty(value = "ID", hidden = true) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotBlank + @ApiModelProperty(value = "表名") + private String tableName; + + @ApiModelProperty(value = "接口名称") + private String apiAlias; + + @NotBlank + @ApiModelProperty(value = "包路径") + private String pack; + + @NotBlank + @ApiModelProperty(value = "模块名") + private String moduleName; + + @NotBlank + @ApiModelProperty(value = "前端文件路径") + private String path; + + @ApiModelProperty(value = "前端文件路径") + private String apiPath; + + @ApiModelProperty(value = "作者") + private String author; + + @ApiModelProperty(value = "表前缀") + private String prefix; + + @ApiModelProperty(value = "是否覆盖") + private Boolean cover = false; +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/domain/vo/TableInfo.java b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/domain/vo/TableInfo.java new file mode 100644 index 00000000..ddf3388c --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/domain/vo/TableInfo.java @@ -0,0 +1,48 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.modules.generator.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 表的数据信息 + * @author Zheng Jie + * @date 2019-01-02 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TableInfo { + + /** 表名称 */ + private Object tableName; + + /** 创建日期 */ + private Object createTime; + + /** 数据库引擎 */ + private Object engine; + + /** 编码集 */ + private Object coding; + + /** 备注 */ + private Object remark; + + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/repository/ColumnInfoRepository.java b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/repository/ColumnInfoRepository.java new file mode 100644 index 00000000..8af5fbb0 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/repository/ColumnInfoRepository.java @@ -0,0 +1,35 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.modules.generator.repository; + +import org.nl.modules.generator.domain.ColumnInfo; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +/** + * @author Zheng Jie + * @date 2019-01-14 + */ +public interface ColumnInfoRepository extends JpaRepository { + + /** + * 查询表信息 + * @param tableName 表格名 + * @return 表信息 + */ + List findByTableNameOrderByIdAsc(String tableName); +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/repository/GenConfigRepository.java b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/repository/GenConfigRepository.java new file mode 100644 index 00000000..c6afcef2 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/repository/GenConfigRepository.java @@ -0,0 +1,33 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.modules.generator.repository; + +import org.nl.modules.generator.domain.GenConfig; +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * @author Zheng Jie + * @date 2019-01-14 + */ +public interface GenConfigRepository extends JpaRepository { + + /** + * 查询表配置 + * @param tableName 表名 + * @return / + */ + GenConfig findByTableName(String tableName); +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/rest/GenConfigController.java b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/rest/GenConfigController.java new file mode 100644 index 00000000..75ee5b51 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/rest/GenConfigController.java @@ -0,0 +1,51 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.modules.generator.rest; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.nl.modules.generator.domain.GenConfig; +import org.nl.modules.generator.service.GenConfigService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * @author Zheng Jie + * @date 2019-01-14 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/genConfig") +@Api(tags = "系统:代码生成器配置管理") +public class GenConfigController { + + private final GenConfigService genConfigService; + + @ApiOperation("查询") + @GetMapping(value = "/{tableName}") + public ResponseEntity query(@PathVariable String tableName){ + return new ResponseEntity<>(genConfigService.find(tableName), HttpStatus.OK); + } + + @ApiOperation("修改") + @PutMapping + public ResponseEntity update(@Validated @RequestBody GenConfig genConfig){ + return new ResponseEntity<>(genConfigService.update(genConfig.getTableName(), genConfig),HttpStatus.OK); + } +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/rest/GeneratorController.java b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/rest/GeneratorController.java new file mode 100644 index 00000000..10238435 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/rest/GeneratorController.java @@ -0,0 +1,108 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.modules.generator.rest; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.PageUtil; +import org.nl.modules.generator.domain.ColumnInfo; +import org.nl.modules.generator.service.GenConfigService; +import org.nl.modules.generator.service.GeneratorService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @author Zheng Jie + * @date 2019-01-02 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/generator") +@Api(tags = "系统:代码生成管理") +public class GeneratorController { + + private final GeneratorService generatorService; + private final GenConfigService genConfigService; + + @Value("${generator.enabled}") + private Boolean generatorEnabled; + + @ApiOperation("查询数据库数据") + @GetMapping(value = "/tables/all") + public ResponseEntity queryTables(){ + return new ResponseEntity<>(generatorService.getTables(), HttpStatus.OK); + } + + @ApiOperation("查询数据库数据") + @GetMapping(value = "/tables") + public ResponseEntity queryTables(@RequestParam(defaultValue = "") String name, + @RequestParam(defaultValue = "0")Integer page, + @RequestParam(defaultValue = "10")Integer size){ + int[] startEnd = PageUtil.transToStartEnd(page, size); + return new ResponseEntity<>(generatorService.getTables(name,startEnd), HttpStatus.OK); + } + + @ApiOperation("查询字段数据") + @GetMapping(value = "/columns") + public ResponseEntity queryColumns(@RequestParam String tableName){ + List columnInfos = generatorService.getColumns(tableName); + return new ResponseEntity<>(PageUtil.toPage(columnInfos,columnInfos.size()), HttpStatus.OK); + } + + @ApiOperation("保存字段数据") + @PutMapping + public ResponseEntity save(@RequestBody List columnInfos){ + generatorService.save(columnInfos); + return new ResponseEntity<>(HttpStatus.OK); + } + + @ApiOperation("同步字段数据") + @PostMapping(value = "sync") + public ResponseEntity sync(@RequestBody List tables){ + for (String table : tables) { + generatorService.sync(generatorService.getColumns(table), generatorService.query(table)); + } + return new ResponseEntity<>(HttpStatus.OK); + } + + @ApiOperation("生成代码") + @PostMapping(value = "/{tableName}/{type}") + public ResponseEntity generator(@PathVariable String tableName, @PathVariable Integer type, HttpServletRequest request, HttpServletResponse response){ + if(!generatorEnabled && type == 0){ + throw new BadRequestException("此环境不允许生成代码,请选择预览或者下载查看!"); + } + switch (type){ + // 生成代码 + case 0: generatorService.generator(genConfigService.find(tableName), generatorService.getColumns(tableName)); + break; + // 预览 + case 1: return generatorService.preview(genConfigService.find(tableName), generatorService.getColumns(tableName)); + // 打包 + case 2: generatorService.download(genConfigService.find(tableName), generatorService.getColumns(tableName), request, response); + break; + default: throw new BadRequestException("没有这个选项"); + } + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/GenConfigService.java b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/GenConfigService.java new file mode 100644 index 00000000..43d9ab31 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/GenConfigService.java @@ -0,0 +1,40 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.modules.generator.service; + +import org.nl.modules.generator.domain.GenConfig; + +/** + * @author Zheng Jie + * @date 2019-01-14 + */ +public interface GenConfigService { + + /** + * 查询表配置 + * @param tableName 表名 + * @return 表配置 + */ + GenConfig find(String tableName); + + /** + * 更新表配置 + * @param tableName 表名 + * @param genConfig 表配置 + * @return 表配置 + */ + GenConfig update(String tableName, GenConfig genConfig); +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/GeneratorService.java b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/GeneratorService.java new file mode 100644 index 00000000..0e749f38 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/GeneratorService.java @@ -0,0 +1,98 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.modules.generator.service; + +import org.nl.modules.generator.domain.ColumnInfo; +import org.nl.modules.generator.domain.GenConfig; +import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.Async; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @author Zheng Jie + * @date 2019-01-02 + */ +public interface GeneratorService { + + /** + * 查询数据库元数据 + * @param name 表名 + * @param startEnd 分页参数 + * @return / + */ + Object getTables(String name, int[] startEnd); + + /** + * 得到数据表的元数据 + * @param name 表名 + * @return / + */ + List getColumns(String name); + + /** + * 同步表数据 + * @param columnInfos / + * @param columnInfoList / + */ + @Async + void sync(List columnInfos, List columnInfoList); + + /** + * 保持数据 + * @param columnInfos / + */ + void save(List columnInfos); + + /** + * 获取所有table + * @return / + */ + Object getTables(); + + /** + * 代码生成 + * @param genConfig 配置信息 + * @param columns 字段信息 + */ + void generator(GenConfig genConfig, List columns); + + /** + * 预览 + * @param genConfig 配置信息 + * @param columns 字段信息 + * @return / + */ + ResponseEntity preview(GenConfig genConfig, List columns); + + /** + * 打包下载 + * @param genConfig 配置信息 + * @param columns 字段信息 + * @param request / + * @param response / + */ + void download(GenConfig genConfig, List columns, HttpServletRequest request, HttpServletResponse response); + + /** + * 查询数据库的表字段数据数据 + * @param table / + * @return / + */ + List query(String table); +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GenConfigServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GenConfigServiceImpl.java new file mode 100644 index 00000000..17951640 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GenConfigServiceImpl.java @@ -0,0 +1,71 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.modules.generator.service.impl; + +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import org.nl.modules.generator.domain.GenConfig; +import org.nl.modules.generator.repository.GenConfigRepository; +import org.nl.modules.generator.service.GenConfigService; +import org.springframework.stereotype.Service; + +import java.io.File; + +/** + * @author Zheng Jie + * @date 2019-01-14 + */ +@Service +@RequiredArgsConstructor +public class GenConfigServiceImpl implements GenConfigService { + + private final GenConfigRepository genConfigRepository; + + @Override + public GenConfig find(String tableName) { + GenConfig genConfig = genConfigRepository.findByTableName(tableName); + if(genConfig == null){ + return new GenConfig(tableName); + } + return genConfig; + } + + @Override + public GenConfig update(String tableName, GenConfig genConfig) { + // 如果 api 路径为空,则自动生成路径 + if(StrUtil.isEmpty(genConfig.getApiPath())){ + String separator = File.separator; + String[] paths; + String symbol = "\\"; + if (symbol.equals(separator)) { + paths = genConfig.getPath().split("\\\\"); + } else { + paths = genConfig.getPath().split(File.separator); + } + StringBuilder api = new StringBuilder(); + for (String path : paths) { + api.append(path); + api.append(separator); + if ("src".equals(path)) { + api.append("api"); + break; + } + } + genConfig.setApiPath(api.toString()); + } + return genConfigRepository.save(genConfig); + } +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GeneratorServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GeneratorServiceImpl.java new file mode 100644 index 00000000..3fea2a99 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/service/impl/GeneratorServiceImpl.java @@ -0,0 +1,203 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.modules.generator.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ZipUtil; +import lombok.RequiredArgsConstructor; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.FileUtil; +import org.nl.modules.common.utils.PageUtil; +import org.nl.modules.generator.domain.ColumnInfo; +import org.nl.modules.generator.domain.GenConfig; +import org.nl.modules.generator.domain.vo.TableInfo; +import org.nl.modules.generator.repository.ColumnInfoRepository; +import org.nl.modules.generator.service.GeneratorService; +import org.nl.modules.generator.utils.GenUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author Zheng Jie + * @date 2019-01-02 + */ +@Service +@RequiredArgsConstructor +public class GeneratorServiceImpl implements GeneratorService { + private static final Logger log = LoggerFactory.getLogger(GeneratorServiceImpl.class); + @PersistenceContext + private EntityManager em; + + private final ColumnInfoRepository columnInfoRepository; + + @Override + public Object getTables() { + // 使用预编译防止sql注入 + String sql = "select table_name ,create_time , engine, table_collation, table_comment from information_schema.tables " + + "where table_schema = (select database()) " + + "order by create_time desc"; + Query query = em.createNativeQuery(sql); + return query.getResultList(); + } + + @Override + public Object getTables(String name, int[] startEnd) { + // 使用预编译防止sql注入 + String sql = "select table_name ,create_time , engine, table_collation, table_comment from information_schema.tables " + + "where table_schema = (select database()) " + + "and table_name like ? order by create_time desc"; + Query query = em.createNativeQuery(sql); + query.setFirstResult(startEnd[0]); + query.setMaxResults(startEnd[1] - startEnd[0]); + query.setParameter(1, StrUtil.isNotEmpty(name) ? ("%" + name + "%") : "%%"); + List result = query.getResultList(); + List tableInfos = new ArrayList<>(); + for (Object obj : result) { + Object[] arr = (Object[]) obj; + tableInfos.add(new TableInfo(arr[0], arr[1], arr[2], arr[3], ObjectUtil.isNotEmpty(arr[4]) ? arr[4] : "-")); + } + Query query1 = em.createNativeQuery("SELECT COUNT(*) from information_schema.tables where table_schema = (select database())"); + Object totalElements = query1.getSingleResult(); + return PageUtil.toPage(tableInfos, totalElements); + } + + @Override + public List getColumns(String tableName) { + List columnInfos = columnInfoRepository.findByTableNameOrderByIdAsc(tableName); + if (CollectionUtil.isNotEmpty(columnInfos)) { + return columnInfos; + } else { + columnInfos = query(tableName); + return columnInfoRepository.saveAll(columnInfos); + } + } + + @Override + public List query(String tableName) { + // 使用预编译防止sql注入 + String sql = "select column_name, is_nullable, data_type, column_comment, column_key, extra from information_schema.columns " + + "where table_name = ? and table_schema = (select database()) order by ordinal_position"; + Query query = em.createNativeQuery(sql); + query.setParameter(1, tableName); + List result = query.getResultList(); + List columnInfos = new ArrayList<>(); + for (Object obj : result) { + Object[] arr = (Object[]) obj; + columnInfos.add( + new ColumnInfo( + tableName, + arr[0].toString(), + "NO".equals(arr[1]), + arr[2].toString(), + ObjectUtil.isNotNull(arr[3]) ? arr[3].toString() : null, + ObjectUtil.isNotNull(arr[4]) ? arr[4].toString() : null, + ObjectUtil.isNotNull(arr[5]) ? arr[5].toString() : null) + ); + } + return columnInfos; + } + + @Override + public void sync(List columnInfos, List columnInfoList) { + // 第一种情况,数据库类字段改变或者新增字段 + for (ColumnInfo columnInfo : columnInfoList) { + // 根据字段名称查找 + List columns = columnInfos.stream().filter(c -> c.getColumnName().equals(columnInfo.getColumnName())).collect(Collectors.toList()); + // 如果能找到,就修改部分可能被字段 + if (CollectionUtil.isNotEmpty(columns)) { + ColumnInfo column = columns.get(0); + column.setColumnType(columnInfo.getColumnType()); + column.setExtra(columnInfo.getExtra()); + column.setKeyType(columnInfo.getKeyType()); + if (StrUtil.isEmpty(column.getRemark())) { + column.setRemark(columnInfo.getRemark()); + } + columnInfoRepository.save(column); + } else { + // 如果找不到,则保存新字段信息 + columnInfoRepository.save(columnInfo); + } + } + // 第二种情况,数据库字段删除了 + for (ColumnInfo columnInfo : columnInfos) { + // 根据字段名称查找 + List columns = columnInfoList.stream().filter(c -> c.getColumnName().equals(columnInfo.getColumnName())).collect(Collectors.toList()); + // 如果找不到,就代表字段被删除了,则需要删除该字段 + if (CollectionUtil.isEmpty(columns)) { + columnInfoRepository.delete(columnInfo); + } + } + } + + @Override + public void save(List columnInfos) { + columnInfoRepository.saveAll(columnInfos); + } + + @Override + public void generator(GenConfig genConfig, List columns) { + if (genConfig.getId() == null) { + throw new BadRequestException("请先配置生成器"); + } + try { + GenUtil.generatorCode(columns, genConfig); + } catch (IOException e) { + log.error(e.getMessage(), e); + throw new BadRequestException("生成失败,请手动处理已生成的文件"); + } + } + + @Override + public ResponseEntity preview(GenConfig genConfig, List columns) { + if (genConfig.getId() == null) { + throw new BadRequestException("请先配置生成器"); + } + List> genList = GenUtil.preview(columns, genConfig); + return new ResponseEntity<>(genList, HttpStatus.OK); + } + + @Override + public void download(GenConfig genConfig, List columns, HttpServletRequest request, HttpServletResponse response) { + if (genConfig.getId() == null) { + throw new BadRequestException("请先配置生成器"); + } + try { + File file = new File(GenUtil.download(columns, genConfig)); + String zipPath = file.getPath() + ".zip"; + ZipUtil.zip(file.getPath(), zipPath); + FileUtil.downloadFile(request, response, new File(zipPath), true); + } catch (IOException e) { + throw new BadRequestException("打包失败"); + } + } +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/utils/ColUtil.java b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/utils/ColUtil.java new file mode 100644 index 00000000..ff5a9719 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/utils/ColUtil.java @@ -0,0 +1,56 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.modules.generator.utils; + +import org.apache.commons.configuration.Configuration; +import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.PropertiesConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * sql字段转java + * + * @author Zheng Jie + * @date 2019-01-03 + */ +public class ColUtil { + private static final Logger log = LoggerFactory.getLogger(ColUtil.class); + + /** + * 转换mysql数据类型为java数据类型 + * + * @param type 数据库字段类型 + * @return String + */ + static String cloToJava(String type) { + Configuration config = getConfig(); + assert config != null; + return config.getString(type, "unknowType"); + } + + /** + * 获取配置信息 + */ + public static PropertiesConfiguration getConfig() { + try { + return new PropertiesConfiguration("generator.properties"); + } catch (ConfigurationException e) { + log.error(e.getMessage(), e); + } + return null; + } +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/utils/GenUtil.java b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/utils/GenUtil.java new file mode 100644 index 00000000..46bcf3bd --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/modules/generator/utils/GenUtil.java @@ -0,0 +1,426 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.modules.generator.utils; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.template.*; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.utils.FileUtil; +import org.nl.modules.common.utils.StringUtils; +import org.nl.modules.generator.domain.ColumnInfo; +import org.nl.modules.generator.domain.GenConfig; +import org.springframework.util.ObjectUtils; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.nl.modules.common.utils.FileUtil.SYS_TEM_DIR; + + +/** + * 代码生成 + * + * @author Zheng Jie + * @date 2019-01-02 + */ +@Slf4j +@SuppressWarnings({"unchecked", "all"}) +public class GenUtil { + + private static final String TIMESTAMP = "Timestamp"; + + private static final String BIGDECIMAL = "BigDecimal"; + + public static final String PK = "PRI"; + + public static final String EXTRA = "auto_increment"; + + /** + * 获取后端代码模板名称 + * + * @return List + */ + private static List getAdminTemplateNames() { + List templateNames = new ArrayList<>(); + // templateNames.add("Entity"); + templateNames.add("Dto"); + // templateNames.add("Mapper"); + templateNames.add("Controller"); + //templateNames.add("QueryCriteria"); + templateNames.add("Service"); + templateNames.add("ServiceImpl"); + // templateNames.add("Repository"); + return templateNames; + } + + /** + * 获取前端代码模板名称 + * + * @return List + */ + private static List getFrontTemplateNames() { + List templateNames = new ArrayList<>(); + templateNames.add("index"); + templateNames.add("api"); + return templateNames; + } + + public static List> preview(List columns, GenConfig genConfig) { + Map genMap = getGenMap(columns, genConfig); + List> genList = new ArrayList<>(); + // 获取后端模版 + List templates = getAdminTemplateNames(); + TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH)); + for (String templateName : templates) { + Map map = new HashMap<>(1); + Template template = engine.getTemplate("generator/admin/" + templateName + ".ftl"); + map.put("content", template.render(genMap)); + map.put("name", templateName); + genList.add(map); + } + // 获取前端模版 + templates = getFrontTemplateNames(); + for (String templateName : templates) { + Map map = new HashMap<>(1); + Template template = engine.getTemplate("generator/front/" + templateName + ".ftl"); + map.put(templateName, template.render(genMap)); + map.put("content", template.render(genMap)); + map.put("name", templateName); + genList.add(map); + } + return genList; + } + + public static String download(List columns, GenConfig genConfig) throws IOException { + // 拼接的路径:/tmpnladmin-gen-temp/,这个路径在Linux下需要root用户才有权限创建,非root用户会权限错误而失败,更改为: /tmp/nladmin-gen-temp/ + // String tempPath =SYS_TEM_DIR + "nladmin-gen-temp" + File.separator + genConfig.getTableName() + File.separator; + String tempPath = SYS_TEM_DIR + "nladmin-gen-temp" + File.separator + genConfig.getTableName() + File.separator; + Map genMap = getGenMap(columns, genConfig); + TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH)); + // 生成后端代码 + List templates = getAdminTemplateNames(); + for (String templateName : templates) { + Template template = engine.getTemplate("generator/admin/" + templateName + ".ftl"); + String filePath = getAdminFilePath(templateName, genConfig, genMap.get("className").toString(), tempPath + "eladmin" + File.separator); + assert filePath != null; + File file = new File(filePath); + // 如果非覆盖生成 + if (!genConfig.getCover() && FileUtil.exist(file)) { + continue; + } + // 生成代码 + genFile(file, template, genMap); + } + // 生成前端代码 + templates = getFrontTemplateNames(); + for (String templateName : templates) { + Template template = engine.getTemplate("generator/front/" + templateName + ".ftl"); + String path = tempPath + "nladmin-web" + File.separator; + String apiPath = path + "src" + File.separator + "api" + File.separator; + String srcPath = path + "src" + File.separator + "views" + File.separator + genMap.get("changeClassName").toString() + File.separator; + String filePath = getFrontFilePath(templateName, apiPath, srcPath, genMap.get("changeClassName").toString()); + assert filePath != null; + File file = new File(filePath); + // 如果非覆盖生成 + if (!genConfig.getCover() && FileUtil.exist(file)) { + continue; + } + // 生成代码 + genFile(file, template, genMap); + } + return tempPath; + } + + public static void generatorCode(List columnInfos, GenConfig genConfig) throws IOException { + Map genMap = getGenMap(columnInfos, genConfig); + TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH)); + // 生成后端代码 + List templates = getAdminTemplateNames(); + for (String templateName : templates) { + Template template = engine.getTemplate("generator/admin/" + templateName + ".ftl"); + String filePath = getAdminFilePath(templateName, genConfig, genMap.get("className").toString(), System.getProperty("user.dir")); + + assert filePath != null; + File file = new File(filePath); + + // 如果非覆盖生成 + if (!genConfig.getCover() && FileUtil.exist(file)) { + continue; + } + // 生成代码 + genFile(file, template, genMap); + } + + // 生成前端代码 + templates = getFrontTemplateNames(); + for (String templateName : templates) { + Template template = engine.getTemplate("generator/front/" + templateName + ".ftl"); + String filePath = getFrontFilePath(templateName, genConfig.getApiPath(), genConfig.getPath(), genMap.get("changeClassName").toString()); + + assert filePath != null; + File file = new File(filePath); + + // 如果非覆盖生成 + if (!genConfig.getCover() && FileUtil.exist(file)) { + continue; + } + // 生成代码 + genFile(file, template, genMap); + } + } + + // 获取模版数据 + private static Map getGenMap(List columnInfos, GenConfig genConfig) { + // 存储模版字段数据 + Map genMap = new HashMap<>(16); + // 接口别名 + genMap.put("apiAlias", genConfig.getApiAlias()); + // 包名称 + genMap.put("package", genConfig.getPack()); + // 模块名称 + genMap.put("moduleName", genConfig.getModuleName()); + // 作者 + genMap.put("author", genConfig.getAuthor()); + // 创建日期 + genMap.put("date", LocalDate.now().toString()); + // 表名 + genMap.put("tableName", genConfig.getTableName()); + // 大写开头的类名 + String className = StringUtils.toCapitalizeCamelCase(genConfig.getTableName()); + // 小写开头的类名 + String changeClassName = StringUtils.toCamelCase(genConfig.getTableName()); + // 判断是否去除表前缀 + if (StrUtil.isNotEmpty(genConfig.getPrefix())) { + className = StringUtils.toCapitalizeCamelCase(StrUtil.removePrefix(genConfig.getTableName(), genConfig.getPrefix())); + changeClassName = StringUtils.toCamelCase(StrUtil.removePrefix(genConfig.getTableName(), genConfig.getPrefix())); + } + // 保存类名 + genMap.put("className", className); + // 保存小写开头的类名 + genMap.put("changeClassName", changeClassName); + // 存在 Timestamp 字段 + genMap.put("hasTimestamp", false); + // 查询类中存在 Timestamp 字段 + genMap.put("queryHasTimestamp", false); + // 存在 BigDecimal 字段 + genMap.put("hasBigDecimal", false); + // 查询类中存在 BigDecimal 字段 + genMap.put("queryHasBigDecimal", false); + // 是否需要创建查询 + genMap.put("hasQuery", false); + // 自增主键 + genMap.put("auto", false); + // 存在字典 + genMap.put("hasDict", false); + // 存在日期注解 + genMap.put("hasDateAnnotation", false); + // 保存字段信息 + List> columns = new ArrayList<>(); + // 保存查询字段的信息 + List> queryColumns = new ArrayList<>(); + // 存储字典信息 + List dicts = new ArrayList<>(); + // 存储 between 信息 + List> betweens = new ArrayList<>(); + // 存储不为空的字段信息 + List> isNotNullColumns = new ArrayList<>(); + + for (ColumnInfo column : columnInfos) { + Map listMap = new HashMap<>(16); + // 字段描述 + listMap.put("remark", column.getRemark()); + // 字段类型 + listMap.put("columnKey", column.getKeyType()); + // 主键类型 + String colType = ColUtil.cloToJava(column.getColumnType()); + // 小写开头的字段名 + //String changeColumnName = StringUtils.toCamelCase(column.getColumnName()); + String changeColumnName = column.getColumnName(); + // 大写开头的字段名 + String capitalColumnName = StringUtils.toCapitalizeCamelCase(column.getColumnName()); + if (PK.equals(column.getKeyType())) { + // 存储主键类型 + genMap.put("pkColumnType", colType); + // 存储小写开头的字段名 + genMap.put("pkChangeColName", changeColumnName); + // 存储大写开头的字段名 + genMap.put("pkCapitalColName", capitalColumnName); + } + // 是否存在 Timestamp 类型的字段 + if (TIMESTAMP.equals(colType)) { + genMap.put("hasTimestamp", true); + } + // 是否存在 BigDecimal 类型的字段 + if (BIGDECIMAL.equals(colType)) { + genMap.put("hasBigDecimal", true); + } + // 主键是否自增 + if (EXTRA.equals(column.getExtra())) { + genMap.put("auto", true); + } + // 主键存在字典 + if (StrUtil.isNotEmpty(column.getDictName())) { + genMap.put("hasDict", true); + dicts.add(column.getDictName()); + } + + // 存储字段类型 + listMap.put("columnType", colType); + // 存储字原始段名称 + listMap.put("columnName", column.getColumnName()); + // 不为空 + listMap.put("istNotNull", column.getNotNull()); + // 字段列表显示 + listMap.put("columnShow", column.getListShow()); + // 表单显示 + listMap.put("formShow", column.getFormShow()); + // 表单组件类型 + listMap.put("formType", StrUtil.isNotEmpty(column.getFormType()) ? column.getFormType() : "Input"); + // 小写开头的字段名称 + listMap.put("changeColumnName", changeColumnName); + //大写开头的字段名称 + listMap.put("capitalColumnName", capitalColumnName); + // 字典名称 + listMap.put("dictName", column.getDictName()); + // 日期注解 + listMap.put("dateAnnotation", column.getDateAnnotation()); + if (StrUtil.isNotEmpty(column.getDateAnnotation())) { + genMap.put("hasDateAnnotation", true); + } + // 添加非空字段信息 + if (column.getNotNull()) { + isNotNullColumns.add(listMap); + } + // 判断是否有查询,如有则把查询的字段set进columnQuery + if (!StrUtil.isEmpty(column.getQueryType())) { + // 查询类型 + listMap.put("queryType", column.getQueryType()); + // 是否存在查询 + genMap.put("hasQuery", true); + if (TIMESTAMP.equals(colType)) { + // 查询中存储 Timestamp 类型 + genMap.put("queryHasTimestamp", true); + } + if (BIGDECIMAL.equals(colType)) { + // 查询中存储 BigDecimal 类型 + genMap.put("queryHasBigDecimal", true); + } + if ("between".equalsIgnoreCase(column.getQueryType())) { + betweens.add(listMap); + } else { + // 添加到查询列表中 + queryColumns.add(listMap); + } + } + // 添加到字段列表中 + columns.add(listMap); + } + // 保存字段列表 + genMap.put("columns", columns); + // 保存查询列表 + genMap.put("queryColumns", queryColumns); + // 保存字段列表 + genMap.put("dicts", dicts); + // 保存查询列表 + genMap.put("betweens", betweens); + // 保存非空字段信息 + genMap.put("isNotNullColumns", isNotNullColumns); + return genMap; + } + + /** + * 定义后端文件路径以及名称 + */ + private static String getAdminFilePath(String templateName, GenConfig genConfig, String className, String rootPath) { + String projectPath = rootPath + File.separator + genConfig.getModuleName(); + String packagePath = projectPath + File.separator + "src" + File.separator + "main" + File.separator + "java" + File.separator; + if (!ObjectUtils.isEmpty(genConfig.getPack())) { + packagePath += genConfig.getPack().replace(".", File.separator) + File.separator; + } + + if ("Entity".equals(templateName)) { + return packagePath + "domain" + File.separator + className + ".java"; + } + + if ("Controller".equals(templateName)) { + return packagePath + "rest" + File.separator + className + "Controller.java"; + } + + if ("Service".equals(templateName)) { + return packagePath + "service" + File.separator + className + "Service.java"; + } + + if ("ServiceImpl".equals(templateName)) { + return packagePath + "service" + File.separator + "impl" + File.separator + className + "ServiceImpl.java"; + } + + if ("Dto".equals(templateName)) { + return packagePath + "service" + File.separator + "dto" + File.separator + className + "Dto.java"; + } + + if ("QueryCriteria".equals(templateName)) { + return packagePath + "service" + File.separator + "dto" + File.separator + className + "QueryCriteria.java"; + } + + if ("Mapper".equals(templateName)) { + return packagePath + "service" + File.separator + "mapstruct" + File.separator + className + "Mapper.java"; + } + + if ("Repository".equals(templateName)) { + return packagePath + "repository" + File.separator + className + "Repository.java"; + } + + return null; + } + + /** + * 定义前端文件路径以及名称 + */ + private static String getFrontFilePath(String templateName, String apiPath, String path, String apiName) { + + if ("api".equals(templateName)) { + return apiPath + File.separator + apiName + ".js"; + } + + if ("index".equals(templateName)) { + return path + File.separator + "index.vue"; + } + + return null; + } + + private static void genFile(File file, Template template, Map map) throws IOException { + // 生成目标文件 + Writer writer = null; + try { + FileUtil.touch(file); + writer = new FileWriter(file); + template.render(map, writer); + } catch (TemplateException | IOException e) { + throw new RuntimeException(e); + } finally { + assert writer != null; + writer.close(); + } + } +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdpb.xls b/mes/hd/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdpb.xls index f01aba31e1d40bdd719ea46aa36a9b372c753722..55c259ac88d17b784ee9dcf526835f9026636dd3 100644 GIT binary patch literal 192512 zcmeFa2Ygk<);7L(dLRKplg^^*DNthHv%nl)=?_BrS9 zp|H~r{;S>@#dh^ke3h%E!AgJy?u%zt&sS3vA3PIwwY0QU2N&VtPb7f;-}S#h1Ajus zVD#5}NPbBENbK`Kq#&f5kq#hLMhZa+MXG{S6$vJwgdtT&s)1A!sTNXgq#KaxAk{^x zhg2V_0a8PxMo5j3Tu4ojnj$qrYL3(bsU=b?q;RCxNNtdAL~4uF4yip-2c!t3NTevF zj!2!5IwN&K>Wb72sXI~+q@GBE3Uk5qtEh*XTkKAn#H45XPzvyf&Z%|V)r zG!JP$QVCKVDCMH23oXyVJzvy7!8KmBVKKUy`=E|1i2p0fUh%(BrJ^iLtohlP6KdYu z-?h7P%L&z&WmGnPWP|A7CB-tY6mn4-TrPr~yjVdwq`4&1{!`N7j-c8*X~%LMPr2GyE7t=kiEq@uN)=n>u$3F~ zNw`kes9#1oh~g@TuEy7(W5{`0*0al{l^ggZFX+p=0T=ZMJB=jlhK>fqRoBC5WB@nv zQZGh*;#%t&bWUq(c#02u+xJy0!QL5i%|Nr;+ z8~nuhvhdaNUUJ#-pjDx#vfyQv>-hG2S@=3!zw7mEd0k$4$F!iAd)y@)cHq^|p7qUs zDGTmN--BZ{%g7u2bv)Z$mh1lH+Vy0otLIB?^qum0JJ4U=_NKK%r)S*l z?bG?_aQ&{qjd~*Q-9EcqPWZZx)a3;gfk$Ap~-xTigt{>~29^18p#?NHBO+x>D?u4#gmef<<=F}4+$S8aJ8Ti(}} z_p{~wZTSFOKG2fq%IZJ6qNDteXTA4s*tY4)XKKw}V-+8l*e9v41c>!ovV9lE?b`P#kj!M_D{^s5d_eyxl)vtWMp8tc;Ux*sT z#r-O$>u~Y~x&9shjksHJ;<3x(#$Tb>L9&)y+jAAPpL=5LNeXc-wYXw$f}KG@fb!+u+W@&U?rsa0v`37J_1 zV{`MTrsU>M-Gr)P*mz`BZVz#DlK(#?h`lWS?~Rhu`K9xF&3&t1H?irVDv`d?0&k`G zzp412-K#1)MV*fYBof=47eTFb{%VM&D7T>lmM6xKh{QIG1rCOO>JE3r+$!lu@4f!A zn#!||yd*qGvCAOgl^o$1DDz*YA}lhqEza<_9N}%0I;w#W{}HMVz{cG)m~g7%LZ>8S z6R`kKF?gn?>Oe={nyRS;`506@r1`Xr)_&?JO?$_L zffJn5uM>TX9z6J}kkcFAG7^>BJn(r8;KY~50^V@aanh$pzgXyVv^wKk#=$k>JL!#l zD><~6e4X)~R9eBtZIH%dtv{~C`%_4f@VM06c*vPLT0u5|H8)b=c?zD+k zghomrPl0rV_7T?l$Tjk729@DV$cka3BG9_xAP8H%NiHC^aS8TGuAW*}lg9)!ZP!#} zqLW;W{MzFj2`5QOE^ECuE^DPWE{__05k=wL$jS^tnB=vp9xxE-+t*~;1&3Cc>J6qk zuEEy?*lO0pn8arOgyyo5t$R)g*PbV|ZsgY(`mSd!70U8JaY5ramC!1YkA()ZB+~*! zTs9m}N*ZEYWe1PrlG^FYYu9sv<(Y7*u3gWhcF{@g8u@in{>9@t1E1_IRb*DH1$`Oy zYAH|iNU`a7cR|yh+W)b+O&j^uQ=XwZnkM8Ixly9s1}A41xKYX}uPRDMBz zcPh#+rBI@A?R62ZBL7P%+VZnrP(GZKvJ-w;a8h-`|Nk>wrLh{9)F(!P)C1igFTch@ z|K9L+Wx(5%0dHRhynY$*4rRdGmH}^A2E1|^@UrA7i+)EzhX<3wP7M7tDg!R%@y3_( zc*C2QK_{{dcqajGfw^6bmtRG1;Xm1r)pa>-F&D{pNjTO&5?<4U zyYL9FV1wJ}b5p`oKQ=o-xx6GD!>)9&M*r`E^W_I8e^OES-zCrgqf>sr-+=!5nM;0~ zT{RK?2><^q9(eglKhq44!rqQz!J+gq?70QzB&TuF0uhfBytz*2p0Kd>mDg8R{A!Ew z)zpBer|)UJr?KMKRlpnQaGRX2GT?kkN0W0h9$^Mj4=oVUILXrj^Pv;GrB27t!;L~7 z1bdP`fbsGI&z$%-#3MY)vjC{ z{ZdcB!y*3}AHeyh1}`67pM<*vNd9NSeqcY5MWd8|1XXr99s4qJEs(CE?!kNVqp0 zz6^K9$Gg1}?yWZo_ogr5-t@Uq>!}B64-#&rBjJ(`jMJuP!i7CM!r^Tk;okDJ5q1ms z98dd{_U288>n|a{fiL@!FFBp@0lwZ}ntzl1HkQ1 zY#J zx5+8>;O$Qg{oC-R{d?1qd@Xb|JC|^ael)o3FYCCL`jK|%tOqfVIOxI2FG)RP{MzJ~ z{o-v`2Hb|0`thbO+iQUv@r*Vv*y!+pMzkvk54?P(B247xWDdib$LAWY0*!B)Q^F0lT+%= z+n>w%2y|@tQlE&fb^U03rQR_5bhx26>fhTx82EZW8gddJ8?QPYjlMCy!aem*`Bi?L zK*zW66?WwaxA-v)KhSO`nq5gbz5NW~DwjDn`qHn$u5571`6J_G8{EL3p|vYO?t2*c zHn^0>YPX>xewJ`+ze~8ZAC&6;%A;LyRyKL0eY)^T0$m>6e%LRtTSFex&wIp0nm%Q_ zoZ73!6}sJe;9Kob>cOC6@YUh=_(Z~Gyk{McQV+6S7W$eVBpmjs>p`7Om*RFl*2 z+crCtbS(C79~U=4UHQrQP{J#j@@Raef3Wy}4|#y^#g}#kd>dTSci|H~PJR#a=zhtN z$7WX=U+MSIUftddd58~ryxOb5z3?e#sF$3a?u8$i5vF4Oi+vlZ9|=c4>iurWsm*tK zKU(zW;jaw&HGG|p2i$u;rT#tqk_W!GT~W`P{2umWX_tg+@+zP-PQkAAVi19UobG<*WKE_bfA#a8(-=fda&sS9v*rVa6IvndgGH5ys{3r^;bw4a9FJD7aP9h>pg#Y z`)7I1CH)v`8RJ);bD4D1uxKUPrTE$5{9LOOyjqyTeNheHq_5MF^Mwi5>Db{q9qasJ zZI_fsw#yP9ddx?Jd-65$J^7k&PrjDFqrsDoVZ&9pH0JAHSde-rS&YWv&OjJ1|td z1X@#kh*BlK_F{oIE*;;s;&!b7Zl?<1cB}wyR0VL`RRCA6^sY^3Ts2&)&e~J}w`T=# zn|R1DGs#6Nfg)k$Z5!uH(h^lSPHEZ(-qpu8-( z?7T*M@FH1VF3F28&EwKumhtA*1%=nj%LQDsUC7vYMRgRz&ERF1l|jE*-#Y$uy_8=+ z!J|Ie+uQ0{-#-5NHo~>GbtrJ9tnBaK=PE{j2cZuMD=kq=%hqeW2QOp{S-tz9uLrJG zFLQ%t*la5XxcjPa@0n=Wn3bx|8-A2Zh(li>Lc0FRT8fT^$_G`OV~Ix64r;^@(bi)w90cuDEGz%4)6e zt;60PxK>%carst_Nw<7l86i9QoVh{v_J)J5Y1^BW0K{DhN>~i(FRR5`9pbfF={AFUn^|mXfSXC3?Ge*N1wA@TefU5bl@?z zv~lDywzP5NF}4IzzP&4TD#oA&^VU;ml$0gA-QN0F02i@XnRM;GWe{*p-(vN7di%w^ zXY(xrX7eoqX7eoq1`fQuZ4xo{UyR}MeS0M8m!&^@JI4UmU(s!>k^ zyRzi9k6-NLSo#ndLk8)GqdI!}QG5O2MtzRIO>Xb;U;51^qhIC**~fG&YRNIp`hEKr z8~tkZ^}&rseZ8-(_N(``)qeFcZM9#0Oj}{zea+1cQ+MU-d29u66Dxo_p#r!QD}Xzx z0=P-#;I^~*<;lSH!7h-$;v=N&h>DWc(dOGXD-DS=U3vZZK0o#1<_AV)TypFrJE1 z+c4HDc=uX1N-Es-b_u6}h_gux`|%zFITfvt`&Sk0)|h9si>|d){KG@VO#0TpgGm10 zL8Rb%h}grhLJ*O5Vb_Vb4HcDxYu9!0^$2GtGX3u$GUM+cGV^+f*mXS%M9Lb2_Te)d zxD^^cbN;G=UAgm&Cix1v@E@=8M}s}unU5OIe#koU3Bs5qyj@KRiYn}C>@8VvJw)uC zvk*j75l>Sc#szhF$N7s;T#;7WJ9n|D?=_Etm(ZHGnwFq~RFi#_dJ!=vV|xp41Cg?Z zx?QEWUk^jOaV!a)5`d*{a9MbmDxK=dI zOE}?g?6~VHfV;jNT)WU4gwRd{REyErkeKS%)25U83VvN`a_VXxk9@xT`y^UcfDwGxI*2;rPvkG)6U1a5_U z#7<=Y^$@YE^nj4sS^ajEz75=psMKEnoeI{s%lfV%tG5HRci($u@+u=JIAjq2Yma%j z99(;&kCZ8hm#K)grM=M~l*7v&fE*RLS_ADGIaa11WmNc3RIrSIsE)w^!GCEL>;`!p zrJh#pQ9-s>5;50zc71*1C8kb<^+m^*Dy0G@^kuJqqJs79`u+sQNikd zbPYQ9w!OD5puRcBVuF>H;kf?zvK(ByTwj+fm#-oZ#@i^dmx^Nv=TCt_Rgz7Jy!tDHIx8!KAdq&^vr;~PMOE?D zZS*F*eDLg#`|;z)OY7p;@MWK}E25<#if=Tl@q0P(+z$`9SaG#_H$LfB4d?u76wX{* zC@%c=iA#x|p1;tA*LCj->VhPyivLuTIxEJb+VQl9mzUdOFd_@PS(=F zk*w8P4i4XW@=Gs;)OThocJEEZxR+t`_`lZCW(Bx|t{3t5*lStkpLa3pKB zkf@G#z5A(`LYg?UaI%n2jw~z|Vo2_%G%fKjy(_4Jr_=NIFZEUC6$iu}oeEUtZhWq< z8Ao(r=7tS-1=aIJ_N|Huj3p8^6knj{CsE~O)yRfkt<+DTvsACr!mL6gYHOk@r zPat0B2=puMyKT=&=;>~JoUf%xfF@$+S=}H&vtWxtl~!gIcE7z!4WkOXoK*tx^?>-2 z`|l^-6%^qqpjsc_IsQFfc9CAsp8*`+cjT17XTA@4H(owbN)+hYrapWbu8-1f((B74 zlTdu064Xb43v>EiL2W!(aSZwibe0-p)0p4G@U>9^W_3xTy%&i9gG5<8Umy$1Fq8(zqy-W*0%Tyv9ik@5Y5G9X-jE-(w`>++&?Q$&}w? zB;(v;oju8v-(w`>)MKHTk&MC6tz6Z1bLj9ed}X-NUHlvy$5YvMBQcy*+s%_q`Kl!u zXVrH1BvZa>Nyb^VJv_;juUe9ER&7sHwcX2AZFfi2_A;gD{+Fti7*49~?MbG5)sl>} zYWsMSDPOfD5Ea7Td zm!I!}2k?zd%#D2CRmImtTXR7kxnPgn-9AQfnWyKD@3CwcZ zleG_Yt@Cq70ix4yF7ZXD+d?6KUx+avK4wHf+&$}Lm-{KhN&@VwKxv?X>1iUv zX(B$W+r{1$L@!J-@>10XFcFqm&7H4h>!NPLYumK47?QYq)$gOct*jPEu*7O*vZJJ3 z@!7O8nX`5;zj@w@Np`W4og3_?cuMS3Q?PS`ooQL6coAHem@kU!mQ`^B_ftlc1bZvj zCm728_ryKRzhAq!*y=|@@eR2!BXfJmW=4Ju(SLfWZbte5pcRfXtFv$H3(h7+b?dTC zQTC3E5iPcoiZe;kmD@?RFi6pjqdU2Q5}+vey)@p7RJ=)w?%dv})&?nyD+f`zMh(Sp zgcv%Z8@Ef+&Ztfou1Ny39QMSUUXqM9Ns)}5RHQ+Q@tsBrn}V0u4YrXA#&6!B{LAdO z*Ld4-B^VV;#J-~DuJ}n3-H`Yx5YvWbPPbv1(`{Jh?hG2I+-VtTAdJnwFeoM&Ke?NY z?>vvkPv6WGPch;f(6f{x{8~nLm{S&hNR&SfY+?)tECWASQ;2A{i?Rw!v{e?`Y&L%+ zHU{+K@x#Q~%0N&|2d5%D7b>fR>L3Bda;bP`vX|*_qE1#xcL^wu;i~}ny%lvr%K9bP z8%=tSc|Y}bcWUO(%d4alwv~safaSS!QfJRuK9;aOM&s*f<`7btkow}^aKyKBrTSZ7O(5Q zSC`eVyS|+-W#d&ATrbz}qItmA^Ljl!Po447;n#C#9i5&a_8-zCjk4sh)7SI%yI%jV z;C8&S@_z-lm+O3W_{O2jJcM(= z@~&U{`0Svl7n_Lj8hEj}Ug&X0@aA#tcQ;i6FMbCBef-WpG$-YT>GSS6_VnRDd>^iJ zU#W5caFfq|cXaQ17xw{X$J|uOB+9p&ZbW+fwQ5Q|yv4kVjlViW-9CEQkb6ee>{HtJ z?27k7x(~WL;Nh*G-`BMAL! zhukpjk)VeLeShr!BPI9k$ozfxl|vg}T=vqbj&lkQb-%p%!rVXZT>5F?J?Hm5`*=y@ zsFp|0-O=Ey7mwcf`CIQSeQW5KuYFkWwf?8-R-r4o+saJ-4_x8h+e>k;&#~p)WN1gxj+{lzU>)wC++w;qYB(!OM+wfPbuO0f> znseVxe`omzxn1{^{_(=Py^nwP!0v8cy1&?9`u)!~UaD@1uDR5=a&-N@pRMw3b9P3( zx{DsX|EK2;9~n_&WblSAlYf5io*}+7-h62DpsKzFN>-!O_mA3mE-G;ID^0ibD88`# zmis=abM(hY-t$?}@1cX^R-A2h+lN!058VB7;>ah~&gxlp>DH_1Q8PcUcm8avsw*Fy zxns?cDz@efBdWa(__|dtnufs2L_}b?mPFHE_b#Wu_&WK z-^gdjoV?+#%SUQX-E#81MgI!^xb>k1_0+yIGea(|n^)9$^yY;*Pfa=Z$)JCqd^2VH z(NAVZbopuW_Ai3Z@4NEdwlQ-Xe>>ybj{ADMJB)s>UB`u57`$u)-uoxN?+yo=3$I&$IE??2Z6bA9jcPL@{PGV!PHhWxo} z-i2CK4z!wZ+sDnHxv$PGZ*S_?GpR8C(AB$Uy?Unf!#%mHo@(+-gDbIjY>HhO^K$D; z>w51TdUo2{mRajQsXOAriB{Fm-g@+pobA(Y-`y|$w&w5dzkA@@H#EHa)R?SkclCI( z{=CdS?Uv*QU6~l1H-E_Sl2H%%EcH3GV9MU*k%wDE9o|y#?75lg6O&86X|jn&hAXCL_J=h5pgoTz;4wcML$4&Qd?h2!@u+N1QTvifEvd+eE) z9_{t~KOea8XI$@sF(;pQH@Z@?2rr$iE)86l@nzR|rSio_7?*qCN`jOHYCrgtJ!&?&Z&97kBy$8B)uO$IP>`o1jx)jI6I&a>lj8pcjM$!vVBDR2>jyW?QWNnn(0zP6I{y0ne|F7pdD#0W#cFh zP~(;O)t!|dpa&COO1De_nz_NHd|&KRdQNsJ?-vWu^Wf-G7K{IbCJE5b=`LjlxSm65 zoKX*(DC*1&-xt3=4*}X(tX+mHQu5u)A6%|SgYT&-gTi_^2q8WGMJj59Y~14FdlQGo z{t$mI_PyA)vp*TrCbj^9t^6fOCFz~<_m5~Yb%%TNxRBC3_n|eRu_M=+RH8sdvRhm{ zHu1TsWU8!Ru&ikH(nP`;b}la7I`7`ZkW#|Kiz4DACQB|ae@_IMeD=>79p5fCc=d2|lZ3jgZpI%fk}bQRK2Kc3i^Y)Za&SEV{hhC&HAdBP2RB zRf%mQDC-^QAAe)Qs!5mQ)d)%%ns9NZd{QGOO=vY)ji3Z-#Qe2eC#ezrM!m3n)+{yR zqs@;j?=@259ZJ2pN{y&Jf6c1r^VP{GRz+gJr%f#DhLjeMY8M+)s+X}=kJwqWf=WYU zr;ZD@XuK07D;RZWtd6<3*xo0yXJ*Z+SE^G9Da~BkW9GT#l)6W3PI|r7d5Z{QrhH+8Z@mId*Ze>_t!P6$zDM zJ!$+}j7=C&oi%ItQmY+w0Y7SbMdGokRT5}BFXmkt)i$GOgXFikxPi<1i?9t{!KqK) zk8@Lx;}a$sJ_?MCF;b%4m0ZQO(sHBM3?hlJI+`*@#|KGn4bf zBU^_m!C3sK-kV6AkkSae5!4dB%to|RI;3-R703liskzy?`Fgdkt!sK#+q5Bnp&Z1^ zM=TuAUql;#KYm>V|42lzp6O0DXmo0g$-rb>I0@5GK@u^h<>nM-x&rZoo>IuJty!Ia z)sNCtxB4N5Tf zXN~rg?ty@uj{R-C@T$162Y}&RO?`Cx6_L)F76rIel2Z8wti-w z8$ug$wl;-^m=GGKcxPObTuk$>J^yk%_O;N|tkl%pG%JP99uzvau4)w^ zq?BQX99c6))rbu*5)&X~M_^Hqlv6YCvRloI=-7eHnHXGs950yrb*JKMk6C4;6e0!R52X$aH<7KS!w78AHAxE>W_nTey@*NAZZ4R9%9!S6{5gO2$fBtECroy zGBIBr>KIQU=C75iP)F2*Fd?P4yVG%3Blw=l(Ah#U$!Tf%?t%jNTx$>B85=P+daQ<$ znmcWpJEyRUA&rajv)6U;gxFTyNCYp73LO7sw&=9_T@Q{(6n13OJjK3I#dnF?b<& zepYID=e7~_Wyq$u^FR;vTi5ENr^BjcN@; zHV5F12~{UZNzs;^q->1<`bd{EvNP(4p{a=~0Q8%cVM1ZLC=AZ-jGdX^YW(|a?%xou zn1own41;v01LVr!pvfA@-^;$xJMu&=kZ%5wC>+XyZ}~a96ftCOH%Q?6zO?9Uw`TUSi{;9NMBwl0ri z)-Csv;>HY;Ec9luir%}Sa^5D|uv9srxi#NuY zYQ%4ea9@V)FjkZ6qSZMerDGFkU=jY&st)N~oG&iUT>9r~E~-1Y)l@4TZcC7kv^Y;1 z#C45ukE%ER^?9$xGZJ+ff7~>n4fCvybO()!PvUy)%KZ12pPM*+R7h!(*t&^Nx@F|I z`R~jk?&=)51Z|C3uOm`lq!^@Fq!maQK_th3PJ3j0gGYU^U`t8T5ks&TP0z-`rCT9m z{`hnUa%wT!F+Ogb`XjvHKDA7D0`o;Ee9U}gc97r^EETUr}@s8*7f zoS!^RE2HIrnO2sX=}s%kcIRt_zALt3D^nwxjGfTj43uya^ql*6Qsz<&Z<5T&&q@P4 zb7`+k2L72#F+J(!jBy-=iP3$gI?3LLyvuYBuv>Dm>i!-(C zj|-^_VR0_el%T{yaR^MWQ^whB2s{vf! zm=TY&=LBZHxg2dx%}y?0D6c^|5}+FiFe=Rd;FlW0Y4@?%b zIR*s=_Gl{MC9@YSqufSWn!6wsWtC#L&0{&`0a5fLCPR&^=z@`nU#|XgZJzu4V#bL@ zDVTkWIQNRyU5X!>h>%uQvJgSKlhajZN&N;47%@6Fp}lrTDSA#;`Cxo#0-GSK zv3DR7i?}2;3%IVWfvq)M?P6lu4IJpo%@T?1|u)b%||3y?9R+e&1Uav#T2^+!(ST$ zo51txDo7mlqm|fJlbgqFXXlbEhon^sP)-;bUZhD# z#|MM6wW|<&QMXy$eYJ=Jyhc=j-cJ)sEEG>}s5lwIJl@UrDHdSuI_R1Kf zA&_?fP6q~|G(i~;8yW<)SHjE~fsM29jBzO+6^APkMPn0NWAPk;8FIK|Xg>J}KVlF3zmPfQ3E!N+PY3dn}rbOwURy%;XjxLlO)D zP8SVa(-4+4bZK=sqhQqPHR!$3nLdgqDlI5LXY*=`>qPOBi55{3s4?u5u_ZY?r!aepL0X8 z4HPsVlLR#E|GbYApiA!HjCa=@S`$)QDR!fKMPjuS{~R89sOKimS{Ru6MQn0B>}Yy! z{?y$3GHNs>{d-TtlH4Cz9n~eGHY03FKBip?^aJ*D9IH$Rbvr;j= zVWXd;x1lVq5=*1xxmv-fD|13h>1WPOj2S_Q^f@7=J4at#moSbH-ScQe;>A3PSdrOm zBxbTK%xIj1(KqC-lcA`!4b^MzBrg{`XHt=rfKveGo&vXYAz~WgSq--kr3ZE?)Dq-$Ww*%TcQ9Bp?dI%U#?9`UEfBAoP55ZERQ@5l`aKcpIr^top4p>Sg3 zd1DeLGKMqBc;Xwld3X+saB-1YoJsrmDE`s79m_{!o#Gh{^+z0(s!RoXA$%qeE_3iw zt{d}oHo9dxh}6gLqV-bV4MoFAfDLB=nVFoE!4Ly-7iThZkY=T%6s1l@SFq`*ardNg zi9=^^n}-@%#f6Bp5&Y80N8&8oT#fzp^i0o{gsFIpxN|z@!)tCG^ssqac6o!hJm9W)D*y#DQApa7L9fVH=tCT*?D+`j9v@N~@zs z@UlZ0JR^K#PmfE$k_#bhQl1FLHFSDI;kPs?Cbvn2 zErQ9dMQl`YCiT;+V*Min!~P53^hZX;bXMm+fELkP*)l&8$_zEh$G2!T{a}x;* zE>$CFQ+N`~M|~V{ykjPzqu~f`;L@k8hAwW79a;mCXKmn-0-B;VOH3qa`RnsODwbt% z^2_nw1lANO$r)5H`YApoFTTmtJf2hL;iM0ak>`!TMqKYD?zPQyJEGKo>@i%L919xGghrkGge9|$Ytelk~YXmxJJ$_ z)5x(@Bd3*V)ut`HFGo( z+B=_VBD8Wo(?IyVd?}8wmoIf5*U6Y?yhgM{rqyuxCTAF<8JbwWRG(&G!ZdbHKA87! z&B=u>$dAKYOuy5U3$VdJ|HnB~pIGq*Qbjzo9QiTu%Ly3w)DJy$k}?)|&PVno;qv${ zacack4Hxo!BIF;$`e@b3F?`Ps=9KR)EXvQ(ylI!R248WeKKMB2pf#nh&nwOx7F#9Z z+`~4*C$Febju41sIHSr_IJI8vgK@9V z+b?#-U;(-Lv;YLHgOy>}vE!023IC7A|6IcJ0529{%m^&*Wj+Z}W*RKBl2{;bbT7nF zt!M)U(H_YgdNCFkWZ%?b2{LF#p}7LlVjZeOE+)+S)N3<``kqS|&4IkWtXC%9=!~}t zP>|_3`G2wjs8IZ zuJ;40QZ)#f&=YBeT#jLlitWOY17ni<4^8SnBBs6UJQ%)M!Njz{>6{Q92f-z*B5kp2Xj+8SRe7uMx zQ79Kn3zjjo$Bu)(Si+$kHo}@qU5tb=ESsYT^yOPKurvML*aPj6`=SlR)pB@-G0vCvH#mIzR@ z(hvl33!9tynM)6@Y2cFh%r|s-ROj$SsAsLt!RLX)A&7yZ;fPnFV2wNq;LanAna4qH z?mc7oRr(HdbI^^IQ=!dcgp|_r(BCdDK8J&|T{zeZA4`Iun?35+c+v$&(8b$9dC565 z|3lKGDc33T7@?8kk4EEFPx;21cIbiipXqS9u{{9h%8l&;7%ew8bKvc`DrB%MKCF)S z0rjg?@$m^#-pb`CEEQ#39=}mWQDzk?%5H3@Uo|4Ii4o zJ@9sXTK5Kgb{O|lxYu8*C`onj5&vb1@>N|$X@3W1@p_8Vd%2=4z{$zt6^im!1AGQ{ zrJ{_+NycW}KgWI1orQSQNVcp! z#H%pS`>(jWp!ei^!5{Yb5(-r|0Hn-+uDp`0STIyYuNg=X9BLFm_*Q&B?#? z{j$af2j?fwhek^AnG#QZZTWE9g}u;I7xX*2LP^SZXBTv6&;J*%IyB|Ah>+WVSn|rE z_vel}@>-o1#T~Y+9?;?8xyqUF`I$}Ye^UROPe$wysPt0M;zxeC{8;a+PcHxM%sm%e zweNjA;I+>O^nEAuOmXi$^A{di^2oLpL5VZ+ZhLt4C(k9lJo5dAd%YW3f6I{PBi2^0 zy7a_|m*bx7pZ5NNYDaD!^hu|b=JU6$xi#r{;|-hZp6)XIgI{XL9q&5%$yJXYD1GL& zh=ZF)?3@2o+jE2ba=P9#JnM^;2OsTlHvW~>kGdZ}+UW3eFZ}l5pJ$m@bBmem1__?!-y1sX+=CS*Rg^q8#DKPX7_q*+v?z}js?Y8=lemtbX8*Q`C?5}nH zs~L3;JiD^SsiAKbjGEi**y<(QpZm=9;d3`0Yw|u>+(CoSgsPM#8W{F`5Py)tX) zAtkTQ!uQ6kYxC~l`LCR8ojE4@(yeQXcYgRp=LvI`T>X0C!R@izKFB`z^tgut(i+#V z{Od0t-;z4@jeYf3ztQ!Ei!0w7v-73%r$gWR{CMq)fBtj(bGI$;`oM6GWblB!w>lNJ^fJC zA%DKQ~g4A{4}ZqJ%;FKO~_%>yG34}Wga<&Gg=MQ*$N`x`r- zO6oNLsrS5}|M>O&s`zYAET%zbm2@2BTB6}@ormNQ$=kBspe$GRO=ibp{!>pL7N1C;| z_x$qWOrLohfAjO3-}CtsuiV~a({In7YQDQ0Ty=54s|`Ay+#A27M&kobV#ggj zy>rJMbNg3GZ~DaNv*H$PYxZiluU9U+XLsl6eqScu`g=@x$9X${czXQjO_w|r*yrAz z5f?^((WUQ~Z+1H{=OZ=dY@18HXDUtZc)!uuKEJk~-f`fbMUC@jJ^s=UqdtG(%C}SU z)(^gO$WO}q9plgZcrNtS`+seC@FTw(@lzhy+w)wH2fzBqv7E#&PJQ_OoQ|I?+iT*`Xk?xJ1qys_cxm3MybvU%%lzo^t(pPH4p<zPHPx&Eh zZ<)U2`72#sneqAapI_QB<8!6kgDXOhu2_?J;pMUt)#sQuE3&LBRYtnA{nNb%y z?a0qtvo}4o`h>aBqkApAHDLRk&kC=sIXLvD>h1}zjz1DIJ8SCJyappLHUIc%M$NGk2Nj$ce^^H;t4h26td(BW?&ymz9$T5YwO5Z% zZ(jS{vUk5~IDFFM0gJYDe(+Gg!wna#J$`z~Q{!I?3+fp4Ve!sBZ9aWy`z^ha?pU6- zVt@0?Yd)O){!K+^A89(KcFp%^eKh&-g||CCG3LyNN77D}d@^%Wg8O*4B@@rQ()Gu< zuzgE1R;(Yfwb`(L9ykzJc(lqb@2*WR>A&f@MZudkpNTxM_nWw#>oyF^Yh0^M@@rQQ zrga(L=W_Z#M;?q>*yGa`<6i0z{_W8P!-qV#(w#lvwc+QQ?2UW(z}tI{_&qaeozLbe zg?(C&Io_ns)yUR+?|gFVfwcbpM;8^l2Y&M2?(nbmhehIbtyV%=YF4N_qYD8q;jo-NBfT-{@U)6 z+OHn1vb6RKSC?c3wRz#SE~Wn6kCsk*Z+yL$+s{mR>{8ZZza@VTd1K+~-r>Vq{{Eh8 z%%RKehuw8<@$iA8Uthbi*6e{*g6n@>?}e?GFDY+S`+DoWU%2<4j(zhVS2kxH4nGnT z+xgU{o5y_rN|(T^-@muNWykPyA0~frxaOq}gF1bf-?Q;cC);+obn@}0vrl~uGZ9kXV<1TX)xo~QK@y>)_*AE$+fGm`d(>VtI0F} z81(aPJ-)ayGBIq5mWxF0g;euxuHOt)e?E|4LW8VIH?ev`=PkAGKZtH1B zKlN{Msz&?6ciq4L)D4}APi%Ve+f5T*9-exkc5(K!{jr@p&$yI!$E$}Q>2{>f{tX?n zj*XZ!=VztCE1~N<#BY5hxaF@aT15PO*tf>xtN&Q{@c3Q7Ax?Cdr9|djREeqdYDCS&mlsYC%FX>?SG6@QKU;cu`%&M;Uvv)b(zp4jZ@&wD zvTacN+mm;1%zA14{Re8KMxBhze7s&zkFVC=dhfnzFMNAvbX@J&WhZ*3?U=mq&fKow z)yh~iEIg)V^SJQ#ksI=>w7U83O^5GD_^ss0ZV#^-^F`B#xAuGMrNcum7tMX($NSVd zZ!~`;rP}OcO5JrM?=5}i&u;aWWprp2?Rx!` z(R9_Po%o=ZbL@q-UYEMG!?3;vjLRcjntWJm zd*LB6_kwYqVW)?6xEBm-axWOx=Uy}XD&z~4fa8I@p%T)z*Zr0o_~@C`^6K^oTS12=`OzPiZrkj>4hn2u+Pe( z!M^LRvPGnU_YS-;B@Onc6OG+)y6o4+s`W2Gw6QKu3S01dsI**=60Ty8L+FP6Zml7o zu{Z4#fDfp$j9RJ>d0Z-WC38MXCr#GsDDy>*e|lZ&oOV(cUD}JJi!%k#rEV#ILyR#= z$&(gssVrKwDM<@^jG)EAOj?c0pyeuu7VS>bY9eTHJd;+FGHB5zo#Z;Mge!hfcY+!Y zJy=sGWL(8R%GTo3Q2%uoe!mmJTpR8FqT%4zSh^ur>~`8y#S69boMQ%+s&5 zx8c#Q*j}mUWpb&A(vC#&A@sC#9 z$EP|z0>&#EsTUIadpY6;zNDpJX-bsZ5D|edhYmlq)P#e`eK{BBSHneF8s3>9w$Y6T~2y-7%kHd zqb=ECoIva_T9+M0r)7uH`PgC9g&l^&8!s4xQ#&34dyFX0pcDr?UNC+yq#cjJi5$#|y?qh82&22Cp6}TeurvOF|Rrp_+d(xM8REf;~ta6*#?A^DjU+ zNZN!6mX510*AYLpcGVDAl8$}Dps$We=Q z*R(P_1@hth#*NfQ@KUTJzNJB>mSwIozPptAl{tJNwo1*C9xc>~9?y?Vdi?CQze>%M zLIC9RSE+NEBR!5c(xY`d(c||LnDhb#J%*2zJy6i|*L1|O;6#C6ie^#>5)>F@l0uLN z1&$mi3V5&2LLpdCV5mt7!5$Q7J>C>*0>>H7@#cijG3NxQRXV|GiB51@lM|d4;{>Pe zIKgQ}PH)_3_{`lAqKm5hNI_3O* zt9;1~gNvs@6`KVYX)zq7>IR%yE4~-s!gE!{?_xM%O7KN$&wlwRl|(%SbvUMozZ&8MT+ub#JzWqqHK5%N9{*AY5i~6 zPjU*SBCj))f)XsD5~r||DrRUz6DbKb^X#*|A!gnWlZ`c$;_l!v;B#7FXvPnl9cyFa z!@YZjTI>f-zh4x^#lVU*Yo zqfB-forN973BwNK6kvzZ{o7%5{dO4Lz8%IfV~5e*+hKH8b{O5f9Y(idhyC9Owb)0T z{Oz)Ea<{`cUE5)tfbB5u@z`N>s&*LnZ>%teBfNTJ{m5yZI#QKBs{Yp(p&M~%kI^bA z5{F}^pQ``$*KlZN0YCFS3b|^F^+yk>gjpG&6Dt%rL>}R1j9FEs&e% zBX=P2YQJ)^FF9}rvXa_T!}JBm$|^^eEc5lqAwaa0;d_59xd0^u6O-h?u|p0@G^yY< zIB?+Jg3MuotF|$6czf59!{?VQId}z2jvQ`8J+^@(ksN{q2fo7{qH?E!9Qdg`f3=;F zBL_1_4rY!V%p5ti*En!olS4JZfqSf>Y6p!bKek^5uWm|yoOi4_KaU)~S;&GJ04kgd z*#>$Ea;Pad;3Y+rMQJoS$yQN28aZ+>bL3#=$id8!Lnn;`eGWO)5ga&`hpL@5nw-F^ zs9lU4IhZ+eFmvQ!=E$L|#(^G;92y7?cncO~-87oPfn#27hph&6KLV3v`CnInf0z$6FGO61T+aNt|YA?iqt3L}Ba>L?>e z4sk|~9LzFuFmvP(4@`3497hgq1&3;a1A|ibLp6^!@I1_H1ET>`YJPR7HAfDkH4b4K zhxUR4K8CA=sbe$_JY@{P7f4HfVc-y;jx%z89%cAAs09;Wd!~*DCfmTdg>8rs95{=F zsJCcTs*5%x8acLMf{|kzCK@@m!OXD@lTbzuHE<_~NWp=pI$>&(R zbL5bZGIHR0h8(&G4)}njQe7?3>eT^<8mi8r4zyIm;J}l~8V1ce7z@@MzKK^Y)Hu}D zICK>p>ViWhwMgSo7aaVJw$}v*e?v=k!NFR_Ia=2ef2=%2E!H?N)?*vG2@d$k5jafO zIMfpyW*9kgm}%t5!7L*OGe-`yfJrSeawLcDf&)(!E2*4tonz$4VXl!Q2eXVE z%p5t)1132%z?~d=2oCtnF*wZEs5J1K>e3jakoS#R|-y?@FNLCkV92n8E4ZQ>he8dPG7Hc#c2@Xq)968)( z)L>@CJwNs4zOkpu;vc177nnMHW+Qo1sJu~M`+C@w6+{D z&UY@MwG~E=T3c!4s5P^US~GLh+MU282eynH`U(zB1cy}`6&|D2Qdb)}a#&;J{5;D1 zJ#yr57cj|zdLoBt!J(<(aJNRKso-#rk@E$WwMLE{))_f+FmvRv9%bY}t%E~}A&?49d$$_WJb<~HndOT9Bt3GVxe3g3YBSy~8BZn{eR<{^s z0r)t|R^-Tm_Qf{z7j0-MIBe4}TM7=38aZ-!%*c_0nInhCjWTlhCvwLT*Yxnk$9z0S zmfRr3z*M4Dki6v>N=IJ5xH(fNF}%XMuGGN6$csI>$6eGDj@ODMu$qA;%ua7)KVz z(*sBxEe|1aEN}$S(rMqcV_Gk*l(tEWd;)1Z(vwI}A?-l=7t+&6&mcXE^c>RjNIQ{U zKzb2r7t%{eFC)Ezv>Ry;(q5!}NUtKjhIADN_iy0-CenVSw~*dO8UqV`2ls?qhL3g8Lbyqe!qb8Tz6Qoa(K0`W*bPDM-()&oCBb`P10_hym zd87+SUm|^l^fl5qNZ%rThx9$t4@ei0enk2=(oaY~BmIJO3F$J@uSmZk{f=}6=?|o< zNPqGT1>D8R^HGjfGwp$!!qI`Iy>L^wRxPs}A&oM+x|!#ua4pLwF~4>ESZA}GCv_!N z&3rJKT3&jj6u$fq)1SF%T*+b6xRUaXKk@X9WFJw-Jcs54%4>j1GvRA1WHmsw|H)HP z^qMkIr7;ncqhg?H|C5;H6X>z|7pT$z$&Xv=fhtW==J0zLDveU+{E(x0${fCMMWvz2 z9NtP%X|gg0t*JC#nF~UWW-N2T$kCvWgC9SM7_PLzAKmb7HbRL;>V-5AId3=IA6p~b zpkcofU7XtBj!V?WognSm3Szr)SwT2k@)IDwrQzr2?ajH_#0tS>c=OKJ<;~fX@@j_L zHjJ$Cr}4?uGyl^)y7jeTY#MvLF$0HqU2n`l!2l+IKU{A9WTfM z20!D4NB>~2TiF2?;s6VEfK_pTRds+>bAW|8z^XgIYB<1ZI>2f|7J%GtlrbQuwR2)Mk8y^m zd$f8y#!=M0Mh^a1-G`j4hj|v`=3-yIe}YX5sb6})linTQiEaCk7_jYCgGoHhc7Apm|<&BlwKi#Tls4mao7E>C&r z$%xZl;Bb50n-@JBaUui`H^{wl=;??PDR8*O?TtgvN1P~u!;NZhndu3M(^24XtJzy- zdPd@O5;)u}CNIzaqNgNIXMw}*UT++FPU3VCIE*7Hk0%{^QsQ(KINWlL1&%MqH~(ax z(z6n$o510w=?E_zdRpRi7dYJZB#tL9dS2r65IEep^v0nlCQeU*!>vbe9C~Kr^b$DS zJoJ{Qv4+!I;BfoT6NejkJupD^4ZH+pBp~`9H}$UV??2hVqc3!6a`q8&x*XfvM8oMT zaGH3vg>;%~IMD*9DR4%5=%4ZVqreFl?ecz)Dggf7J3jZ3ueS^53zA%3`S|F8bq~0| zx?l`GAk53$F7bsEBAjP*yjR014)3+J<&5)oO85UT0B->q!p|zoUMw*~u&n%_{hrnT zxh<6vzl)q6#CuWH`sga-j64JKz17Wf2IR*A#-Z;dK9|(dL1vzPek|akQ7!^>f3uuR z>e0bJ8uYoO9vxxw<6!7tIbWGC2{h^Pm3bxDEDyywvbDS_LnM^z^18UA zY{74epH{J!M`N1Yi}r{MpJU`jJCR>9!{IBR+e#z0ymDW|_8K`gYKJkT(qa12pCOSB z)87|kSfj&AaQaHVY=I8b@fdd4VGJYeFop#>OsB_b-VWomZijIi*I_zePTM+6r$=4s zFddK6at-krZ$;UQ^Jcb#8nnYW?b>0SX6-Oet9BTtQ9F#&rd<|JlXe)VMLUespdH3( z&ko}>XNPfGv%@%z*@stjvcotnSz!#`c#Tr|V(xC?##Q9X{;MJaJ{s%4jl}}T z_`j9+03$ta(f(WP0?M2(a@4cT`5|}M$oV7pzL5(+?ud~K#17pDMlJ|tM~z%Ca>tBZ zCFDLda+Q%gZsbCc`^d-Ajbs=KMHlf1`oiFB>SG9G{r_3_E66$d$IF)zxG!}@Z|_5U-{-4x1lzP zolw%|qG*%Y6D4hW%58!+KfJX`8IDR4?vI?r4*&*vN_ZglHzhm>JIyBnX8_K*(OV9B z4ay*y!r-*%xokUm^81^~^FAa`ebeia zr+kNv5yK|2yG)+!zfEGFnLMd+$&+n1c~Tn5lQ?EO`B6IOcG9bor+ll8i@8m(1!+HA z(47~1+T_Uvo#e^I+$O`W_!ZNVC%=u@A)pYFIFzI+A)uyd zs)n?6o2GHok3?yk^8Nqk%#eiM;%)p~-Qkys)P` zUf2hf7xoOt3zyw9Q$I4iur?hpEN4D1oCV2??xy47_Ga-;kQeUPyG8sIte4{>UXG9P zg4c))FZ^<)whs*g`SOM{KKanyd0ePJF5VfYr{4UC z_-UB$gouv`;N!_i-b{%2;3qE~9}`d~$_G9-0X}{TD&zy72Ty1lY8m81_wdme@VIz} z$Om@`K7#S3<>na_+D|6N_?Q^+!OspkJ|;$d;7gqzANVF_LVZxPAs@QakE@oO#4|-c zXpU|cAC*3h!r7(NAoQsiuiV)AhaU>>GWaoo>|AgHc-dv}Y2@`^Nd0VZI&vP1SRaLd zl7D{yAEW+Fmhnu@iahDwKpHr1LLN$&yAPXT+|#<@?!y+zpF0nq#9`7FZ~39Vsr)<} zoDH3g{4|e1o3k`&>#ji>PHvJ#H_Oa@iOnFOG`KHOX-@*}d+@4}#ar6^vbn2^Nl{%) zLc27>Vxx62X~epq_DFtok0FgT4KUwnUC?3Q5R8hRMxl?|_L&Tx?v2`KGTNs>>S;1~ z+7OMM$>8ZugHIzyvEhl*t#JFCXn4|{i8Kl|U{96u#C?wqFvDqGoQOKwAo-sNes)If zb7I5~_d6;-Y@ZW_pN0`=Q%h!j=$=Kct{dQrQ`+1W*?|4~O8X?x&I;|5gtl!TzM`ph z!Ivu?ZN3_LCw@sTHyx6kiQa&G_z9%wPXN7vvGH@XCHn^Tva3?u_d#uz#;d}*>{WQ_ zm1(H8J8hQ6ET_$K@1oOYPeoarHhU_{)=_o{Bbh z+U%*|$7!>tVn%Sd85m!7sxDN6JRc3Ijd zN;Rv^ap&{l_qytK7zgbN|Wcd=xlk0lyf&y zaaKD6G%enilN_G`n&+k_AvIqTJ_9}FrwL`|8j$o=i=`>^aqMGN`rL#0IQFt-(Q z?{qWQ*}@Y`ezvraow;yEwc+RNh#yMEvxT3LW-hL=Nn5pGntt8P#hssS<~k>$eU8+H zm5k>^w9koXv(KCp)x|kd7k1`4r(j*s%$&v4wYg|MR@R-^v&7eG_3uIKSb7i`{yhYV zyGQ=ti5{SF8LJC1_?tB|`?dq(rl6d;IGTcUaZ?4SHZE)5nU;gI=4jSkS%xhVqVC)* z%l)5jmJLyNZk7#Ee{PlyQGYtKgs49^%Z8{won=GRpPOaFg7rt9SVr=s+WQpY$(fwrcCNb-P)%OlaF#whXkhGJeX0 zw(U!05$&=V?XtttW}A_=YUooz+pSurg0@?=Oa*P7C#Hh7TR}|)ZCyc41#P!#nF`u& zH8&M);Z{&nV>0IVjErGlAup<>b3dwEEpR`oTP;kBc$o%X+-hMOcu{#f4ZJuleHwVt z)xtFJ;Z_UN^7wcSycCbZvEgQ%JP5g1OWpiX4LC!OlGo%@fP=^I&KF*U6Q98BcgB=d@U`<(!6%kt7v*xiSO+ffq6z-L6OS$YMY=z(m-^>x;p+al zA$nH#hx=XKA2*;&`tA?+tnQENquW|>i%%QtNX*zQ}>7a zUELq2<(jzJqjPZ> zjd{4@1f1{wuryfXx%tshmy6^0%AL;C{lTMVgUAh`?vFT5-5+tBxE{+Sk6L8iDZh?)*1(%Iy>yJ_; z7sq8sE{;orTpU&QTpU&ETpZQhTpZQS6N0^L(uhB*dp2GdUQuMfq8jGoI4$$4OPz$W zSyxA0s_>t4b*ziII@ZNp9qVGQj&*1=Rl|84>bjV#V_nSEu`cH7xFhE3SQm43tc$ri z*2P>M>te2sbum}Rx|pkDUCh<-XW-JgI`-i;4dt5hX&+wbuur34+_j6tB9v%fv^b=z zW1lD-cu5rIVYa<>btIdIIa*2AxjOdYg%G7gSI0iQ0-}o+O2tPdZ@N16MT+0x%>*IIi?~jc#K?y-VoU3CWUieTx=<3)f4o2on zSBLUJSI53+!N@&h$_HH?&NNO}2g{yMliigxovUM?>{lkwbam{*$yHi*x;m65T^;+N zzFNGcNmqxXNmoa5eN!ZmrgL@d!>LYMPP#hw;TT5En>DC3S!PF*t`03H=N(6rj*8@R zQi77EE(Yo9*cXI`CS4u-0w@Wx0H&)$Y0}lpmcS(1t{GeZUIVnN0;;=o{H!epmcZW0+e&BTY#oVTr_ZoAWy2e(-qCQ|PIQHI;csL!DP}YNyUjN|%S4N$K)%3plzwlpnf0oT+lW z@H5f^Zi1n$CUm+v+yajJu``p>&5@PogL$c#-lhtj5-!_lUjqp+EjZ9xr!W6`-b z+yaiS4Yz=!YeV}6T^sjAMk2a4v~SS0p?!mONY}=!$Q?)bMsrYxenyu9-5Z75f*K5Y z(zc+RV_#&rqMO4RuCRbIasW#xKr@hvGMO$8l@ELmN9P^#L>I^G$Z&;Yk|2kt3Qv>q z+t>t|Ox=^bIQK>$4vYV@tO zm79vE+++>W-SIUnymfA*yCdI)OD&OnI5)>Wm?O1LxT@R-~wgRTvwN7shqgRTvW_xYe} zL-{x{Rv#xO@@y}O?Zu-q1!JSO5(IM!Kt;V}`PHuz%TcOw;f zJQ=)v%HYQ!2Ky>`IT^g17mb~hQ7?avgO8P$lZBU0<@8tTgyiLd4Aaxi(h#|Cx!t89 za^LdE_{~CvTS0b0f+;WDq@i++2f{lUe+qa}8Gnkjk9FUklGi?@%o5b4csMfWOgcIW z>+^NS-NSM0G~BcJ>4KWV(12O8a>@0$r>itY@{1VFQ6O5tt99MaVrVBK^~1HC|x0rE?pr? z_ly`_xICK+Uj(9JdSfk?Gw$lb~aPD$1bE~`RVp}PDU%;9?nck zx5pO^o@UZZ4KHV-UY_&*bR!Vg-sDAB0d#>piNocTI$a=->&c*?M;C~ij_CqUDDc~s=N5gzBZfXK7QV-XK10vX8E{ox`Y}5>0Th_}~nh-dS2z5w?GCDJ6M9{JII1X0S@j=Iy8=Z7) zIfpzQTRJ-F*m9$Sj;$|ZRDRw2(~-!&OS+**XgaSR2^JelbY49kR7X!fT{^IwgPaa5 zrAr5vqe}-?GF^@j(k&CZbX+|t?_hIAqT}k308RptICNa81fb*UNo+&1c)OLBjw>gL z=(zflNQN><#k=q(qe?}tnDfieF-bnuHb5uVlff0H#B^dk64XRbe);Lha`jF}*6#^T zIB#yLc*v*AaZkFs{-?w0DZG8BElh{iQ+SWgKKXR%wAzVvx7GojR=OT_PAf`5 zI;~zn9^ZiNaX|jQ34MTTKFSu-ReJ!BRe6$ccnR;*rMxTfL`gqAs`u$q))|K8^r)=U zqq1szTkq4Q-tjJ%=&I8b>z%og4_$lC5I*o`m+&zIe0-MgLkS-ZRoO64p$d2S`)bkTZp*-I6s^Xj*6SOwi0q-Od!6l$31anGwyIF`6?A(&Rit znz~**S7_qRFUk8{p?OvG9a{@<_GXLdT7X}B*@sUgX^YH3 ziS`9+qbGkYFb5@aI{6%wNcH16D2-bS%t2|Ab#iJ5q#MZSJ5T8HXc)H4c|weke5;e6huZsEP>+20Cir=#7mO3hcOL5Nw}d|5K|T+`-XwHpjD&E%0T&b07rB)^*e$q;XIvDv-jeH*XXb7$|tuqgNGz8a2 zPh79t^3MY=Za$g^UQ{;D11}q7_096nL;3GS%jDZ}sOOQc>OJR!?$f~yhSK?<`#Jf< zBFl3=%CB~U^Fi|~ky=Y!@~VW;TA+UaHad&10t)FVk#b)NZB)^&#F ze9-)SupUpOIX|K~U&?tMQYqe+bAF8G{DS4Ao=Tc!()%wEnps2h0-@OuJ^A%}fzYis zbT5eN_kxHn`ME&oawJ_KZQY2xCzncda zfEPCpE{J$pAiU7}L|zs|yet4OZXR5a$P4vy@}hdsg~E%S2QL&}>^yj(@WL`)D0O1z z!3!fkE{ynKpSw`_NSX&Zn~|pKKvhE1&VyA#)6RocpqZ7vRV6g-JXjUctcuaBN~B4i zxvr>7ZIE^;!_$$>JzRIVxo08LxVdK`_;hp6Lh$M4o`vAm%{>djtDAckf?qfHECj!9 z?pcWTa&yl@w3nNE7NQJp?pYX{dlts#o`tcwXJKsa;i@T%pmWb9Qu7;4U%NzVzA1X* zD4-RQwRefs{w_SRhg}lY{v}fT)CSn%mq_hX%J9#Z?p&E=5p?dkROoIplr9yzH$_jr zwtXq+9*88(r4ijrV{|V~Y;}$_uKq|@XO+u9*V$Yy16^lxxeP7nR&|$wu3KGP2D-Ys zx(syPO6M}rRh!FYXgOzdxeP5Aw||fq&Z6W+XPV2wi?g|0F1%chI$-@?F1)bbFBd+n z&E<0N@w~LhBr1(iqqe$)kQ5X z8Ss2!wBO`UWmUaMaB<7RVlSRu^;ajvTatiVnt)rDfV(0ASL5OAs(*O`?)`#$6aUc- zQ~H^X4+t(^4$kYjdyKA3z^(LfmhLLS4WS)_Xzxp{7q8#!eYwiR+5Iqeg0pG0o>zPE zY@Jf>+V-%xwO%~S3ww<%hs9l!fU8fyU7LX8+?$)<^&Zaha)XDnWxG*u@%>Zl5^(Et za2z)o;Ias6H_c$&yc9GWX_3LWc`0a#o<`w|L{>A(VC;N0dMPf0vGW}nI~k0fzll66 z8H}CE)Xh;2X&n7{3!dmH&0rk=BVNNih!+$2-~Q>#SBnf^srHSRI3?(nB-7Nzz zuLidp>dU~(tHB+3V!q2z{@0}UEdw8a7g_n1fsa=WehgmsW*_CKT!!+$4p@8aGVt=x z!A`@=vP51eyR!(Y^<5#n+-Z2ZLU_5$@Nz}O%M~$Ru84TK0(Ihexgz3)ujE`IyyTA& z&J(1s7Oxu6e+2V@@?Qh`&ca&*`c4<90S`_Wr~wbE3)FxIXKAbf56PBR&PAlFRjyyh@Sa!BeNN+DfizCz zT>)O5#=8P__F-n$R=*M@f<+~I@~tgbqD0QxawSTn)|M+#8fR^} z5~WGDwop6BBB;i@5_B5^tMRS`-G<;^Lw9AYx2*)-1JUcBD?wK!@=DNk>-m+S%e_VU z>v?J*EU#+3t3Y=!xX(~p1-gULo|#pk`&ZFyxe9a#MMtGHSOvO+GU``>?qA8MSNw4} zeu2Gf69Yzg$8~=ExB+TDSp?O1Yr%`tzH7mY)4pqCbx;dl+=#0MFFN9C zqdFijwbJv+OD%YD+IKB@$=ANAaj{-hi?|BBIPLo?;l*m-R|zl7_bTDTYTs9Z57oY} ziumA6a25E-*S;wusnKN-R70o(O{clkf#yrW{ibE=K+|b1b)f4smpaf@&804)OYZ7G z*J&xcpqj!OsUxeotdTmhn#-D49j%Gg(Hiih<77>YpEcmeX)bHP zkJDV%2tT=+3pHuhjcN>Q!H=6I)=EFIe!#Wh$ITLJrLXKlO7_jQ;79xH+K3Ef^@keV0l$TxCV5cAMhH` zb$-BWgf4sDHBwgV2fPL})%SKyM3Z%J4QQ$#5XV4)#|OYaWyLk9_k7^RTZ+f^Ix9-};D;df{U?QYqf@!Nb4YD!o491KwZo@f(JZ`b0js@?m|bmT;}` z@gc*5t_vdSW;hH#zGw7$6Ogr@byT^G^3 zPH0+R+;tJn>tZyoD@c<-8s=E#A(F z>>byG=4{z}N^R_VkpcPh6jzB^1oeg80Q#Q|K4R$eZKcl#|I5(70rbBubIuK*|M$@x zbpz<{HF)|TshP4L+yMGtHuyC1*@Jx8?`}YQyLsVXjV+ohQ`Up}$8H24Zg2XH;KS`r zzY%=6z3DfC7q>V4M)1-lG;c)x>pooaawB-zW$?}xdphtV?ZM^BIE$crE7u86KgTm` zcb)L`-*{sF>x3u8bM-`NN^NhQ@N>Am>0E8I?7DYyz0je3g!!!(IzS1X^%0%*Qf|9C zS|62reXQK;qjIlD`@6mA>kF2fFGAlunJ+^3z&5o9JAP=RdJuI<4CqV zTV8HXz}=F7+nj*gl7QPPxFNJDE@J^}6yYyH`gfV(w@)4e*k zCE(chwqC3i>-GfP9SOLdg46Qaw0C;(Y#rQ{fV*3814X!Dy`cMs?hzdQkOAH*yiV4^ zS-=eQGaNNp44A(TehV@5sR&QjZ<)myayniXEttfMOGRaa|_=#rmC(AE7LjgT46Z`BBy zkw1U16fD1f3T}h&^4o^`2I1vlJTc!5D8KGe*Z@A=49j_u&}dikt)Qv9^tYnEzZU!%@}UmCHLt!oPf`b|OYM_5Wq3LgOC@y_XQ|wd zG|p1F9lSeB<#zDyES1~Azq3?s2mj7exgGW9ES1|)24|_MrIH#JM}S%?+oUxfH?7eot2emlTRZC^N(0#&CY8Sen!V_Dy9X0u=l(AiCa;O$?W$6H2XBq53SygN5i0G1^4$%Fg@Y#V@bC$slw3=H1T1|@D zDS1&V1SkHCFyxW97d!D*vr9y0=RClXja^!zNv|NZuxNt(ECEp<8XZxGhHaHqdoe zrrRRAx5en*R*){Wc+ypiW2e;d5<{sIbe)x{GpgfGDXXkoRwk|-$VZrAira+`Yh}7!`1rKx>$gXI+%A0VMk>;~J>uhb@ZtPFw+kOh z)*Y@)NV806-XS!tb>|MDX{|eVL^SUZn%25=M?~|E7|lBh(&WmAG}W58Q)qt1)b~!I z`DFCuuS#};uCqMv1YOnCcSdws2RlJmHT9jS^M4ASLSB^aI}_`iD=zY)7REcl%f8^V zhWef0WnZu#Pt5mDlwW6)JHdzRZ+C(Zi}&mNPVkZJec_6ZG}W4Tm(aA8x9Kq5MfQm8(b6S1aP(pzo|(cZ0sOZru&~YTddU^qqC< zZqVN=GUaa2ch;@DL0_#~cZ2rlgQrd1-yM@}*1E+NEBTlueeWLd(GVS4dk^?%2tH?8 z;vVqfb{gITUfizId!l}D4|q{86x-{bs2|(|Ufhc99`N!nkfQ%0e?P)3$M?S;p2YXR zI>oM|yNz=HcN;5@?oqP)mGp`B9oliaP?{5DO&!P@oVZ;HxO)Ysb`87szt6+jwLizT zwJ%uQ{Ry}S1UH1*!Ufw2{X1O%S-WaO?ULHHcDgR9-OnRFYpP3Xm;I+pYSzx2T~W<; zMK#Nrqf2VGA*U8elVv4MwVUn|n$~8wOK3i0Xzq$=?h=}I4Z16$xhqCAga86R5B}_XS?V8|$y!z&+ zn-7i(Fr!mK(B{i~{x^w!3w-7uy!TN(c#kjKWAI@~0;tFyyvJ?vdQF7GpcLRlyofSO z?ib4@;fdHP!L1V$u@K?H#6OttEuFM}_pLGRygfaC&;8C*iPny#Cr9J+jG(oZF8_Dp`Frdq+-r&T z5oR}q;}&`dfoLzLowZm(yFb(7Fo^PS#ey4R7BZ8O#%RICX|RTK^E)m9mrlTqO~8#y zz#X4}8!x!{UeO5&xQPk46B2N&!Q6BDpo-+-;C#v}?@0+b&Re^ zSIxzpo`5?e0e5Bs?yLmd**Q4Q+`Q^i{pbhu7*bRoet#G{jkCI>kj7bEQW#_F-<4Z{0$tHR>E`JH+!B@TH}tIKHN<$$3+T6no6 zdh&T09pi=4U+aBzR0pgxp1G$h)X~C=Jq=@YA}^G5 z7CeVQg>=R-f}{@~pn(zR4MbG}SW0^Y}Ife`#p)JieyjWkZwa@okbZ z$n*H_j?PZvd3+lUehe(_b`0VR^aW^A29jo3hP{?&^EL46rjiFoe`E9xJkRFSacY(7^`p3RqBPR@9wsg@Z%e{Zs($@BLbqYne<`FrGyXYcI{W*`;&VEpX8 zO;S#cbsWy8`T=6;QyO*lP2|k}#`E{``x|H4EQ0dFbNAfd7oNN4_P+4kJ-7FTXYaYa zFVw-hgeK44b9-NS_TDao_s?bI=Y|TOKgXG#JgK#a=kd978F?O`JC~8?@#&d(dLAFw z)SSt99$y#!Mn0F3+5_pRg@~UOa_2Jg>^=AZQFpBG+_U$pkV^5k-0ti>#oKc0xqB&T zgCjY2kNl{`i0AIXi*Nb`&)supBkVf@40gs`FSB7A3S@{`PivhDnI+| zb*WdR50&BRNVGK0$WBY+Ido1-s%%JcJf!bfKDmgbqUI_LR$ zTIW1JuOav@@}Y*n^YilSoNGz)p;{Tw&ua+&*6?wb@G)fg;Q4vV2hYxPW#`#>+UIz7 zo+~@g&Py&k*Q%shmZALPIe87i-x-=bC$BO1o}tN411U|Ok>@ldo{^{Z%`@_}pKD%x z8-N-TcP5`L<&T&7wICC;V(M8^r29>E4=O*vLklFI{PXJUJJhsKGU(@fXio`2BiE}i zB>~5EcW%6?3AkwqxakQv>WI1dl_%gT1jn|+Wp;wj6kOZ}^u7cfjitFXW+&k0B;a@k zO>Wvs;BxIBa}#j$1Q)jpou7c4pMbl-%g^rST#$gfFabw>&)JWz6`R~e3Al>|cZ$?0 zcZagag}~LNUI&hvX^6gjcpJ+Uq;a$N6r^#p_Z0MhH+xS(|97+Z6pR5kdr!d_aI-g0 zg>$p_6pTGLdr!eQaI^Q6*z7$eHhWKr&E8XDv-gzP>^&tmd$X5k5p?!0lM(%W)Cp^- zOh)wIM^7BlcJ}6Zb8Z$Xi$-->B++PNDJv*RIFd+LXYZ*(*V-7S3SDbsm@1NlvmJSw z8lyWkqB}LBOUcW#e!C51v2gYz#bqE}sudD)OPT`3&LXA51TpA$(keCzg9g#K#Qb<8s5tjEIjJ zF+OHQe9RC&{t@|bhMSSd2c;wV&>6m5_&8|z;F)xd!9PV$tPk5qcqX0eo4IGwQL`fN zCY`lI6+V-Wyy&c7A-vexmS@s62LEj8B=<}@t7-5|I-PCZnRMhs&!l6Ysz9CC z_XH>7DXDEZ6VUagvp&zM+aCPD)B?|`YYYCx@WFHH+GWh}oVxp?^$*Xf+ivjOGsF5I zb)Hjqeq^JV30}4bKSW+^pP6~QFa>9z)v14#IAwTB;i>SSu9-MPbwpo;;W=|1(HCK6 zf&U$mm3kKV?|^hy?q;D39nlwIW}yrn(HCK6p^tS$Uxb;3ay$@y5oQ+3(Sf%nZ7yT+ z^sVS=9G+f{o{q=UYthqqJPk%q6Y#`!FUvg(60{@wA`ItOwunklo`SbM_>pN5o`TmF z9EzUUB36R(6ukRk3DMrjQ}DD^cmiH~r2q2-ybt1+{PUAJhm)>KP@Yw{J@_|6iD%Wd z1wY0Ud)S<)C-9s)N0aB&DNUYJr!+M_X|kkqq!;`<@?kHSgIq0*CQ*KH5} zpW%aN*R=(27(RG*o%YD{gbzD1cy^ug!L#dJ+0QFj_DVxjB_&U!+aCPH(Bz49ZNX0s zO`b@nGh znFn6Fqn^ie=~|_=>40yQp2uFmbLoD=;M2(Kzd(s6ugpWe6t)df>myGpCwXSwt;j>i z4bQA=i#~hJGwZZvcxK)G(R=kgvrhTpnRUt!KlsQq>wW|23)7}{N!ltKd3N2c(PyuD zb{%%{nqI-P>y$RnuIrAz7cxJh&9m!VUGVHWt&90+7wrE`cp}s)sW(=O#?mX8{>xO6AwMFg1GwqZQo@u9iP{-q$c9c;0G^w$ZrrL{n zejRo?8=5@7t}Xh^HP5fpHs|?uZBcvh{5qw{^XnWhM@bceC&-TAKYX6JD2fn?6Sck z2p>nt-(~cu?lPk5fg^qb{)&t3E+Z~n^qL4m15LOSgAjkbzfV+}qu5oX8NK(vKn*}4 zeCSPFY=!od6ngVb3QuBI;^^0%2>hFeP$mCo8%$;3L)8ZBaGFm4&xa7=R$yMFl1f#8 z#`sCIis}u<{-Qka$z8cPKHH1#b$dNzfbo;&71`g3@?jg-;&Y#ETy7k&m(91R>%Zma z5I+zY!o4W<=9_)E^Rj96DL^L=n;ewV1AMQK0W$913YuGIiem;d?HxX(b3k@ zxT7Oz3a?(ger3ZJ0GEbktDBoLO&#Z#O&B-s;Ns$j_M(o;ot2f9{qriT=2gxP!s7JA z>fofJGgH$lE9WmLx@*FnS8U$a*sys@>V?&<4I5G)UDlA^+}<>PV|80oLrF(N!s4Z!t?6y;O(&hXrfExSu(_e5X-QLC%a~h>rhRnr zj`ogiTgJECQM{yNUiG%E9qG1hn|D22y=}{upkeFA#XCAWwv}w1J1Y!QmH2n%>Sf#7 zwzSV$5RN+`_)smxb|ze1yrc2M6Xve3-rN#wxTRv|gmG)zi<{a~=ggh6x_MjXwh7~w zZr!-+)Cs-gCX74foOvglGjGBBAB6krunj17dOvfY%=M{|`RGKq~w;4Tv8$t#s&2PD*qJK+&8C4c2on*k$R z=9JmLHP59H31}t4kut%m?`W62;l7PMQzqLWOb?--nK5KG5nU zl~gK2j&kH{C2^3i8qe0NK6CV1`N|xaUhCURNEe^K>#v03*GPDqqoybnlfPP8j1wHY zIMnRo{ZGlH`uYlqo;A%aLHjk^+HPswwyoqAN}vZ9H?*gU9ux^Qud=pk?nSeMlFCu( z>f<1SCaVa#YnK&4seuwJf;Jah5!8{kB530tD}sV2(pCg*Lqrupn*$?)ZXH!L*@&Q) zF%Utc=z2)Lj$-`3^tY^&_r||=#bf?&#y>XdG~us97DCBwG!hnDeNvpWtY5FP48il35;(B!@c?$#-S@qx>Tb4?=2|*RrS2+ouYbNMiwJ*?@Djq; z5tz?k;68xxmk2K-P^Y5#f^O?q5$K{GMEENN#{X+`{~O%Di$M7>guvgvhx_XY-#5?y zfcrlp97Omhgnvf(0m8o^{1D+^5q^Yl2;tulevH6;7~TN<6NH~43?uvu;Xe@g8=Zqc zCv2W+NPJKK8`&;^s)Eq*WjiV|@$%zn`!elYx{gu)FZlJ8|I;Bi-jn}{eebOxE6_EI z*gb0@24Frf;X}Q`;|XUKPSXtEOt@=o8vkWog80Rg0e6}>g!h=VgnJD<9&o?HC8q-( zFfcRXjvGst-e15%SGd}h7P@INVrZ2roM!$s-!nep8UvG7R$-ylYGBgZV_@ET6c$>0 z6&6~(3QM{68$9zLF!2c=G%#t2!5H<%a+Qq2Kft6_X<$aJQdnqZ6c$=F3Kug@y@7>) z6NmYCVa1(%O@QCoR@P5AZf^pTyz00GM(;xZi^hc<_J+ z4+=aMDWiTBgn)+<@XQ~+DAqG}b-)_0@TfBZR}cnoD{-qa@F{?M3_KBVpT-xrQoq3i zZToZTB)|h2Cnard;1Wg}jez_~tHgsV6=v^^2R)a4EyvK{v>%sd?e3s=vwElhyRZ0bB1-c}~ z$rte4^dbFD37lC-q+T>yA4XkLiFMTkFNp!0KVd4s10LAd*}n6Ep7 z67wp82$8|8j|KmqAs*i}^2x;VVfW*8k96klnp3mJco2-hbu+f7exNE#gPfUpXv%6Qu(%bT6ch|=7X;aSZ?z$M>#veavO%W$- z=1abL=SA4Ra&Z#L{G;5o*Fy#vKk4eCEb79hv+->_d$+&)&o=Hdi^SdLo5?9R+knxs zyXzCnm)(6`0sIXG@aq!s+&jYw*Yaz5^jH+o{%-L$9`Bsv>}AU{e$t&qCHTRnv+->_ zd$+&)&o*vyzFkGlzmR-)7xf=wzRCTiyQmaD*mByk+49=E{oQ}Iam~<^pIrSuSk!uq z`6k!zo+2s_mLJQ5<;&jf@BXumOJ(0)j^BrisC?LTHm;3l@Ah~9*~azdz03EJqRwN? zm%5C-T)y*)297abRY^5xm+u`#dr=TuPFprh-`?%-_POFXO+&n$yZGBf)c$d`+?OLK zj9jfjI+eR|xo!7DFhBmD+5O3we6aE-v-`0E_|eRKVbceQzu${^xb`eXr+R0!=R2$2 zvb*E$#{H12*39nYcFXL3DX~4XyL0pxlh61`_ZDTaQnKyHJ1?*41kA+^nZ7~%7BBMQ z+8J+ozSqvIG;_Ie8*gWaPj2V&lO8B4!OET4u=;I&UQ-BYf4BG^)7He_VUf5WuHE({ z-8*A^4kY&P%QiTP)CKOe)parylM_Z^Wv4C zPTyT4z5;9CQxJpJZhKWhuG=)EZDA{0_{_X5-oM*Cn4{u}@niU~{Y6v#t#72U86D}J zdn|sxIOs~t>!p&)!1SG2e5D817xmWLD;-*}o+F8t*56NU zpM&?~5N4ZX5y$$`TNxidW7c^mV4Ke#lMmzfc=3BRelg?sdGQaJ_^@6C177?gjW78h z^x}&{-0;KA36`HyW?=XU0b72mh(~;0wx1A{!9Sa}mI#x!9c#2QIK{kmd2#j# zVyv9O(gWD$*+)G30R8&=6;7W7c);KZAN24v!!SPEw-m7DAtXMBe_*1rF#ig~v2-&g zAL45i7P?u3C*4jDzsKN7w->Ob+ef@d*XF-J2XEu|=ivRcgjv)Bh-32^Wc*#}QS2u} z2BvH{WMIZ;r?dH&FrvrLNHFs$Mf@@&!z!2-b$c#um6DIPOV)!sJ$R3SDW7@;9!m*i z>Ri+IE8fXA$Vl$<81(WP_TZ8U_z`iWy$sCw8N%R=!#-oo9FfcG1?3NX)MWSpCE>oxE)z+9dI&t9SRzbk$G zt$?${17_O6+&DS$$$ANv0Xg}k**u}*S%o%#*~V2#JnETosuUi(0C0`LbG&pZd_3{p z9=@M&m)B>|zU1M6#?iS^;{a>>mF`s<(m118Z(O<{A6K`#(xZhR4&q(uaqDoaQFyeB zU&38u;Z%$AbTHCZ0^eui6CN@!`%($iXyhsRS13I0b3j!Y_+G%n2L1@(u2cALEW4_$ zH{qd#YMIZ&uJjo4TuQv*xk6!y-<=I@ew~XvKd5+5 zR>XB8Hp8Kj;uyN=(-1LUx1%{uD~Ly(V9Qfbt8sLHmExrj?@@RxhumI+XSwX!a z-@vT@g9;1(!-V6y%BVR&$;P%gUgB4tj^Dr!b+9Uh$8d<&6GmCsZ(9w#74U$8YXE0> z2ruHy$F1AIq}6X=%7jCN(XUqGRz)J1M_86_!tp*sw6+oQj9|?5{9%u#mHyVFY5lef z7^fF_I|ub?oG2eVzwFn1Qmos4iIc|36DXGlAM{{(54=nF+m&*iid3_KC>dkjoL*6YE29=zYc?I7`}AHqWh<{&?4;N5_S4a~mR#ZKq* zZ}g~M;?W0~PrnBr@ZbRt9#nX=&^36r??D5X0j@en^SlhVtbrM4uYnookb&8sOGEqv z5A$%VF)(jk2L5Bfdkst(UNZ&%5dZzSbs3oX4;Xj`;E+TRhqoF7lUA#NNo%ixL%@Ru zz60>E7pHS75Xfg8ZhZ!x1-OKj3Ow61BNZHz74rISt>RONV&#wY=d4M~I&4;0;QI}pv`WkI z5Bs6l;1((@d!RcN7JZ;g;jt9c-3m*2_Y#iFz|kD)y^0?V(8`}N5sda_bssSKu!|ou zFzd5~j3W-^K&isV$-J+y$nYA4g|~VG%eXKw+itJI!e<|0pHCl#{G5ZI_vgj|53HYq ziud^+!}y0Z|1lZB;Y|F4OlGxa4IBdQHZY_1dhmdOF9Ckoz)V}k!GwH5+_DDdT+n4; z*28{<$F2l?z~H4F-v`95^jK*}g=OyUBpjFjGGBBlo=I&R5wv|t##FcFqdJMkcWt^$ zkNVjQyqzO@HIB>2r|ZFX?&#C}W$xH7X;tPQ@Zcd29yT!N(-H~{U-p{0qeAeSPmKp> zJ-E}r>|=Wf8=2o{;Bi3hH}G!22Mo-9TRU6hb1ZZ!EOLI22lsgJUJvdyFx#%rz#(89 z1xg-@*@r^|GfvjPHGumFcZteo+o+g*X4u4`3=hx4KjcFhRd3*4z&!?LU&>HOAkGcA zbsBgv;6VdV1RT!AzxWst*;}djJlUHe9(6b#w;F|u*bnOso}H{u;o_?S@AvQ}oHYD) z1aIV_lz6~t+$t27^;D(8B70j+9OmCi*z042CljS{Mppsu(KurP+B%duVnE}l95(Tp zXXbqTvvQblT)!#?#^xjI>v|Jk*-*RE6Ih2; z3QNQ9QCQXvJ%s(a0CmN*dlm0^^V{)AV3b#6cz*t(Zy!(|MBhH7aGF(CasmFCHDis! zBCG2Sp1d_HJcj+e)xd1)K81zMrl!ka%A z;2s0B3TiLaI5*?gZD97FVTJv1C;ckJ%uuc+j8E9_+dhmq918=vag1CYQhc85J*4@I z>>XCPh+RB=IsTbGnNhfy_!#SFIEK%9jpO)1p3{)5lX&EFHg0=0j@U-}6)(1tA%#U&A2RqN#K&7jOe?mLw1L@P zRSJvjts(65W@L43K3?K?nS9PfvTg%!0^Fz=?y8(v=o(8y=a9lo!Pinx#VLk^HR@rV~(i-;grEE;}L&gscyb^E)VYD@AbsD%1 z@LmH`h7TKd@y0JaE1chn0_y!&3HAR$hFblKG;Fc;q88 zN8`wR(WQ8qFZL=d^F^P*vyA-;%Y1Rbz!QNVR#?iCUM+Op_%icFNj_fUXNZSv=X_D4 zas2ig!}@Q|#iL!e0)Ig9GLKYIcmU6Nq|3l_0Pi<2+v^}JZ6XK^F> z5WyI~{Gn6R$~@AgY5l$=^T;0H?L5+>ahOeBo_0>zYw|2XoL-4&0m%jDB?|Zmk9;pN9;565wHl z$FPhg*We%Gvpz!uGfsuV5+~!usWo`UsrT@$g#G@HHX@&$CJuSnV_?ofJ^Arv&qlw- z5t%t?V2Y$61G9ft*5e<>FXx?Fg@yk;gyTGjtmskvaro8BpYaud4`|vF=5t74vBy?k z3&gJUMDkgsu;8->=3LfHxJ$%jl;^WR4VpOf0rzmwbdB}L(fAvH8c;l|BuYzKmDl4R zo+mz`>0OSUWKPjKbq90oNLs za;D3~A+19SOS=y%oDyNT&W-mpU^}i$03(0dE>KF??ve1|jDe;8Jvi&Z%^uw9!JQu5 z<-y$^yvKukJb15xIbM1VTnf0~i!(?V9Psc%gyUmM#`QrHhdcyX1n|H6iVcE~jq5g`vWk}~k+lzaW1S2VZ_dHNM*&ESqSuZ)8NX@b5uf8CH1OGg zGYZT2%^Ez*)lAsu*@w;eZPoZPe!ERR9AAA3pUCmsZ}7~sv$zeR{u%o~kHXTvdli=P+Y8vv*L}o8m*BgwO*lR_Wi0P8anks? z*TB;N_vOczu{@}8WGo*tFvs$+f!T*^TJX=z(Kvry%1i!x3CDSmIl52r$Kls#tjz&D zq-kYbm#`C|Z!@1-g~g3s@8P=)%v-mCp9MT@V2lm-`;H-hAT|BtUgS$O=j|ca7@Lmt@_251a-tWQv z2Id$)U|^2%AurA_VKZOL=c@pd&#qR*b8L1iEMt7H!Lttgyg2*4I0IgsA%kZ=2R%GK zI>x#!#(&#~WsIkZH#~#}X5X&Jk1u1qR^!MRZ#M8s#BVh)=j(n0Uj}$cVQKe}lVO|( z8RHeiqYux)tzKan*WCusvL8_R1oAfE;fD$P;{y3`NaLjVT)fQPt%}c^yK6fn{um~; zb2PK=R(#&r$7emsvy9UU!U=PCrN)uDyT-sA@6BG?ZiAQcNZ2on51TRGqw!^o_nCag zBiW$BGIt*|c;=b875~iKU8Atf-Fp?5G2W}NjPX7LbBqrdnE997Ci%!14-HIlQ>(Dp zfBF@cwmzV+jPU`$c8m`aUto;Chc|uCs~`5oRO%pV?M57*`&h71{uc#r$VmQuG;uDz z1{KVYz2xHe0G||pFv7o49Hw}j=|={Xcv5Zy4vf@AVH2eEoA@Crs$GPkw&zwO60|22&y;u7}fn<%#^fQG5sx z@7y-Tdx-mE_^mvsD|$K@6>Myr7lgt4i$>%4Gz??wDuaPPt0(*1M5yq*rm z1l!sgHf(NE&ZxNZvhjTWhx)`+z@BDP6-+jHWqPw z@M8ZXemd}}U`jA16$YD%7H69A#Ow8-2o~9J`KEBuhK`n7o6HxGZkeNx_$o$I#~gg0 zjh|=Bi6OtWSG3I3-`6xZLBnHyB|#X5En7D>bs|wqIGekdUJp`uK`jjN;WH4+ulJ`> z(_5O_H#UOfn?3$02d-K2fgCKyVNp<5?cy^3Qv!UXt#RApZJqPxEZVqnc}LThug;F4TH@&^p`BA9P+W!&MDL&YjG3;KTbOufghRW=VAErAl-xG z5ROL}k1zpYBEks>B?yxcCL^4Pa1z4F2&W*NicpGh8p7!aXCR!3a2CSZ2*1ECzD0%0b?xd`t=n1wJKVGhE12z-fgF2X#7^AYAFT!63u;X(uo>5C99 zMp%e&2?9SLe;LB%2pNP$2#XP_5tbkOkzFpgbJ4MH}2-hL3N4NpuMuc?;jFZLvW`stB4G0?%nh-W2+=S4Ka6Q6S zgj*0cBWyv~hR}x4im)A_9fA4nF!x){9jL=z80RlO{mn0Nlz(yHi663;p<#knjJHii z6~R`F-E)IegV+A)bAR#Nk6(TA#jl1dTG~67%eZ*;NsTV!SmU=rDoDQyaJ*>Lk5_lx zj;ZF-aMKonmb7haU9#=At;{LpRbC)_$}WzMia_&KzBV5vUySegDh>MnQptVo;HzKy z#wVZr_RF8&|C5*Ac;Pvnx3wG{D0eAFvj_lFKJw8aM$;n@p-|}D`+Uf?#`4sBvI!{hc4{pW$F(v4P9)dxQPXcJXqJr^4KI83^ohBZO+vVn|Cw?{G{n# z$%k{lYEq~^%-`8jyt9w9UvR!X9=$9TEXv%08fLm?lg?_0nvTbe=BFz{y1Pv}o=E*V z;;6>U*rdl}MDx>)Lb`iRy5Z594t$D6rRjJ~Xnwk4qo@6&gNbTVjkk57MX;Q3d6Lf!wHKYI52Ovht8nQk-c zZ)3{Mx2j>q>vd7)qeUsn*To+da2~cAZEpOBOnmBRLnsOP8N{9SYWVr?{ug|HpIXBYPgj4qI7DkJe^rLR;$Z)0Uj2#`7r*mZPb*J9206J`>NpHOhI;!$ z^gH4nmHXn%AIIwd;3zHcSgC*QyAK!hI8W+J#lhOuOGC~HtpCUG(eP1cj= z9p%#eI3Fm!LhvOf{x?4P+_w~;0sf8Rdimcf|GV*DFI^9=g#1qh6_7EHnVPmM$S|l! z8(6(MK3`DEa#hN@<^Pf5jzPPe6~!Mp=2?&sXUXSjIF6J;p%mpopKz@7`%sRe;N#EU zFZ1y@tcf|Vl?R`a`K>(oB<_=gkk_o*y5(0cs=GG)z|w0gT)DMAo|RIS2hX7FeFF3D z@^&RQ*yl(w1#Vre@q!tTl1#(rbvTPZ4^Cf4U7ZzRT?k!=|7V0{vu9(#mxb>OtDD;@ z=ALi$f#ZV@~AF*!PkjTgR@%W*B9=ojx zYqpN+Z9BGh5NNuosV%=4QjQA?r8gCFYeU~1FRn%i5OE-hbEp2Il#o}172@@3Rmwbm}J zoEe5|YL>3_E1l^!=BGn@vdF8~)M-~LudZ9VXwA}a&7#FvfwCO=49>|fUQXp=Op{(F zk)Cv+ovWnfvja$85Zv=b|i_KMZoGIPUarb$*c-i)Sd53iBN zP(wkv%qY(nO@fp;EhrBcp$S;6;qt9vMfvLTS>VqpKpXWukS$$z6^nnB8ng25)x2#=9=|N)i5-OCdqYy7yzSE{eKA9g+ z>Cp7hV|mTuOnPMLsi#zV{E+Wwkgv+weym$YWBz;TA3pziyW-J#N$e!XzDG)&Ymzyg z7QBGjeHv_5w2Q7l-n?iNrR=xm_wAyE^I}V~-fj7)wni8G+CY7D$tCz01bVtXgDu-OPVg*zkL9TCX*$Tx2-XQ8(!C{P|lYeU24%^{qSO`S~}c62mVsCpY$49WNG5%O8OatTzZ9OcTCw*u*s zD-`v)B(B?0AIKEye8URh(aXZksDU0*ep{on*hySTlfHp0j44b2fg zZf~H&ocZM18+ZcX>yWX9>c@L4?yuu)NTi3qeE+|__=N!V&UN`qGPYTR9IH^8(MHV8)o&qr zrn;SL1(jp=ND!}7`XysbE{=ee9uD4lH&Snl-F%DWhf{Gt_Wme!edyvHe4 zOpBH*3Cok(R>w8xWoR;b(WVquuUd(G7lEG;#df8c7{skjNqK6yu>P?5VU3?0kNv!G zzfvvBj)%kdt9bk)?^p43h58lsVe-35%5|ijYSD@n>!p9#e&srg?N(k(CHIv$f6xSR zC3TkEI*zBCD(RS(m+Le!V~6mfR(f6I&hfb8$~K9H){C*>YW5*JQGTl{M{b5FY%l3K zBLFQ@>_@#P*-c6ULrQL>XC>Xp+U+NcsE<}5f8`sgyh{wKQfBJ7hs%khNA-_`*lue1 z^zA8H*22~ewUltpvNiB^e&$ObF3V3nryKbfw#!(r-;q&!C)j0p!XoScXx6QEePma! zTH3;ELC)t~6D6-tC!pQ!0=1%C?S_Y2@3KEK*J;5wibkQAaEDNNxmujGU-9Hi?N^k4 zHvh1~_RW#F&Cfj**u2>v*blmpKkuCpo&0q>f3J^zFEnb&C(C>6>r)-4FQF|tj~tJ3 z%XR0SZf`PYcA`fE`;Zp_Sd7FS9p@J#oBxskE;rQReSWgoAHnQW&E3a ztI)Ik+O2!*f#<%0>A{ z{eOJmJGpb|Il0Vr-NvR3n;Vjx+j+UWbmw^K5}n$KY1z}2zxN~k+vU`z&UkC!}%ZE0c7lh&qYVi4|MM#JNi0NKID~=+q07 zTFus-sdvxoeJ>3Uq^%npSzBz68y=q z=REO4-L0#BtXjbrUSII*K}mi!ok#NhYCRG^->=pO{2Rpw~o|{IS%9S6k{we5?C+_khkjbDebT`x4m?`fxOj z_TyvEPu4%kkNMW){yMa)!|ijdL_DUekodCi`-jhblkYw~vH!J4ZM(Cd!p~H_3f>Fs z2#}U951<)K+b8d-=5E5{qnNr9bou$3s46<*)aAzf_;(WA$*= zWRiFKQ0vwmo^0PvL;vvmDc_I%l*h0|GK^XsMz$~*kT&H?lke_n+1PH)L80x06mI4! zq~W}`f70z4KI;9G{z&rS0_(qv&H4}b+Y`rbP3 zm-U|Jd+WG&`Z|tZaeF)0afjwv{r#=2q5$#U&gwy z6X$yUI;;zI7aMhZx2KRh_Wbn{_5JQj+s}^fy}G3Qt?!KMzDnfF{3~!jlJ#PMcuY5Z zp3W<)gD(#}^%vZWGjQbqlGEu+Ezv`;|W*^dL-JN&8je$?1!uq zUaS{>os{FwUunD>*Y8!cS&k#|tB$;WKQznshokeO@{6+SM?Kv8ke40f`klS#WxQp_ zKE5zov$H+lTenAVK=Msm?lz72Rybc~-XVV5?sIkgb>Xg(h5gO>ZJUATx;=~g!^K0g zMose5)|ar|PljcXXXy?MeD2HUeZUC+g}-}o*x|c@=RVQB=Dy$D2h9DTxuauAyi#+o zH1`^F&zgHD?ym#A;$M69v;X;-eWcq9yu2f%JLzJ+`lo{lIO)$F z8tZ$};9lhX;n}VOs=?fa4R_u{2uKD~GPLs>u5cs2hbzlbhV>!p6 zF6{YqNwKv&JraK?r(OzM+9}_$lL;5)J?mjq!Ez;2eo z2lb`z3=8mQ|J<}WI0pG!J_$GzwEy`uOTJKPDU>qYwuN7UB!{ySy<`(#zq zSYO{oeWh?`?ecwmaNM`5cOz*+Tr1KQoT>_6#XIYFaPpGQFeNn1@~rhNq~$ zaR_&u--%h8Sg})=$H!39lFI(SO!O@`} z4Xel>_5{Yb!tqu$jgzdV(dg$u$){RIseO~BqcP_MN5*k`ka5!Y%$Ye-w;Xai!1dPk zk*QiQwr-5v$k$06AMtlw-inrD`}5nOr`Y!}tS(}A66t>ZqtR3L$b0&~2tDQPe$PSm zl%dmEkL365e9yt@DP72)dP-+R=Wu$;6xWxIcnAD1Ur#9xsHVi{Lh2Jf#)ort6plC6 zOZGIq*W*q-r51PEMQU)z`A?YLll7ERyeFGv7paW!aXqC5c@eX4NU_!ut7YDeuOz39)LeZ-uXpA_53 zKZ*a#)>nRA?IUyH7d{A|cTD_++eb<K!m|qg=miz2kqX zo#b$OiJN0$n_^?G8{b+Jw~|0tx$;bhtpTy&32MhkU0uV3G0RL|MOmnJM|TQr;7SYh&#VN$@l+x4}#Q> zo(vXsbhNcJ?&t`b!mAgr$Cp+BTpE_GZEp(NmTha>GPi6(*|>3CiyPXDx+-@DOV7Vx z$+Be&76h{wU9hBT_WXIlvI}M}UNnE%?4WAiMHgJSY*}?z_2R|VckP@Hclbrs^XJW8 zGPf$Io;|<%qKjr%1s5)>oP9yn+y%jf7cQDN|H2E;FS={O#w#{&Yi!s&CH3LetqmJe z+m-GKq$P381Y?$OoD{sWrftWB#Y;O|OSiQ*r6x|QT+_5A zXx$9=+>)lY;+9(1T&Ll0t30oOt>+fgG&^`;kjxO z4n;f&qT;TunE)!D;DP8KCLoBq>k?L7bUo((RQC)7LD${){l5SE{=To1p02L0uCDXB z>Z#{R1pB@&T#lY?Sjfm_>y@07)^=+|(DZU}o%0(Nee=Dl@*=CXq8Jg|!NkxjTVgG* zFwd%Jv!Y_&kr753VqzQI=pw%lYvglcEpL}ukcK$0Zj&It|7yViZKiqW)yJNFi&DsC zWvCeTrQ^bu25^(xXllR<9qt0OsDcH*HrkphH%sZores{hie6_D<#jTQkh##gQ8PtY zQ~i3t#sF92k{N*=VyC`Ml#6v1frTor^G~Yy=5VX*coB*O_XGHM2~$VuOGXXIJJa>A z#}AlA;I7AwO=;6aCM)M~_Z4P_jrcioz9NXFtOD?d8q0gJ_O`~}7R%f+7`to2U~JF! zS7N;z0`lTwVjT#6g^6+J)kB;kxk2?u>W-D(es#Z^TC%yYHlSNARG&eYyVbqScJ<0` zHQU&&K6{V1TivbhQaj-BK%@h8s|RC*x2r#`!_N4vc-k$=w|Py2XCw~y86@0y{=moR zrN>ZtOBLtr2yu>kD=mw_#MMHFwx?4r6Whf-f&rn1xKl=cf6C%1hwS3`?<$KMobDl~ zz0SGntYFsMYUdE=IrQ_20cu@IVeuf<)6m?wJW9||(^5ZylFPamZCjM9!kJj}@j`G1 ziu|6GFW3WjNKl+ymT_|$6T=9b=9x_kIX}o~NmXOxlGO4=2z(&BQo%D;V1t{UkrAQ? z@4`CbUbs&hEpWSR#07GLsY@@={MlBH*9bpG?+8(NX5H12?aW6E}(9A9uG*O}rkjuj*CzQ)+N@+)d5ABv;R}v{9Nofx32PH)RY` z7j36*k{I*mN-T3<6&sQdJ1Gr)$kDY6 zYsc)+f;-ol5)1fm4gTQNgK}9?UM@Dunz9){E}5R1B$v%y9 zch!@aG-2cNm{(8Sr~F1~e!WVlPgI66Grnt$Xo<*BhDpQngy-ie!+sEjrRNDHVI=v| zC9<#=jcLBSRAJ_Lp;r*r6silIiH0&`sV@yPQMH;H)`4W*o^3?f z@%aZsjVtt==TblhNtnPvRKZ(KuRz3=7=eSR0{olGW!45%gJH7CWg4Fcd%3Kstl7B? z-A|3Dw$~%DEXRF(PeZ!oEXK^Ir6}VyM^cMH+5&F56{DJWWhl-SR2jyfHA*v+>sPW} z_cmoKvZk+;@6Sx%n28=G-b7yt&&t`_Fsqg8l(D(9080e0h{J!@5C0w39Z(QH&3VjreYzkH$&jOAp?lF#>3Ud@Kf0UVEVMK>tqctAoFqQG@2|nK$2sT4Xazx7fOrsbp$90T zYS;}(qKF=N3f=ljy+9UB)eujdYAj25d7{CxknB5E5f6uq1Tdfivv=DU+K>kJS}MNi zaK+GV0%EqrEMPQbJLhJ>Ds!P&Lw0a(7Pyh$(X9t-h|;DfRvky=uk!$gHZt;x@s%yWY|fhnlvWb-_+oXVVf^K(-FF1&>)Ma<4QoY8iOW6vWBS z$epf+mb$u_0uga-F-7D|MtE^DhPB@reJ%CLc<9l#KquCg_MA3TLTuZjRUZ}2r5AZd zW33jvF(SV=dBj6ehl6puc4u);cQfl)s%I$i+&L^!5=8?pHjfh!r2pr6N8tyqAlkgS10IdM5Cw(h|d%W)(M-yPM*Y+wplO8LN9=#IkQD zV_nJ3D#7I_vuXnq-9wr2460}}roplU^807}0Q_3c4sWOM&asyxQfjEhQB=EZ29*dN zeWp8Wv>O8Y1D_5|num4a+Kbc>)!(B?*?=Zgs%ELck9}hHXnBNE6RVtwKwCNG$CO>= zYjP?ApP;GS(y^7A%lF1^6&@67MvuA+^+_tkR2A~^M8Zp(a@Qfwu=x@ETsRoxQg@9X zZ(Ux%M2kE{>SK^HT2%5693(Q*+5^H4sy}pC$}FvWTgWNJvOaf?ty00qf}}8B_XYW_ zS`HIGiEYR{cdPtMfdVTT0dp*vIAKJ7FN~8DOPNx}J^F1`h9p<(;dKi=DJm)JbFawG zLw@&)?XIViI90-~0J=e!!du9nq}5RBBUF28k5H4i9jl(j)j_q5%}#o>Eu>MFm|_f>o3+6Tn!cjdOYU&auWi z_u7G|)PBXqQ3A0tz)fKhwu>86ISY?@P2v;AHbI2;wMk1=Ga5a-E5aUIUuV$FNO0PA zZY;PUT#6`gLD)X_Xi?r+jd)g-Jsg2eOK>&l;e8D%r8R+vCrW-7q7x(-=Y_>+8^?I7 znZ@$g(3z%SXBxdr(0RzaK|?K=Z+k@WHhmiP)jTyXZ+i7axm|QA>O|>@(q#ORF>1*~ z@k!>QFxe|iTiY1B)+=24mj3s+LmnhwJeHlA-sw8Js6eTC;}a9_wJ+;-tg5lQ?dpee z@xpt7UOb7;L~GSYb|G~#F0t5Mj^zhhl^cdvWxS`9E^zX@p|KxiO6n5Tav6;& z#FK)%neYG+fC6-nMq>*#BvRWn!g;k$hpa9o-xv@>$as$f*b9eVWEDw+ZqF#L#b_=} zOIFQ;;m#V0UdjU)SLD(H%TG zd(=aImwL$WQxExF!UeT4;8Twh05RWGV$~#5_e*X?nYfJ|#rx9hPzXA zD9tSw5<4rl4R~Hcm~>nMdw(Ra=vG?MiZ}Tqi9P^!JK`%-Wh35-cbQZ;o9cW!o zJcnmF*5fwOjHydD1*(bB8yn}n&Cz-^5I-L+cif*XlsB*Ntah1n!TN^P82?2D2I+^1 zOSW$P`bUMz_)%v}>j?@wPPJ`36j<51`>nwJcgF;bFU8Z8n(y9I6h4lRg`S*SOz&oP zqYtOZlJMutHZhvl#}7pwy+bHeI$cdmkg>aXTw8H^&7@elZ2~|>+KqmbjAz3bV;tHx zX(B+#GIkokRREEX<$5&Sri-Jat~bqSsmDD?Yzm1=)ETCa z%Tt~KH!l;%SVw7a8XZf6^$X9tgqtuhQQPcv}Qm`j1dkKUteV*va}O{xShHn z@@ZTkzaOs&+M}YxR;HC%##m=G5%*k3(J$@}t@~m?hOr<`gioZsPp^y|V-u-O8x{3p zjAug`cqY5`Y*15h2l9k=Q(>X{tb{MtM<+Ne9%1dncRd`JEH-LW?TLh2bf#hFf*!Hc zB#6_q*12W(0CR4pf&8KbWz8n%GNPb5gs=qYx*kMa5d}KxO!&}2LOb}m)?_apORv^Y z_8lkWN9DG9$`lR+LU5@i0f+++?~%JtwvD3pYBA=B1Nptws@|Y{0U-|*$L^(?cLY61 z2!qI@-*qv^n3Hz^AApEYcH&bz9Gq&qsqGcONZbnqfLT;QxmTVP#+;>z>+FZ=h89a- z;!&C){}w7a5-;9^;-;8XC5;WAFD#&3ZnVUWKG|%eP30h%Xjr&A@HN)w#>z&2htZ`4 zx+c^XVU9SZ>IsR%+JTU{i^?$8KBVoQ);;Z}X}zPddFT~otDsdtsmGN9%5VM%SBlf# zZMx(6S&1<*qauFHZ9JXFWHWs#jC$sMvc$EQ>08qK;)_d!p`NhCUQcRg>bBSzRS&~b zMPV^vc`9mdH6zFu9XzRHraRxL(M}P!O0c?FQdRXnkIZed6qB(jx=*W5#;-6t1SuyS z-R59c(jl9P`evr2^k#iu=Xk4PKE3q$)^V-lvd1akSTs85E_7B*yf}5A5O)84$KPwC z`vlJ%Tbd!>63{B@qdAXElV({@(9s)*=JqVCunZHoOKs@HEzu&C2y=d3X4cIyBXF#A z56E$RzLk)FqZ3PpK*Wcy3K;=9-N?z&5X&u*U~movMtppe>5 ztWPr))}rm4>tvMQxWYgfi3#q3W2vRu1RepFi!)i%cGXdHMbUOs@z7ZLe@)(Om; zgTuy59gw%l*qE5w!*Qp(6_^UmD4_6!z~sun*?|o;r*TAQ;F*ZUQ{wP38b_%JEjzRy zhyqNg0&V{oty2Q%e9ssHxY-6CZr`3zf$^E~hTVZyX%P5`^Z5o=k=eS35E?)v0;6F| zTj&UN7xYjSJ(O16=;7R)sVhUIDc-^m=B4&*M(!E6NUq7RV*1GWrVv8f>9P=9Lpgdz|cV~Z5I4f&i_E4(Y_R6v9^)dH&q=V4| z(b?z2Crv(H_m@v3Lyy;F41gx^y{M?}99(w$LRT~>W*9&ps&!Hn4Oa&%vE2<4gEe()f^@JiTH8SPHg z9N3a3I7^3^k?nwGwrMT68(9JVM$WAL@-{++<8#@At9ycOad)n~HzH9=|NKb*~5=&!a}I_|u$z;UQt}60hVd zNkV&BLSa7)SQsQC5yz7LBM2$QJ#;9^0(Bj)sjjazE~(^oWQI0DI+Q zOcAL>4=M<(GI$2cyRSiA-vHmc{Z0*K4pORwsw#C*381dOD_r2p&~HRY>;c?$R|1E+ z(qH(Vpsq0lb!7u+04(dMn{-hg1T1KP&S5`L<7`iBkU_dU3P5K5Z;wTT@wIz zY0l8^{pOOy>CzF-)y50}_Ui0E6%S;};^feoE0VFRjCwn)ZRTNvTF}$NQXpEYb6{F~ z;*oEk;lzA|s7CxWuB)Sv2RfP%)u;}LY62n<=goX1du!s^Th*U%5l}~xWs@eO6^S;$ zW>_1uN|D1!Z@9fwk@k9OW0D0;1cKT_W_+_2?G#P{x*fPznBoX%GfvLYhM-Z1OWSsL zOoxat|C=S%jb&uOq9A>TYH@&ANGH$eC?gE(Tygr{x$WDv!ODI#Jtg;^c`4|Pw%bKF zQ{@RjvGX=oQGcjq5xdM75(Jhfzua~9xIGEWLdAtv+7l)4sMn9Auuu_0uUP|>IB)V4 z(ACWtSZ4eu&BQI^myPO((ryVo>J(U(GQ}KgicNNRW4*Kbk5e&_&b}R@{*7u!+!Rfu zAf>6dhYQ3CCXaBXi|lMO?_MxUDMq_c*-Md}!Z`*<^0?ZJwc|lAyq5DX@8OwJmTJGh zhvP|2;~Ur>D#v_hF1^#r)j0MT+EUFN2mY@*%JsEg7PjR>{{6NU$)W)%c<2wp^(3j;J?M)gy zaY+970;laJ=LYlr)x|s}VQ=?NN!qph*hYduObp#Ax?^Hp!OKDTtDvgr!3VWYfKW!} znMafZkw@<9RkV3sm_VfD-tiZr6>^1XDhv&!3H2zxwnr_#5byG6JbT%gga>ULx7a$M zKAG_hGd2-F+n{*XBga%=gu$Y;#s%%Bu;vZqcNQ-Jgiu2hHfFusHm@g`ELHSSRLp!W zx89KaBF+n0_;EtWvB&K}cu(M9&p3(PbYbBeM;QF5U~tmmPcAtWlv~@K@zOV$o!W1C ze6TK_4lXW#Mw-`5AEnDtnfyddV@EQcob|Pc)g#k!uqV--gP3w`g_;p%ZFv}Xx365idrr48K7r*JfUeW_W+Ur98o#myXExTx)zCPyv7!% zX2;_!Zx<6L$KsimPmzlHYW+dU4<~6nPckqrPm*`fWo@3sdnRgc*cnko^lQi^O{7Ao zv`Q30{U%`R8oW;DbVW8T>B(%2ZHxu{aPhrJqv+(=QI^@kmH}p|>HD&2TTR3A6CE?d z+LY;NZR4Dhs?zLWlepj^RlNT2ow0<7Oa4?aH4I;*z1{bC<35}n6ge0+6nOW(PUP*| zQywxoQY9Z8Jvf@W<-x-jKUE$RvW+_sJ|RCS>m2n+6&f7%_9(0wpb}4XN82f7NOa`Z zz3g7Fw-h|zebd`+^K(BYqljH=G*s`36M;tq&G+XtNei5PhfERna16_CK47mn zx0AX{(M1snCdZ_xMldNo+Xe}f5_t5xoy=@%mZRRzG%p!uI3wdB_Kgg^s>VbC>_qv!kU<@huyFLE$qcJ&=IZGGPS_vfhy8XQ z_IFBHIe^w=UVzDR&{(VP2r}^`42saFbch!NM#z}aar1QN{2Hw|_wK^>-w=$@g65>$ zQ=NiNwe6rPG{7g~--Q0ZoCqo?5RSSrjCq&aFfQwa#RBb-KItfn;onlj3X;bu(DuyD$O%J~@24ym|iIZ>QP{86=yvvf++qp4aAqo@05r2*$$xSVS*@BX;Z7GC>Rss5k<3hC|#%1B~~gu zxAthMy$avXBnco2yNd8Yh({DFT{>q~eX0i?xygmK%NIFpVGW*Ja%X$W$_U4ECbwN+ zsk#+q5JZ93SBJtXHEw>D0Zsu#YCNZ)1qsyosaRjrG3xKPu_9!P<)3yrT+yYh%%mg_wp+N9<#7ihWL+vNy4{!o6G|!HNJf;}9MJrL)uf(B5 zOxZ^`lFGC6r3_}=KN8oyfP!(25|1yE4}En}{D)pqPXOt&2Kljj}Q77=kxeOA1&YXF->LnWjinB;&iqGiQGtFjMT+ zXSD=g0zv2r(FsvrcXs#T6QZ5M36c0Q@$0QPQ}LtbeOZlcDr2N}Qq{;y(b$v0+u5~o zhIYYdgu-It&FgwnlH9;~g(Y=w@IEnYF?i$0RS9+r%h6@w;LXD-3w@g=boT(gYs`>2 z;*R(U&PZ2N?>&Q2gHeEC8VjUGQB%C=eh$MV-iICsHstXxsRkdo^Y?vHyeJk6-H&x8 z>*Yz`T@(xn0J)5h7!)<-wJI*RDqg##DFCZBJpJ@B>B&BCtV${l221)NZ4(X5`}47j zA1ICqZA$>X^amPBX2pw_jO(U%5a}9tVYcQLH#9UB`2GTSlOgqu#)eBCHdP;!>7q<-4 z-lSgHLP{jLvnNIk2r4q_sw~ZG*zeg7va~gTo*w@)P$=nMZ}Es;6@HrBrXlD_o|uYX zxXV;P&{M$`7Nm^j84wVkNq_-C&pHZb6%>{a^$mXqIEg*$UVHFpa?=>~Mh!)EA~AgK zeIV_5gqX^bl|`8E0v2%)oQPe3F(Je@rUZU;)%oH%1|-$adV#x#ldDM#t3-=Hb_Se@ z#Nf80syYWqO#o1Hi*Ca0_GS}rY731z%=&DlO6sIc{HhuhMYtBkN!);IiD5=_0^2dK zy;5@c619N|bFW0tXkw^T!p4inH?+v=&E@H6y2;AJ{%aPL@HI@WI- z$4r{czD&e$_>WIa=!i^2)$5*is?LL8ZE5_Z^+Ri=0Zi#O0mqGk+i^)0%+qP|;m zWR~{Sc5%NcEoF3O3fnj^L(YOjF+E@;KuDOwNG7Lc(MzTR<9o1ZnDEzmGeV=MOe3g> zjpaBP*0_#@Xp$+iWVW3Gfl1qn@6X$VIS` zYo*JaKZE0203A`LnLfTHio-`|%Qpm|gTmLff{J)dMDwT!Fp&XJ5wL$wKt=`O zSCCQhHzSbI_;I~gkkO39%LEynIqC$Qe9RQd(!&HB4ehxQ)ca8UZm*Bixj$Y&|CLpH z{wiL#+MeP)#$lwvbFaS=U<-P@8q6&{pmj7dR ziRC#!Gp&mUm!1sBcrRd8Voy!OZ)%1`F~}@3$UhcaPf3(5o?fe`YIJ0s zX4u#yUFZlTYin<(YXNIrLP3DGx}~kFXRGd(E_r&vB_Vc6@JR)%to^87ADK^^(1(X3^mB?@PuL!mlwNl!u zJ1EyTVA^kouvK&5>D^D?Rs7rGT=mThvhIJRTe?V@(VF*s`t!>~eNn=U=%C1;gCBkI zap1+20|R>o(!WbNF>s<=uv2h%ezzXu`&5U4^$EOlOrBjSenMtrxUk%d&1{aJ?{5;4y0~6#u5hWzyZrMCf)O!=yz^$ODFgL&`9qnOMQi7YLPOwa$)UCuxy(dKp957xG{%YKOh0@7Tw?wN_)BSd z3tdG80%`{gUPe~H5QEufPV*VqO!IZ91=uUF8BB%PRR*slyjU1F`SY`T_Y#q2Vif zmGLV&{qJ-eZ6BivTKrNe?JT92+3VWqFM<&#q~rB!dAzQCMV25i**XQp6q@_#C#Ntj zTjp-6Cq_@9Ty+75GenL}Gi_Tqv@r}?7#LBn&OhT8)FB>a*qdz}%GeJ)ZB>(Fp|fF; ztXiR-n7e%Mes-TY-_^@n+TPrQSH|Y&;)6m#z-Mz`lR3N}%IM-(WseAt$%+nj3S(av z(yyfs1=Y*~%}CafI;(NHE0s=Icrge@?@GLwO*tD~@ux;?mkNaT`o$J%f7ZENT={`^ z@xs?FlHEv3TC=B+EP9zY$vAOi&#ROFgmoKF4m@Ks8|>y!URaOC;vt#{6a%D>{WGBb zBkdff-vl}@9n-TzQ*56k{260ilN{YHkTN--#Hnu4A zj#>ET_=h>oxG$Q<=&Y?x0s7+BKG`A0YYxz(p@=+To=_*;+S%E8c`vgR^+l%Z#u`Fe zRo*V|*Ii3hBGLS&uZ54^o{xZk zy1Ei}ppUESg2Z6JY8KV4>(;eyef~mUhj^PSx}ww*RFUC57yCw3S>V@Oj|B$MgJ6LU z7Dfo-1H9*X@y~=v+)Sfjs*B^*00Xi_tO@HpRXeU|mHboN7m)Z|=}e(?!4!IE{tFG2 z!_gP#>jiq`>Jj~D_)grP)kaUG|A^woRiV~x5d-5rXc~R;ZRL`@(?mjK8&#g=AW*85qH1&qQrPWmFXR(~L&Y`^+clvK}*-}-QrYT%)3hPpQ zqtPUO)AWout?Vu;Px@`T6l?V%Y0?9qJ@T0&_`4*jQi`W8E|h)qxq*5?npXP$4nb;Q zHHG(_!pu%GNm=jB7Eh6nERD){rSL&gr!r@*ljYsE!u`;hH7Md zSKIpxjTuBV3=4twt=Dq`-;IRCHvvQstC0ZxNdFZ85Jq5{iL))qE+X1?iI__N4N8_L zq)7`!^W-w7{W!Q&M<9X~s6+w5GtgE5SqfOO2lY#S&4U4e6-X2>Ifw-^5_1iz;k0m8 z0E*yr{v4p^)0`;2dGw#v>W*NJwcvnOTQoo|0<>74#m5cGe8=rd0hyhl83U(VeNL-#ei@;=|_3T~hYbaj%R&*W3y9Ov;nreCLz6~-IU5;j!{Dk72 zvMHb=nqHX;>K}sQh}z?aU2QKO=?8oW;v!xv=!c_HEZ9(dbV@*nMD#d&XzlG`j{Cxn z?A#PKC7?5`F3#n!z(O?>;L~OzxS4UMnx4G|s2!Plf>B7`H8JQiUhG+LB=7Nx#v{Q3 znX`umuqKt|*Um45&!LNa+K86Nfqh^bJL5H&(6A#oqwn>$&sz?4#p) z!{V5ak08_okZ-6bPn)Q1owDz!taxfHJv6>jmM_!&W{<%>UO(;TURboQl=h#WD4f(+ zWs&xxp{#V9d~h&YRU``Bc7zSEF0$F>0z3MfoCkK_Kl|2pV~pt0#50r~?Ug(S5U=9n2Nh8so+9jkDwq4un)8Td2CagL35eo?V0dR(lv+9kYki>qFck z3ap_>IN2BwIxVcvPN3;gy1{gqXGp%+YP!STlGzkhf*zx8c{Ug*{(-qLp_fj?Zr?fi6O_c1-x2!TvRNz0Mn^)-ll153(Cmo2g&}qls zo%Y+`Jm2=vBkv|046{2tf%+ls*EU1|zshfg0k-S_yjwbR$1l^2gu zK8qeW-G5qjE1|ehorB+fm$#$$(y_=7lnSBZ;%OKD_Tp(!HTdwI14DoQlDc@hbk~Mq z%Jd+4(n!^LFP<(Ns)}f21|lz>{*u0U`tnk0>nV8S;%W58#nZz~zh?Z!)2E-fc>1Z3 zi>C_&@1sr6Aiq&xL;x>4IS#=V@th5# zm?Q$1Iv7Yb%FJt7`rs0Zyaq1O_nu%PH%?(CXenNd*0fgxTxyROggRN-VuA1q<*0D5 z2UwXPoj@qeL8$g@fJ=V<0|Ecx(gKuX`DKKb&RG^g9Ae2@Fnd0k#?tZpS}^AH^lpC= z<1P?P8Q4g*TAnVc0o)LUl~-*8?erX@~I9U@Bz*^xA9{ zAotS7jk2yuynOQ2b)ot0bT+El5+C?xjC^l^bzfDs;v}fm4-=`@QyFJOuO^+Be2izF z9R;vzpsPQ7iv2}Hd}>eLfYh6}ZV|vLWnoWJ`b*XAp@bq+ktN>V-2k2B)SkvRbaXGF z$U<>T&;6CC77UrfLOTzk0FOFMqF$=9!33ZUXfi^Q4Yr0hg!YU*BI;RW@44e_^Th_) zF514SO{>{|Xx3PDr2Sk1F*-VQ$H)D-O?m)D_+VGILTXgn7gWWyq20$gl_k!oXzVsj zMNzkh_)KNw(Skgi`JufT7nDgs%j}2S*0oCQ(u}ygB#8@+QP#Zo(wG3|w-lh;tLv=U zK#WZj4kgMsE**v!J6ORe{W=JAoaA|XHpaSZEAYE(C*wuh8CP0FP=>3 zGK=P(OZNe(rQhA1`+RusZ>R)&pq{7Cd|>F0pv+Fd&}-^hQpZq*v(_m`qQ9!Kjmo9c zJ}s+k_At{{j(HZ%P(3M^ok8U)vOgt=tU8L81%)A4a|CM3u37-Z)^zpELl0rb?CRUj zafVwLnM)N`MaBcb8de{oh6O*Nus#mnaEVes@ehg+S>I8DcRGeCo+m6_F6bL=mjWo$ zw^H@>ZDS3sR5N8HKk1dNR1;;U4hG&MS)4{WqtmD$dt>0?gZLKEM2Y%tp-`0Em3joj@UZr%crHnYkG97J9!C z=AC->Y>XuD)aTU9!Ms!A^iycc(0J=1@FB<(z!H#tGl&2T36RRPj!0Tj3dmN8DCPR? z8_1_}zT$d{3lsI2q=3h*4Z0c(1oSb1thiPfzegu5hjmhedWaJd3-W~r&{Q9Q*(Kba zXyXJbL1k33D;vN^M*Cgu!keshkuFDooeflE1EBF7BY;LNe^?aTFWJ9N8j!RuvCZ-L zIfHeqRRv^dP8HK2Lwb}_68dwFcqu^$m^ePF)>x%L9jTzxo25}OQm?Ef z9tUJ(2}qncd#R#s17$f|FCVyr15lk)lO*;+mmHRXPtd8? z(MJML3M=^~`e-OL@%ZkeZ3@#Cf`!l{n-~l@sG$-SO~(Jwo!q%D%&=KmyxYv!kvEBX zjAFxLCLTfN0xE;0wr*zFCk7w$90o#ZZ%gZay`FJLlAn$+jXDx!dwD5SXNx~h$G4ac%LJVCTn-E4!aX)KeBRm?o~0>_G$gN zqyzQoyQ!C^4@uKi(Wh)kU(Jz7w*)Df-wHt0wwu~3jI}%ZLhGEhuLdEJx{OMpOqE45 z(_E^MG2sB6bn{@FFn}ilouZK-ni@+X1S>2EHew(*P^SOMp+GdZy_;l3W*YKg9UIUy0_Rd}KzIs0__QrD!U$A`3X# z{My5B^8LlKLBylFVk`O7U{~+=HgMaG3yL$blc>WomKmXOM z?_C=jnFhv}zX1Qq^~cvp1xWT3CGmxbpJoyRmD|_%b9NMf@HaW!8L(AK_Gvx?Mikt- z)u4LfG3c@lx)g*NiNbf#t@Ei#t^pqj3Lxme%2VmV}4@@5-^4k z8VRNlnvl;F0+2g&-1dB83!y&Hxr!+e82)ALsZjt3h9Md84fGyK4p&mo58;~P0}`Y) zR=igL5X$R~h44l=pM@|#DEU_5-{QLn9{-yM7}rANV?sE^aFRU9ac%pPzWBw1|NL~T zKLe83KWg~G4*KrHuY7|4(Et0tS|}SVef%$;|D<*QpPv8xM7*{?Z`@ZS)BN9^|6oMr zf6x4PKFv~yAR__N&6!GfQ737-NQ%lrgG5CF7@&9T6EF-IcZr;nZ-z~0jf+9SS_s~~ zE0BqniD+3aEfXiv%~YsF6fC8Ke<<$Rya05K=&6%v88Zq|IWBiiV;$p|OpkE^l~Y5k z)6@aMBM$}2C;nC>7(agsB0$ohOE>-%fTVR3Vl5Nq&m~e2 zSht#A4jYZ#j(VeEJ|%D%Qr&e`v84!9=gcht`iAVpUmf5+s>6y)Yipg=oz_yctCj^+ zU)^qfhz%0$WT`f*p`b9k0O`^#DH-{NW|X4W>GM9LCN1W-_oe6uWxK%MAMzsAQ^Qv*1Ey23~Z5h)XXm}M1{o`t3Gr7bhf-SwV$>* zP;gXR&)pO>`;D3qJPFMOo4i^YYAl=qlkcHXq^QK{a&tw$Jd-O35xGU&NrK!~taH<# z_zXeOPzVh^q{>C>xNNsr;A@s>AXmPo}4PanHl;gm4S!D599M_S-<>am$+83;CxG&5jJqdRuoV|@7k3s#p zr2PF422x96dgEmnu>u6rjA^%#;R)TT2KG+O5Y;`n*)~Kb#VQCLf+mwN9P19;{U+#e zDdXG0zO?Rvr)-FZ4Mt;a{2Xdp60)4cxL3}oBr}jVgK+>#K{1Q%Fy}-JuQGBIOiGGz zEruv5pE+5Qv&qS5<2Gze_>2T$Z+%_O_eN3)zlwoF|5`J7L^fzUGGrv1B~_4(82MHb zY87Oh`U}h}Yu^W@kuq0YYi@<1%rHbEeo{(84hVe)EyplKqVsVY7g}1UUjQ%);y{jk zt3PC{^oP=I5E8(mV%?w5lEHhWfFP4d>gHaAnNoC;6qXaQqj4nY;5trCW*`p=I8~eY z8KmC;$Z)cA$MH?@KAHtUzZa$fgNR_+bdfY4mpbFG5m&WkkJ6X&YgzWhD16L0Uf}^caaX38O zFDgVZsp+eK3<--+FeD0vb{Yj|ID{kM8VM)ge}0-Dp&yC~IdW~Q{qh|R?a2T{5Wx`j zdc|;(7QX&i@ty<)j*#CNQ7F(HR^X~L!8x4+<)CzAhhH*ku1)9le!Rn%AB>Ob<;19w zYjP)2P=ElT!jG`cs2;hHk!2`>O;?bfVX#_F`V^}!yO7eE88EEJr05Kp!2Mg&3v~JU z>7W$_2AfLfmd`)p5|$TEH|R<<`Qr+)r}B-2G&B*Z^?4ptu#{fXULQzVmg;n$u8q~@ zFOBsCvgo0VMLPJTbdv{}!>uU4z-%eBSW;*U(x;?n>GdfnC)-k(lAUh`V^9V9LcK0S zUk7bj*{SPwY&D&o>R3^;u|^!0 z>ru1lOsW+$2!r!dk9pTdho~GWh7-uen*$-o>?AiA#9MXsLE!8z<5y*wlp@l zo7XhfMxP^%eP z(k?V+m!x8m({)AfaNiUZjs+Dx3a4kedM>?k391@`xw2>piujw*@K0f5u+in|uMd85 za7l2?(^WXkmeYiUL)EgpXuQ1mYo-Oj4~yX!iny24<2Q{t(RiIAGh>w}Kx080|;X zo|_2<4Nw==RSEO;^|#(Qk5CY#lL+8v8@5Dg?5qiV^3<6-|Wh78k$atTCl%GE+fI&3E)Oa)>0gvR9<`Jo1 zI>4F2Yh-hZ9;f)FKg)$BrFN9w^Kp)_D09F%5%>~a0 zysn2o0=2JwGMzA0+?y_VTFXIqB2%_QoCDzfe4l*Rf6apL>V2_RMD7Yu3H-%EIwyRq z1>OX`N015I;f~}@z6VNKa5W= zuD`Cw|10yO6iQeKhG9vc^CMt7PywaT68@QSquw7mZvK=0|7b-27eL)JpvG3N1S#-K z))feR;aiQgU$!p=X*C0kHj=`^wV4iDG#^6#RwFHTwbkZA&1OJNO3_@X73uAt_J1La zZUWPOxxPFMAXE|N`sUY9t@Ivh@@W(?-QvMXEK^D|k51|~cZlwO% z@Pv#I@|GUnA?=X?=Z)(MyTo7&gUv{&rylatLr&=s=HXTWH-7DKUjn0YLLJ_Qtzwu^o_>D)pY-E`w%3>kz;;p42UrV=-l6CJT@^vO){WH zSg!hZ`+qzT`j*87*W4kr88tkQvgGk#l`3{MSYfSwXeJ z2;ytz=d!Mjmw%_m|6k+3VDNtfWEa>;he5IkkQLD2+>`@~8?KFDTb;0VlcC#3vUS<; zMi!8LKlhH;`=oCLk}#*p2t=LNJCX~`;j+!ULAE*cwduUxH+)&?Zk&~Y%gS_vtR`NQ zl>v(Im$!J-S#;y9GP$hGH^?gYnyfM*tH1k}&23k+3P%2c><34BF2npAWSBuL!{HZ5Paf*WLY`I@ZskQG_` zB*(t1SrI7$MIDC-5+dIqSN}o!${)Vb6$txZeC~gTw5~t=KjBIS&d73*ZW?(%GE9d4 z$ov1UFzJNqWSVqRMP!~CyEo)iq0fr5WTKEE?;#_n$>75x6; zwfFktqu0Iv*yjfinfkwae%cFes!v~ddHmE zMO%AAgYG_gcB(&qlJ!(?e7>q`8}xbvY?|2)0#!JAEzOL~_-K6L3L zKYlX4py+|YSB_48Put;-C)aFfQI-J3uYjO{nQpH>^c0Z-!z-Cj#QH*6PeMpW;>w!2 zMa38UL6VEO)k4P(8wqo3caE?YBGUFr$t+5^VWIm4LXdLT5@FGL=86Q^_&G>`rQBl* zRa!wH-2#H=@DHzBgMbADVio<|01*fK7qs+=?-L1g`J%?<%CE0`#lXMv)wl49Z>Lam zy*{nXGo?&3_PPIPD;R33$2dzslwXNKg-BiX4sni+J_ELE zp%U)>z{UUi+mYP2W$^xFhhygAS?PDSF0B3)-woy7BXvPt|D5@t=wFpng<>En>C~#Y z>(jmi@$1$8_6SEY6c55cj`uj}-W4|iG&4bf{yDiFnLStDN&W{E%-?Pq@EY9yM9vop z=}jy|b8UZOQzW&|6mF76eyQGhQ`Q7VfnhQZN`pfO}({Z(O#JD=p zG-iZM^ykW}h3cr_OTVlb@E|aBWXb2Mtk{5Z9B+mD zDi2*r(!#`JN!y#?q(Sn0&9Y;<18s@DK0O&wli(EmG=0YT^69D9rx!w66P(OX)9cTd z*JfRx9_ACUnFtoHeo`I-LT)QUOU3YTMES|B4o=Ze(;J};$`B$Gl*rM)hWbK~g|P}i zhU9<%C5NFBdzGV3559z;WBIgkT-!i8mH-FRjuLQC>0hBIZS5fs5T6d}#|FS1DT5T! zaVx@*-#@`O<;eUTGv19}`eMz)G?bW;qA~3Zj?U9KW6JOAma^7)bMFD=dK$Aangep&z{h=#m@ZF7hg< zIr+4lxK&DQ08J(m;wGuJzRCeQ9yJ)eCxBWQm-|;aPc6OvGd~+M$2zOLxO4{2NY&}& zvV3CP0I#-W8qAqF;5$s8Szt-g>n+xl9BWQ?iVl|Obh?bJbnrm77IyCW%t&C^f`Y;5 zaTC$|f)Ib?!i6|C$;)#qq%7de~@7r99)l18u3&deC`w8Q}_UED#QrjLA7 z(b&X4;a)Tvp~P^{XFAte<6d;-HN7z-hkwc`qs(q9Yjioe;&GpZ9bm72`|in8gYOHt z^^rmj`-3yKpKYg~djRyuHN4Qzr5hRlC%B3C4To#B?w124^zR*^K>v`TNMQDj#?Xy& zI|Gp~`5s*R{TrqJu^N_ZZz-~CM{eB&Yd;Yxx>i=)I|CjKIOy6ft zo;=14BC_qcxS_Ujj-&a?AWBas4wt~_$uAUXB$v>6uw6nT7eFAd#-Krdu=C0t6^%tZu0X0FXPf)zT7*K>L(Cz(#|; zdWn6ZBX_mgl2d3X%+aM-v$L{%AgD0&Cm;v_7N}lX>g+BTY!~uDnh~Gj+x40cTqy$g zEb|wh<@~}k!!JC`_=RWsYn~BBvt0F64jfvj$Whls6enQo8EIJ^M8Sx30bB+8rU?{l z!DyY)kgGQ47!3vkG#VtZOrMggwq#hc3iL)phEZRbku~xp?Ov9jt2SHBmVC1zC*53_ zZ!{EI_!FK^vE-_AvT`!Ajp@4V42v$a(4r@24#`|DyQQenMf~-+!TbhH4l+p=$YobL zO`p5km~Au^WTxv&@GVo>TfO3r-S-HAoeC6LFmt7em*FFIMl$rdg z*Jq}KH8Gtr8AEb@^jw?P7n^y**qj^28g3Yyal=^sPhj)IXYJDwNxSv~Z zzqV*v-}fUR`qzH{J4id^%SH$s9$5_~WpHphf&X54vi}48OXLZAeE9#rL;ge9I?|lK zw*Cr8?DW^GV|F(3I>alGSl%zTIAz}0S;3RA$ zd0qr3X}dBwN!)xm3CmOmCt(Xa;UsKd7o3ExdjL)%=i3J-fjax356Nl~$)jfFaxP5r z@%-&w&of8(XDYbA%ENFF9GM`FZO=P@@yBBn7v4LRFfsKAA0BjZvQpphfRw*{{9OG> z`RG$`o_Zj4tZK(SQ2*p_pDchl;ZNcyXb2ik0h|n+LO4Zmis6*NDTPx8X8@dmaLVB% zJ2aKPD;abD|M9=K1=c`6X2S{632si1xj@7WAiCsu8vk4%%rzOyYv3evfXofTcijOe znHxLdBy%MU@*-pJvmf~JPvWX!r%Fmo1KAV>q9<~wxcNmwWS)`Zr`IU>7@12%M0CEd z?Xw4Wai96*?hT*x?*8<^)1TbCg^#$a?~^;9ym0XO^ABz2BF;U(`$A9KC;NIy1c5D| z_U^mz^se(S+{Kmu+;h)=!o6~S-QyQ_?&I?R^!L9%zwR)X_}uRvIlrSVzjQhZgaVL? zkO@w*Ie&QXx!*qknQ>JhMMGM6?k~3u?xE_a#8>|cxRScs;7Z^_9b5^Y*a=rcZ#)23 zQn!6@C7C@9SJDS>z?FRNd*3}NLMWV-=9;3$>RFCuPRDY~%IZ2taRHY<5g}Dt>+Q}u z*w@bqLCDugk5s~Dv_*~0+%xXeAV9n(vH)y2*V$JRDx51)BzX?5&zCtHTUm(jg56KvR>6t+EDG_>OscFwDM9|Q>$sIcIUS^>uP|2=c+~uPbplY?*Uq%#bz$==f|=-`i$CY$Y)yOvc}0dxOJ722^S_n5wuMf3g4f{Qn;h!}&QFBo(gdP91xAq9joz{*t{s#0>Q)2mVp+37}o zb#-PEPG3Iw1=nl&&f3~+A`M0ya^da8re>pGDF^#M@fbQl literal 193024 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 query(@RequestParam Map whereJson, Pageable page) { return new ResponseEntity<>(pointService.queryAll(whereJson, page), HttpStatus.OK); } @@ -42,7 +42,7 @@ public class PointController { @PostMapping @Log("新增点位") @ApiOperation("新增点位") - //@PreAuthorize("@el.check('point:add')") + //@SaCheckPermission("point:add") public ResponseEntity create(@Validated @RequestBody PointDto dto) { pointService.create(dto); return new ResponseEntity<>(HttpStatus.CREATED); @@ -51,7 +51,7 @@ public class PointController { @PutMapping @Log("修改点位") @ApiOperation("修改点位") - //@PreAuthorize("@el.check('point:edit')") + //@SaCheckPermission("point:edit") public ResponseEntity update(@Validated @RequestBody PointDto dto) { pointService.update(dto); return new ResponseEntity<>(HttpStatus.NO_CONTENT); @@ -59,7 +59,7 @@ public class PointController { @Log("删除点位") @ApiOperation("删除点位") - //@PreAuthorize("@el.check('point:del')") + //@SaCheckPermission("point:del") @DeleteMapping public ResponseEntity delete(@RequestBody Long[] ids) { pointService.deleteAll(ids); @@ -68,7 +68,7 @@ public class PointController { @PutMapping("/changeActive") @Log("修改点位启用状态") @ApiOperation("修改点位启用状态") - //@PreAuthorize("@el.check('store:edit')") + //@SaCheckPermission("store:edit") public ResponseEntity update(@RequestBody JSONObject json) { pointService.changeActive(json); return new ResponseEntity<>(HttpStatus.NO_CONTENT); @@ -77,24 +77,38 @@ public class PointController { @PostMapping("/getPoint") @Log("查询点位下拉框") @ApiOperation("查询点位下拉框") - //@PreAuthorize("@el.check('materialtype:list')") + //@SaCheckPermission("materialtype:list") public ResponseEntity queryPoint(@RequestBody Map whereJson) { return new ResponseEntity<>(pointService.getPoint(whereJson), HttpStatus.OK); } - @PutMapping("/syncStruct") - @Log("仓位同步") - @ApiOperation("仓位同步") - //@PreAuthorize("@el.check('store:edit')") - public ResponseEntity syncStruct() { - pointService.syncStruct(); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - @GetMapping("/getEndPoint") + @GetMapping("/selectPoint") @Log("查询点位管理") @ApiOperation("查询点位管理") - //@PreAuthorize("@el.check('Point:list')") - public ResponseEntity getEndPoint(@RequestParam Map whereJson, Pageable page){ - return new ResponseEntity<>(pointService.getEndPoint(whereJson,page),HttpStatus.OK); + //@SaCheckPermission("Point:list") + public ResponseEntity selectPoint(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(pointService.selectPoint(whereJson,page),HttpStatus.OK); + } + @GetMapping("/getRegion") + @Log("获取区域") + @ApiOperation("获取区域") + public ResponseEntity getRegion(){ + return new ResponseEntity<>(pointService.getRegion(),HttpStatus.OK); + } + + @Log("启动与禁用") + @PostMapping("/changeUsed") + @ApiOperation("启动与禁用") + public ResponseEntity changeUsedOn(@RequestBody JSONObject jsonObject) { + pointService.changeUsed(jsonObject); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("锁定与解锁") + @PostMapping("/changeLock") + @ApiOperation("锁定与解锁") + public ResponseEntity changeLock(@RequestBody JSONObject jsonObject) { + pointService.changeLock(jsonObject); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/rest/RegionController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/rest/RegionController.java index 8bee5650..8727d465 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/rest/RegionController.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/rest/RegionController.java @@ -63,20 +63,20 @@ public class RegionController { return new ResponseEntity<>(HttpStatus.OK); } - @PostMapping("/getPointStatusSelectById") + @PostMapping("/getPointStatusSelectByCode") @Log("获取点位状态下拉框") @ApiOperation("获取点位状态下拉框") //@SaCheckPermission("region:add") - public ResponseEntity getPointStatusSelectById(@RequestBody Long region_id) { - return new ResponseEntity<>(regionService.getPointStatusSelectById(region_id), HttpStatus.CREATED); + public ResponseEntity getPointStatusSelectByCode(@RequestBody String region_code) { + return new ResponseEntity<>(regionService.getPointStatusSelectByCode(region_code), HttpStatus.CREATED); } - @PostMapping("/getPointTypeSelectById") + @PostMapping("/getPointTypeSelectByCode") @Log("获取点位类型下拉框") @ApiOperation("获取点位类型下拉框") //@SaCheckPermission("region:add") - public ResponseEntity getPointTypeSelectById(@RequestBody Long region_id) { - return new ResponseEntity<>(regionService.getPointTypeSelectById(region_id), HttpStatus.CREATED); + public ResponseEntity getPointTypeSelectByCode(@RequestBody String region_code) { + return new ResponseEntity<>(regionService.getPointTypeSelectByCode(region_code), HttpStatus.CREATED); } } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/PointService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/PointService.java index 10e37638..80fd4c13 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/PointService.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/PointService.java @@ -36,7 +36,7 @@ public interface PointService { * @param point_id ID * @return Point */ - PointDto findById(Long point_id); + PointDto findById(String point_id); /** * 根据编码查询 @@ -73,10 +73,27 @@ public interface PointService { JSONArray getPoint(Map wherJson); - void syncStruct(); /** * - * 获取终点点位 + * 获取点位 */ - Map getEndPoint(Map whereJson, Pageable page); + Map selectPoint(Map whereJson, Pageable page); + + /** + * + * 获取区域 + */ + JSONArray getRegion(); + + /** + * 改变启用状态 + * @param jsonObject + */ + void changeUsed(JSONObject jsonObject); + + /** + * 改变锁定类型 + * @param jsonObject + */ + void changeLock(JSONObject jsonObject); } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/RegionService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/RegionService.java index 834c7478..628b71a4 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/RegionService.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/RegionService.java @@ -63,15 +63,15 @@ public interface RegionService { /** * 获取点位状态下拉框 - * @param region_id + * @param region_code * @return */ - JSONArray getPointStatusSelectById(Long region_id); + JSONArray getPointStatusSelectByCode(String region_code); /** * 获取点位类型下拉框 - * @param region_id + * @param region_code * @return */ - JSONArray getPointTypeSelectById(Long region_id); + JSONArray getPointTypeSelectByCode(String region_code); } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java index cc0334b8..8ad4c2e7 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java @@ -1,111 +1,137 @@ package org.nl.wms.sch.service.dto; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; -import java.util.Date; - import java.io.Serializable; -import java.util.Date; +import java.math.BigDecimal; +import java.util.List; /** - * @author ldjun * @description / - * @date 2021-12-07 + * @author lyd + * @date 2023-03-17 **/ @Data public class PointDto implements Serializable { - /** 点位标识 */ - /** - * 防止精度丢失 - */ - @JsonSerialize(using = ToStringSerializer.class) - private Long point_id; + /** 点位id */ + private String point_id; - /** - * 点位编码 - */ + /** 点位编码 */ private String point_code; - /** - * 点位名称 - */ + /** 点位名称 */ private String point_name; - /** - * 所属区域 - */ - private String area_type; + /** 生产区域 */ + private String product_area; - /** - * 点位类型 - */ + /** 区域编码 */ + private String region_code; + + /** 区域名称 */ + private String region_name; + + /** 上一区域 */ + private String pre_region_code; + + /** 上一区域 */ + private String next_region_code; + + /** 点位类型 */ private String point_type; - /** - * 点位状态 - */ + /** 点位状态 */ private String point_status; - /** - * 锁定类型 - */ + /** 锁定类型 */ private String lock_type; - /** - * 载具编码 - */ + /** 物料标识 */ + private String material_id; + + /** 物料编码 */ + private String material_code; + + /** 设备编码 */ + private String device_code; + + /** 允许的载具类型 */ + private String can_vehicle_type; + private List can_vehicle_types; + + /** 载具允许最大数量 */ + private BigDecimal vehicle_max_qty; + + /** 载具类型 */ + private String vehicle_type; + + /** 载具编码 */ private String vehicle_code; - /** - * 来源标识 - */ - private Long source_id; + /** 载具数量 */ + private Integer vehicle_qty; - /** - * 备注 - */ + /** 块 */ + private BigDecimal block_num; + + /** 排 */ + private BigDecimal row_num; + + /** 列 */ + private BigDecimal col_num; + + /** 层 */ + private BigDecimal layer_num; + + /** 入库顺序 */ + private BigDecimal in_order_seq; + + /** 出库顺序 */ + private BigDecimal out_order_seq; + + /** 入空载具顺序 */ + private BigDecimal in_empty_seq; + + /** 出空载具顺序 */ + private BigDecimal out_empty_seq; + + /** 点位组编码 */ + private String point_group_code; + + /** 在执行的任务标识 */ + private String task_id; + + /** 位置 */ + private String point_location; + + /** 备注 */ private String remark; - /** - * 是否启用 - */ + /** 来源标识 */ + private String source_id; + + /** 是否启用 */ private String is_used; - /** - * 是否删除 - */ + /** 是否删除 */ private String is_delete; - /** - * 创建人 - */ + /** 创建人 */ private String create_id; - /** - * 创建人姓名 - */ + /** 创建人 */ private String create_name; - /** - * 创建时间 - */ + /** 创建时间 */ private String create_time; - /** - * 修改人 - */ + /** 修改人 */ private String update_id; - /** - * 修改人姓名 - */ + /** 修改人 */ private String update_name; - /** - * 修改时间 - */ + /** 修改时间 */ private String update_time; } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/RegionDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/RegionDto.java index f4228023..0ab456c1 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/RegionDto.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/RegionDto.java @@ -41,10 +41,10 @@ public class RegionDto implements Serializable { private String create_time; /** 修改人 */ - private String update_optid; + private String update_id; /** 修改人 */ - private String update_optname; + private String update_name; /** 修改时间 */ private String update_time; diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskDto.java index 0dd5c47d..3dc22017 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskDto.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskDto.java @@ -3,6 +3,8 @@ package org.nl.wms.sch.service.dto; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; + +import java.math.BigDecimal; import java.util.Date; @@ -15,68 +17,122 @@ import java.io.Serializable; **/ @Data public class TaskDto implements Serializable { + private String task_id; + /** 任务编码 */ private String task_code; + /** 任务名称 */ + private String task_name; + + /** 生产区域 */ + private String product_area; + /** 任务类型 */ private String task_type; - /** 任务明细类型 */ - private String taskdtl_type; - - /** 指令状态 */ + /** 任务状态 */ private String task_status; - /** 起始点位 */ - private String start_point_code; + /** 任务执行步骤 */ + private BigDecimal task_step; - /** 下一点位 */ - private String next_point_code; + /** 点位1 */ + private String point_code1; - /** 载具编码 */ + /** 点位2 */ + private String point_code2; + + /** 点位3 */ + private String point_code3; + + /** 点位4 */ + private String point_code4; + + /** 搬运物料信息 */ + private String material_info_id; + + /** 物料信息 */ + private String material_id; + + /** 物料数量 */ + private BigDecimal material_qty; + + /** 载具类型 */ + private String vehicle_type; + + /** 载具数量 */ + private BigDecimal vehicle_qty; + + /** 载具编码1 */ private String vehicle_code; + /** 载具编码2 */ + private String vehicle_code2; + + /** 优先级 */ + private String priority; + /** 处理类 */ private String handle_class; + /** 车号 */ + private String car_no; + + /** 是否自动下发 */ + private String is_auto_issue; + + /** 任务组标识 */ + private String task_group_id; + + /** 任务组顺序号 */ + private BigDecimal sort_seq; + /** 任务完成类型 */ private String finished_type; + /** acs任务类型 */ + private String acs_task_type; + + /** 生成方式 */ + private String create_mode; + + /** 业务表表名 */ + private String table_name; + + /** 业务表表名主键字段 */ + private String table_fk; + + /** 业务表表名主键值 */ + private String table_fk_id; + + /** 生成任务的请求参数 */ + private String request_param; + + /** 下发任务的请求参数 */ + private String response_param; + /** 备注 */ private String remark; /** 是否删除 */ private String is_delete; - /** 创建时间 */ - private String create_time; - - /** 修改时间 */ - private String update_time; - - /** 任务明细标识 */ - /** 防止精度丢失 */ - @JsonSerialize(using= ToStringSerializer.class) - private Long taskdtl_id; - - /** 任务标识 */ - private Long task_id; - - /** 物料编码 */ - private String material_code; - - /** 车号 */ - private String car_no; - /** 创建人 */ private String create_id; - /** 创建人姓名 */ + /** 创建人 */ private String create_name; + /** 创建时间 */ + private String create_time; + /** 修改人 */ private String update_id; - /** 修改人姓名 */ + /** 修改人 */ private String update_name; + + /** 修改时间 */ + private String update_time; } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java index 57b39fd4..85e0da95 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java @@ -17,13 +17,17 @@ import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.WqlUtil; +import org.nl.wms.enums.PointEnum; import org.nl.wms.sch.service.PointService; +import org.nl.wms.sch.service.RegionService; import org.nl.wms.sch.service.dto.PointDto; +import org.nl.wms.sch.service.dto.RegionDto; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -38,18 +42,60 @@ import java.util.Map; @RequiredArgsConstructor @Slf4j public class PointServiceImpl implements PointService { + + private final RegionService regionService; @Override public Map queryAll(Map whereJson, Pageable page) { HashMap map = new HashMap(); map.put("flag", "1"); - map.put("area_type", whereJson.get("area_type")); + map.put("region_code", whereJson.get("region_code")); map.put("ids", whereJson.get("ids")); map.put("lock_type", whereJson.get("lock_type")); map.put("point_status", whereJson.get("point_status")); map.put("is_used", whereJson.get("is_used")); map.put("point_type", whereJson.get("point_type")); + map.put("block_num", whereJson.get("block_num")); + map.put("row_num", whereJson.get("row_num")); + map.put("col_num", whereJson.get("col_num")); + map.put("layer_num", whereJson.get("layer_num")); map.put("name", whereJson.get("name")); JSONObject json = WQL.getWO("QSCH_BASE_POINT").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "point_code asc"); + JSONArray content = json.getJSONArray("content"); + JSONArray res = new JSONArray(); + for (int i = 0; i < content.size(); i++) { + JSONObject object = content.getJSONObject(i); + // 可以存放的载具类型 + String[] can_vehicle_types = object.getString("can_vehicle_type").split(","); + object.put("can_vehicle_types", can_vehicle_types); + String region_code = object.getString("region_code"); + String point_status = object.getString("point_status"); + String point_type = object.getString("point_type"); + RegionDto regionDto = regionService.findByCode(region_code); + String point_status_explain = regionDto.getPoint_status_explain(); + String point_type_explain = regionDto.getPoint_type_explain(); + // 获取点位状态名称 + if (!ObjectUtil.isEmpty(point_status)) { + JSONObject statusArr = new JSONObject(); + String[] split = point_status_explain.split(","); + for ( int j = 0; j < split.length; j++) { + String[] status = split[j].split("-"); + statusArr.put(status[0], status[1]); + } + object.put("point_status_name", statusArr.getString(point_status)); + } + // 获取点位类型 + if (!ObjectUtil.isEmpty(point_type)) { + JSONObject typeArr = new JSONObject(); + String[] split = point_type_explain.split(","); + for ( int j = 0; j < split.length; j++) { + String[] types = split[j].split("-"); + typeArr.put(types[0], types[1]); + } + object.put("point_type_name", typeArr.getString(point_type)); + } + res.add(object); + } + json.put("content", res); return json; } @@ -62,7 +108,7 @@ public class PointServiceImpl implements PointService { } @Override - public PointDto findById(Long point_id) { + public PointDto findById(String point_id) { WQLObject wo = WQLObject.getWQLObject("sch_base_point"); JSONObject json = wo.query("point_id =" + point_id + "").uniqueResult(0); if (ObjectUtil.isNotEmpty(json)) { @@ -91,11 +137,15 @@ public class PointServiceImpl implements PointService { if (ObjectUtil.isNotEmpty(byCode)) { throw new BadRequestException("存在相同的点位编码"); } + + String can_vehicle_type = String.join(",", dto.getCan_vehicle_types()); + dto.setCan_vehicle_type(can_vehicle_type); + String currentUserId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); - dto.setPoint_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setPoint_id(IdUtil.getSnowflake(1, 1).nextIdStr()); dto.setCreate_id(currentUserId); dto.setCreate_name(nickName); dto.setUpdate_id(currentUserId); @@ -116,17 +166,35 @@ public class PointServiceImpl implements PointService { throw new BadRequestException("被删除或无权限,操作失败!"); } + WQLObject materialBaseTab = WQLObject.getWQLObject("MD_ME_MaterialBase"); + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + String currentUserId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); + String can_vehicle_type = String.join(",", dto.getCan_vehicle_types()); + dto.setCan_vehicle_type(can_vehicle_type); - dto.setUpdate_time(DateUtil.now()); + String now = DateUtil.now(); + dto.setUpdate_time(now); dto.setUpdate_id(currentUserId); dto.setUpdate_name(nickName); + String pointStatus = dto.getPoint_status(); - WQLObject wo = WQLObject.getWQLObject("sch_base_point"); + if (ObjectUtil.isNotEmpty(pointStatus) && pointStatus.equals("1")) { // 空位 + dto.setMaterial_id(""); + dto.setVehicle_type(""); + dto.setVehicle_code(""); + dto.setVehicle_qty(0); + } else if (pointStatus.equals("2")) { // 空载具 + dto.setMaterial_id(null); + } else if (pointStatus.equals("3")) { // 有料 + if (ObjectUtil.isEmpty(dto.getMaterial_id())) throw new BadRequestException("物料不能为空"); + JSONObject materialObj = materialBaseTab.query("material_id = '" + dto.getMaterial_id() + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(materialObj)) throw new BadRequestException("未找到该物料"); + } JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.update(json); + pointTab.update(json); } @@ -135,15 +203,13 @@ public class PointServiceImpl implements PointService { public void deleteAll(Long[] ids) { String currentUserId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); - - WQLObject wo = WQLObject.getWQLObject("sch_base_point"); for (Long point_id : ids) { JSONObject param = new JSONObject(); param.put("point_id", String.valueOf(point_id)); param.put("is_delete", "1"); - param.put("update_optid", currentUserId); - param.put("update_optname", nickName); + param.put("update_id", currentUserId); + param.put("update_name", nickName); param.put("update_time", DateUtil.now()); wo.update(param); } @@ -176,16 +242,16 @@ public class PointServiceImpl implements PointService { is_used = "0"; } json.put("is_used", is_used); - json.put("update_optid", currentUserId); - json.put("update_optname", nickName); + json.put("update_id", currentUserId); + json.put("update_name", nickName); json.put("update_time", DateUtil.now()); WQLObject.getWQLObject("sch_base_point").update(json); //如果启用,则同步更新仓位的状态 json = new JSONObject(); json.put("is_used", is_used); - json.put("update_optid", currentUserId); - json.put("update_optname", nickName); + json.put("update_id", currentUserId); + json.put("update_name", nickName); json.put("update_time", DateUtil.now()); json.put("struct_id", struct_id); WQLObject.getWQLObject("ST_IVT_StructAttr").update(json, " struct_id = '" + struct_id + "'"); @@ -199,69 +265,63 @@ public class PointServiceImpl implements PointService { } @Override - @Transactional(rollbackFor = Exception.class) - public void syncStruct() { - WQLObject.getWQLObject("sch_base_point").delete(" point_type = '01'"); - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - - JSONObject map = new JSONObject(); - map.put("flag", "2"); - JSONArray arrStruct = WQL.getWO("QSCH_BASE_POINT").addParamMap(map).process().getResultJSONArray(0); - WQLObject wo = WQLObject.getWQLObject("sch_base_point"); - for (int i = 0; i < arrStruct.size(); i++) { - JSONObject json = arrStruct.getJSONObject(i); - JSONObject structMap = new JSONObject(); - structMap.put("point_id", json.getString("struct_id")); - structMap.put("point_code", json.getString("struct_code")); - structMap.put("point_name", json.getString("struct_name")); - structMap.put("area_type", json.getString("sect_code")); - structMap.put("source_id", json.getString("struct_id")); - structMap.put("point_type", "01"); - structMap.put("is_used", json.getString("is_used")); - structMap.put("create_id", currentUserId); - structMap.put("create_name", nickName); - structMap.put("create_time", DateUtil.now()); - structMap.put("update_optid", currentUserId); - structMap.put("update_optname", nickName); - structMap.put("update_time", DateUtil.now()); - wo.insert(structMap); - } - } - - @Override - public Map getEndPoint(Map whereJson, Pageable page) { + public Map selectPoint(Map whereJson, Pageable page) { String search = MapUtil.getStr(whereJson, "search"); - //String material_id = MapUtil.getStr(whereJson, "material_id"); - String area_type = MapUtil.getStr(whereJson, "area_type"); - String vehicle_code = MapUtil.getStr(whereJson, "vehicle_code"); - String qty = MapUtil.getStr(whereJson, "qty"); - String loadSeries = "4"; - //根据重量去找最小的级数在哪个范围 - if (StrUtil.isNotEmpty(qty) && Double.valueOf(qty) > 0) { - loadSeries = this.getLoadSeriesByqty(Double.valueOf(qty)); - } + String region_id = MapUtil.getStr(whereJson, "region_id"); - - WQLObject wo_vehicle = WQLObject.getWQLObject("md_pb_storagevehicleinfo"); - String vehicle_type = ""; - if (StrUtil.isNotEmpty(vehicle_code)) { - JSONObject jsonObject = wo_vehicle.query("is_delete = '0' and storagevehicle_code = '" + vehicle_code + "'").uniqueResult(0); - vehicle_type = jsonObject.getString("storagevehicle_type"); - } JSONObject map = new JSONObject(); + map.put("flag", "3"); - map.put("area_type", area_type); - map.put("vehicle_type", vehicle_type); - map.put("loadSeries", loadSeries); - //map.put("material_id",material_id); + map.put("region_id", region_id); if (ObjectUtil.isNotEmpty(search)) { map.put("search", "%" + search + "%"); } - JSONObject json = WQL.getWO("SCH_Point_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "struct_code"); + JSONObject json = WQL.getWO("SCH_Point_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "point.point_code"); return json; } + @Override + public JSONArray getRegion() { + JSONArray resultJSONArray = WQLObject.getWQLObject("SCH_BASE_Region").query().getResultJSONArray(0); + return resultJSONArray; + } + + /** + * 改变启用状态 + * + * @param jsonObject + */ + @Override + public void changeUsed(JSONObject jsonObject) { + WQLObject wo = WQLObject.getWQLObject("sch_base_Point"); + JSONArray data = jsonObject.getJSONArray("data"); + String used = jsonObject.getString("used"); + for ( int i = 0; i < data.size(); i++ ) { + JSONObject object = data.getJSONObject(i); + if (used.equals("1")) object.put("is_used", 1); + else object.put("is_used", 0); + wo.update(object); + } + } + + /** + * 改变锁定类型 + * + * @param jsonObject + */ + @Override + public void changeLock(JSONObject jsonObject) { + WQLObject wo = WQLObject.getWQLObject("sch_base_Point"); + JSONArray data = jsonObject.getJSONArray("data"); + String lock = jsonObject.getString("lock_type"); + for ( int i = 0; i < data.size(); i++ ) { + JSONObject object = data.getJSONObject(i); + if (lock.equals(PointEnum.LOCK_TYPE_OFF.getCode())) object.put("lock_type", PointEnum.LOCK_TYPE_OFF.getCode()); + else object.put("lock_type", PointEnum.LOCK_TYPE_ON.getCode()); + wo.update(object); + } + } + //根据重量返回最大的 级数 public String getLoadSeriesByqty(Double qty) { JSONArray dictArr = WQLObject.getWQLObject("sys_dict_detail").query("dict_id ='108'", "label").getResultJSONArray(0); diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java index fc171747..107866d4 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java @@ -77,8 +77,8 @@ public class RegionServiceImpl implements RegionService { dto.setCreate_id(currentUserId); dto.setCreate_name(nickName); - dto.setUpdate_optid(currentUserId); - dto.setUpdate_optname(nickName); + dto.setUpdate_id(currentUserId); + dto.setUpdate_name(nickName); dto.setUpdate_time(now); dto.setCreate_time(now); @@ -97,8 +97,8 @@ public class RegionServiceImpl implements RegionService { String now = DateUtil.now(); dto.setUpdate_time(now); - dto.setUpdate_optid(currentUserId); - dto.setUpdate_optname(nickName); + dto.setUpdate_id(currentUserId); + dto.setUpdate_name(nickName); WQLObject wo = WQLObject.getWQLObject("sch_base_region"); JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); @@ -117,11 +117,11 @@ public class RegionServiceImpl implements RegionService { /** * 获取点位状态下拉框 * - * @param region_id + * @param region_code * @return */ @Override - public JSONArray getPointStatusSelectById(Long region_id) { + public JSONArray getPointStatusSelectByCode(String region_code) { /** * label,value */ @@ -143,11 +143,11 @@ public class RegionServiceImpl implements RegionService { /** * 获取点位类型下拉框 * - * @param region_id + * @param region_code * @return */ @Override - public JSONArray getPointTypeSelectById(Long region_id) { + public JSONArray getPointTypeSelectByCode(String region_code) { /** * label,value */ diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java index 25970ecb..694bebc7 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java @@ -1,7 +1,5 @@ - package org.nl.wms.sch.service.impl; - import cn.hutool.core.date.DateUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.IdUtil; @@ -10,24 +8,24 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; - import lombok.RequiredArgsConstructor; -import org.nl.common.anno.Log; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.common.utils.SecurityUtils; import org.nl.modules.common.exception.BadRequestException; - import org.nl.common.utils.SecurityUtils; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.WqlUtil; +import org.nl.wms.basedata.master.service.ClassstandardService; +import org.nl.wms.basedata.master.service.dto.ClassstandardDto; +import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.service.TaskService; import org.nl.wms.sch.service.dto.TaskDto; - import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -42,6 +40,8 @@ import java.util.Map; @Slf4j public class TaskServiceImpl implements TaskService { + private final ClassstandardService classstandardService; + @Override public Map queryAll(Map form, Pageable page) { @@ -54,6 +54,10 @@ public class TaskServiceImpl implements TaskService { if (StrUtil.isNotEmpty(task_status)) { task_status = task_status.replace("[\"", "").replace("\"]", "").replace("\"", ""); } + String moreTaskStatus = whereJson.getString("more_task_status"); + if (ObjectUtil.isNotEmpty(moreTaskStatus)) { + task_status = moreTaskStatus; + } map.put("task_status", task_status); //处理状态为未完成 if (StrUtil.isNotEmpty(task_status) && task_status.contains("-1")) { @@ -63,20 +67,18 @@ public class TaskServiceImpl implements TaskService { if (StrUtil.isNotEmpty(whereJson.getString("task_code"))) { map.put("task_code", "%" + whereJson.getString("task_code") + "%"); } - if (StrUtil.isNotEmpty(whereJson.getString("start_point_code"))) { - map.put("start_point_code", "%" + whereJson.getString("start_point_code") + "%"); + if (StrUtil.isNotEmpty(whereJson.getString("point_code1"))) { + map.put("point_code1", "%" + whereJson.getString("point_code1") + "%"); } - if (StrUtil.isNotEmpty(whereJson.getString("next_point_code"))) { - map.put("next_point_code", "%" + whereJson.getString("next_point_code") + "%"); + if (StrUtil.isNotEmpty(whereJson.getString("point_code2"))) { + map.put("point_code2", "%" + whereJson.getString("point_code2") + "%"); } if (StrUtil.isNotEmpty(whereJson.getString("vehicle_code"))) { map.put("vehicle_code", "%" + whereJson.getString("vehicle_code") + "%"); } if (StrUtil.isNotEmpty(whereJson.getString("task_type"))) { - map.put("task_type", whereJson.getString("task_type")); - } - if (StrUtil.isNotEmpty(whereJson.getString("taskdtl_type"))) { - map.put("taskdtl_type", whereJson.getString("taskdtl_type")); + ClassstandardDto task_type = classstandardService.findById(whereJson.getString("task_type")); + map.put("task_type", task_type.getClass_code()); } if (StrUtil.isNotEmpty(whereJson.getString("finishTypeList"))) { map.put("finishTypeList", whereJson.getString("finishTypeList")); @@ -128,17 +130,14 @@ public class TaskServiceImpl implements TaskService { public void create(TaskDto dto) { String currentUserId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); - - - - dto.setTaskdtl_id(IdUtil.getSnowflake(1, 1).nextId()); - dto.setTask_id(dto.getTaskdtl_id()); + String now = DateUtil.now(); + dto.setTask_id(IdUtil.getSnowflake(1, 1).nextIdStr()); dto.setCreate_id(currentUserId); dto.setCreate_name(nickName); dto.setUpdate_id(currentUserId); dto.setUpdate_name(nickName); - dto.setUpdate_time(DateUtil.now()); - dto.setCreate_time(DateUtil.now()); + dto.setUpdate_time(now); + dto.setCreate_time(now); WQLObject wo = WQLObject.getWQLObject("sch_base_task"); JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); @@ -169,8 +168,8 @@ public class TaskServiceImpl implements TaskService { @Transactional(rollbackFor = Exception.class) public void deleteAll(String[] ids) { WQLObject wo = WQLObject.getWQLObject("sch_base_task"); - for (String taskdtl_id : ids) { - wo.delete("taskdtl_id = '" + taskdtl_id + "'"); + for (String task_id : ids) { + wo.delete("task_id = '" + task_id + "'"); } } @@ -178,17 +177,25 @@ public class TaskServiceImpl implements TaskService { public void operation(Map map) { String task_id = MapUtil.getStr(map, "task_id"); String method_name = MapUtil.getStr(map, "method_name"); - TaskDto dto = this.findByDtlId(task_id); + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + if (taskObj.getString("task_status").equals(TaskStatusEnum.FINISHED.getCode())) throw new BadRequestException("任务已完成!"); // 任务处理类 - String processing_class = dto.getHandle_class(); + String processing_class = taskObj.getString("handle_class"); String message = ""; // 根据任务类型获取对应的任务操作类 try { Class clz = Class.forName(processing_class); Object obj = clz.newInstance(); // 调用每个任务类的method_name()强制结束方法 - Method m = obj.getClass().getMethod(method_name, String.class); - JSONObject result = (JSONObject) m.invoke(obj, task_id); + Method m; + JSONObject result; + if (method_name.equals("immediateNotifyAcs")) { // 立即下发不需要参数 + m = obj.getClass().getMethod(method_name); + result = (JSONObject) m.invoke(obj); + } else { + m = obj.getClass().getMethod(method_name, String.class); + result = (JSONObject) m.invoke(obj, task_id); + } if (ObjectUtil.isEmpty(result)) return; JSONArray arr = result.getJSONArray("errArr"); WQLObject wo = WQLObject.getWQLObject("sch_base_task"); @@ -196,7 +203,7 @@ public class TaskServiceImpl implements TaskService { for (int i = 0; i < arr.size(); i++) { JSONObject json = arr.getJSONObject(i); JSONObject param = new JSONObject(); - param.put("taskdtl_id", json.getString("taskdtl_id")); + param.put("task_id", json.getString("task_id")); param.put("remark", json.getString("message")); wo.update(param); } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CallMaterialTask.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CallMaterialTask.java index 794e895b..95489190 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CallMaterialTask.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CallMaterialTask.java @@ -327,7 +327,7 @@ public class CallMaterialTask extends AbstractAcsTask { task_status = TaskStatusEnum.START_AND_POINT.getCode(); PointDto startPoint = pointService.findByCode(start_point_code); - start_area = nextPoint.getArea_type(); +// start_area = nextPoint.getArea_type(); //终点点加锁 HashMap lock_map = new HashMap(); lock_map.put("lock_type", "01"); @@ -368,7 +368,7 @@ public class CallMaterialTask extends AbstractAcsTask { taskObj.put("start_area", start_area); taskObj.put("request_param", form.toJSONString()); taskObj.put("next_point_code", next_point_code); - taskObj.put("next_area", nextPoint.getArea_type()); +// taskObj.put("next_area", nextPoint.getArea_type()); taskObj.put("vehicle_code", vehicle_code); taskObj.put("handle_class", THIS_CLASS); taskObj.put("is_auto_issue", "1"); diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendMaterialTask.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendMaterialTask.java index 65f0808d..de736085 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendMaterialTask.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendMaterialTask.java @@ -348,10 +348,10 @@ public class SendMaterialTask extends AbstractAcsTask { taskObj.put("acs_task_type", "1"); taskObj.put("task_status", task_status); taskObj.put("start_point_code", start_point_code); - taskObj.put("start_area", startPoint.getArea_type()); +// taskObj.put("start_area", startPoint.getArea_type()); taskObj.put("request_param", form.toJSONString()); taskObj.put("next_point_code", next_point_code); - taskObj.put("next_area", nextPoint.getArea_type()); +// taskObj.put("next_area", nextPoint.getArea_type()); taskObj.put("vehicle_code", vehicle_code); taskObj.put("handle_class", THIS_CLASS); taskObj.put("is_auto_issue", "1"); diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_BASE_POINT.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_BASE_POINT.wql index 302f9cab..ac375e59 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_BASE_POINT.wql +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_BASE_POINT.wql @@ -14,11 +14,15 @@ ## 表字段对应输入参数 ################################################# 输入.flag TYPEAS s_string - 输入.area_type TYPEAS s_string + 输入.region_code TYPEAS s_string 输入.lock_type TYPEAS s_string 输入.name TYPEAS s_string 输入.point_type TYPEAS s_string 输入.point_status TYPEAS s_string + 输入.block_num TYPEAS s_string + 输入.row_num TYPEAS s_string + 输入.col_num TYPEAS s_string + 输入.layer_num TYPEAS s_string 输入.is_used TYPEAS s_string 输入.ids TYPEAS f_string @@ -48,45 +52,25 @@ IF 输入.flag = "1" PAGEQUERY SELECT - point.point_id, - point.point_code, - point.point_name, - point.area_type, - point.point_type, - point.point_status, - point.lock_type, - d2.label as area_type_name, - d1.label as point_type_name, - d4.label as point_status_name, + point.*, d3.label as lock_type_name, - point.vehicle_code, - point.source_id, - point.remark, - point.taskdtl_type, - point.taskdtl_id, - point.task_code, - point.inv_type, - point.inv_id, - point.inv_code, - point.is_used, - point.is_delete, - point.create_name, - point.create_time, - point.update_optname, - point.update_time + region.region_name, + r2.region_name as pre_region_name, + r3.region_name as next_region_name, + ma.material_name, + ma.material_code, + ma.material_spec FROM sch_base_point point - LEFT JOIN sys_dict_detail d1 ON point.point_type = d1.value and d1.name='sch_point_type' - LEFT JOIN sys_dict_detail d2 ON point.area_type = d2.value and d2.name='sch_area_type' - LEFT JOIN sys_dict_detail d3 ON point.lock_type = d3.value and d3.name='d_lock_type' - LEFT JOIN sys_dict_detail d4 ON point.point_status = d4.value and d4.name='sch_point_status' + LEFT JOIN SCH_BASE_Region region ON point.region_code = region.region_code + LEFT JOIN SCH_BASE_Region r2 ON point.pre_region_code = r2.region_code + LEFT JOIN SCH_BASE_Region r3 ON point.next_region_code = r3.region_code + LEFT JOIN sys_dict d3 ON point.lock_type = d3.value and d3.code='d_lock_type' + LEFT JOIN md_me_materialbase ma ON ma.material_id = point.material_id WHERE point.is_delete = '0' - OPTION 输入.area_type <> "" - point.area_type = 输入.area_type - ENDOPTION - OPTION 输入.ids <> "" - point.area_type in (输入.ids) + OPTION 输入.region_code <> "" + point.region_code = 输入.region_code ENDOPTION OPTION 输入.point_type <> "" point.point_type = 输入.point_type @@ -103,6 +87,18 @@ OPTION 输入.is_used <> "" point.is_used = 输入.is_used ENDOPTION + OPTION 输入.block_num <> "" + point.block_num = 输入.block_num + ENDOPTION + OPTION 输入.row_num <> "" + point.row_num = 输入.row_num + ENDOPTION + OPTION 输入.col_num <> "" + point.col_num = 输入.col_num + ENDOPTION + OPTION 输入.layer_num <> "" + point.layer_num = 输入.layer_num + ENDOPTION OPTION 输入.name <> "" ( point.point_code like "%" 输入.name "%" or point.point_name like "%" 输入.name "%" ) ENDOPTION @@ -113,11 +109,11 @@ IF 输入.flag = "2" QUERY SELECT - struct.*,sect.sect_code + struct.*,region.region_code FROM ST_IVT_StructAttr struct left join - ST_IVT_SectAttr sect on struct.sect_id = sect.sect_id + SCH_BASE_Region region on struct.region_code = region.region_code WHERE struct.is_delete = '0' ENDSELECT diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_TASK_01.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_TASK_01.wql index 217c78ec..26bc0fff 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_TASK_01.wql +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_TASK_01.wql @@ -17,14 +17,13 @@ 输入.task_status TYPEAS s_string 输入.finished_type TYPEAS s_string 输入.task_type TYPEAS s_string - 输入.start_point_code TYPEAS s_string - 输入.next_point_code TYPEAS s_string + 输入.point_code1 TYPEAS s_string + 输入.point_code2 TYPEAS s_string 输入.task_code TYPEAS s_string 输入.vehicle_code TYPEAS s_string 输入.begin_time TYPEAS s_string 输入.end_time TYPEAS s_string 输入.unFinish TYPEAS s_string - 输入.taskdtl_type TYPEAS s_string [临时表] --这边列出来的临时表就会在运行期动态创建 @@ -50,29 +49,34 @@ IF 输入.flag = "1" PAGEQUERY - SELECT + SELECT task.*, - p1.point_name AS start_point_name, - d1.label AS start_area_name, - p2.point_name AS next_point_name, - d2.label AS next_area_name, - d3.label AS task_type_name, - d4.label AS taskdtl_type_name + md.class_name task_type_name, + dict.label task_status_name, + reg1.region_code as point1_region_name, + reg2.region_code as point2_region_name, + reg3.region_code as point3_region_name, + reg4.region_code as point4_region_name FROM sch_base_task task - LEFT JOIN sch_base_point p1 ON task.start_point_code = p1.point_code - LEFT JOIN sys_dict_detail d1 ON d1.`value` = p1.area_type AND d1.`name` = 'sch_area_type' - LEFT JOIN sch_base_point p2 ON task.next_point_code = p2.point_code - LEFT JOIN sys_dict_detail d2 ON d2.`value` = p2.area_type AND d2.`name` = 'sch_area_type' - LEFT JOIN sys_dict_detail d3 ON d3.`value` = task.task_type AND d3.`name` = 'SCH_TASK_TYPE' - LEFT JOIN sys_dict_detail d4 ON d4.`value` = task.taskdtl_type AND d4.`name` = 'SCH_TASK_TYPE_DTL' + LEFT JOIN md_pb_classstandard md ON task.task_type = md.class_code + LEFT JOIN sys_dict_detail dict ON dict.`value` = task.task_status AND dict.`name` = 'task_status' + LEFT JOIN SCH_BASE_Region reg1 ON reg1.region_code = ( + SELECT p1.region_code FROM SCH_BASE_Point p1 WHERE p1.point_code = task.point_code1 + ) + LEFT JOIN SCH_BASE_Region reg2 ON reg2.region_code = ( + SELECT p2.region_code FROM SCH_BASE_Point p2 WHERE p2.point_code = task.point_code2 + ) + LEFT JOIN SCH_BASE_Region reg3 ON reg3.region_code = ( + SELECT p3.region_code FROM SCH_BASE_Point p3 WHERE p3.point_code = task.point_code3 + ) + LEFT JOIN SCH_BASE_Region reg4 ON reg4.region_code = ( + SELECT p4.region_code FROM SCH_BASE_Point p4 WHERE p4.point_code = task.point_code4 + ) WHERE task.is_delete = '0' OPTION 输入.task_type <> "" task.task_type = 输入.task_type - ENDOPTION - OPTION 输入.taskdtl_type <> "" - task.taskdtl_type = 输入.taskdtl_type ENDOPTION OPTION 输入.finished_type <> "" task.finished_type = 输入.finished_type @@ -84,7 +88,7 @@ task.create_time <= 输入.end_time ENDOPTION OPTION 输入.unFinish <> "" - task.task_status <> '07' + task.task_status <> '7' ENDOPTION OPTION 输入.task_status <> "" find_in_set( task.task_status, 输入.task_status) @@ -95,11 +99,8 @@ OPTION 输入.task_code <> "" (task.task_code like 输入.task_code) ENDOPTION - OPTION 输入.start_point_code <> "" - (task.start_point_code like 输入.start_point_code) - ENDOPTION - OPTION 输入.next_point_code <> "" - (task.next_point_code like 输入.next_point_code) + OPTION 输入.point_code <> "" + (task.point_code1 like 输入.point_code1) ENDOPTION OPTION 输入.begin_time <> "" task.create_time >= 输入.begin_time diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/sch.xls b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/sch.xls index bd0ab2def37b81fec91af3523d38d72e412ecb54..f39438d2e9eb2a03534fcd365ea1c327486aa003 100644 GIT binary patch delta 52127 zcmcG131AdO_IFj!OcHXCNeB=igh@COuACeRawH^yaEC)dK$t)h5)33jR6u2dpv!_s zLL-g-RX|;r^~8+|9*aRyS#(#x3-JKN1M%441zzO)y{hV&o*ba=ew9>L^?R>gy{dY3 zz3%F%J|0~COK45MBs*h_!wctROhd#5f4;G?Q34sOK%@b_nj0rJYMURgbn=Z_P^UV8 zD7gbZ06q|Y4E&>Yahi?u9ePjOZJ~<+sD%F&{PcR;!)@JNqEG!g^IcAv)EDS0?W?rM zGW4J9V;%8;*o=r}yq)1(#_hV>QPidzU@rI=JR0_t z%=D0m7fNG`0UiVYG z3cLPp$Edp7qxW(B$4(h_ojUiid*Xooz7ci*1R~_@-CW066l)Ie-wM1>EAXUN;9ab6 zk0s+|E5ZWr*9yFAEAWt3;4KN%l}g-N2I>0n*p57wuKKUBDZGccPZjrHb=$1Z>JjOY zwbBD@L@iPc3Rmwhgb8N-*x9 zJM}cP_x25`>%H{Q?xS-OOzftJ2qVM@VfGH9%@e)wl9K1UJ>QMl2Mc&_6aF0{!qw}m zy7$tb>pmj2AMX8oVPBD^zX?Ykl9$XQN$=MqS%1~lMjs#Bh7T8d87!`u;%e2@PkO}i zWZm8~8P@?llS`7p^NfZbA1#Eys4MG^;GD+0d<74Xd8G(=XU3LCL}aKQv&fNaRp%fdoxLmzAr-dXS5KUp8sCsd!%D^!0xF*>Ca zV;M>aC3G5uIHN&`7U6nCuMV~|TC_g1S8x5j#ArRFcdUL#&(Lnxl7Xo=ds(s+y(%F& zKnktDo6tvpwoiy2n-IoR^e+>V$55V}HP2I4RC5_69Hnm}W2#=1I9jjk9UUv1#Kl;t zS;ew`DCHSVf4paO4zlw~*_!lLII?R>uMh2=j3SixPVVH@0WXcrFj;>%v5WqC?_B6g zRG;K_QUJfU*C+PssxRvktzXhBTE7qBdx;?(olpxXhObr6XjHBG?fv_;v(|5z(2z7e zrtj!Jl6RYC)gs}+7PvmFPqarS^(OKPZiORJi*QWt8UA|HoR3-Ksi<)j_&T#Cq)MdG z%z8%asvk}0VrNdq^d(7A`W5{adq_=yXd!3fgq*#cOi2}dXiE}d@bH$vl!*9SE71yf z>i72U=s~I`uVdIruoBVeUOs11h-11n$XK1rO;goj=^T>no4VhLlkf6 z6kLxeL69f9xO&yr1 zdC~=`D6Z-_QptR9vk{uY&1z^0_g7Zp!C5MCG1i$8R>W`12@#Pq_J!xWR{n>F&EuQP!$8{zqT6eCej*SMFK>hMj zPOS%SXZF#0isW@GX1(9u)Ac?QLF0V(JmW^xaIc5y-p>D2Jiqk24Q)#Zw&+O-t1MnT z|Jv&|Oefe)|CF$k6Z!JEg#>HMru~axHeR|e{`&TFiR!H*lFD}T19RdQP8U?i+H*nG z&NE}y^ZJ`hMyHmr5=&iZEF7Dg0!qjN8c6B5Q*LR@oe|e_mu3d82_(8}>((yKv5oJ> zc*FPDz{In_hOZE6_VHcr8uHJciyC&Yu~+JmkAKj}{s}l`E#1jkS;IOv>;hoIOo`LHJ^-qgGS{jkNVePhCo|$^*_fZp$UDMe3+WY%HSbkH**O{Mv z`0aDI9gC>Fr226DmJaPxULKb>#;oYvA=7dFe$UMLGfrJ{L;RXs_n+;$ z>_6{qD1KzHtI{?7#6uychIvlJY<{4J>zhyWKFXXhbK5m`Zd)?m@t4ErdcWYQ?_E3Z z=7@)#FXnx4+2!{>KJAX#=iMbmMfS9Jy8UU`FZsngM;$)gXTYqT1Cs79IW@!4zwX_B z8LuBMIzDSqmvQeIeV5Jn{L_932??HMn;&hzJ>vG=X%%HLcii6V)uq>8KWss#oo^3} z23hy?ogp93d*F@F?<%e>zWlbU_%F{5`SOk-ciiw)={vE1f9%$ATR%Q}F!Qk&AIz?aA+?4xG(34l5-LUff@ajtkTz6;M=;S}mJ6X5svXa4* zZt6ZIX>w8I#&w?YJutJnPW(UDU{b?;wwc$F)76N_*K z^y81PYeod@xcOvRQRq!q|NEV+aU*WYa=4FHAG%~}{P)K@ZTM+ieacQ&(}923>GsQ$ zmK}fh)u|6&f6eg6p3J-@yX&OWL+hh^9Ju+Vj2rhIocXUG>WynczIk#=#b^AG=gnie zFDE=&IQ+(sx2FyWfBV4jhlYOkEs=fyWrEq>BlfR0Eod8-6}O@^^oPx>uIhH_J*yW#w(yhp z^1k`-msP{*FOi9O~-|B#yX zx2W-<2hV<;axSrcRm?XlLYLNm_U_p$>l3%QUhe;oUyhIY^e<!%O>>chrk zcUJvt*Zfntp2qZ;jkoO%9XO_B@RHHTc(E=W}L#nehFWm-N1_ z*T6w%(vHpg;r(8>?7B1m-jB+!_AD5B_kykYH@`CZ+b&1<+n*mFh`|G1@_lWyfxuX&Td3vQSfTD3m3>U7Ma757{|J?QvP zW!pMOf1J_b**l(I^7Ek|&XvrK`DU>@xzqpcS$O?D|0o#t%LAKUsp@m$vEDXM#C4&r z_O>IBzJE=Z$t%jIPkjC7zpVW9;pY~;I`jt~$ftz58p9U^oYc>($PVo0>Ve_lgSyO> zx3<%NxaH}(f808o*Nv*#t8Ltr8yk>`^W?LWqC{j4L)px}DSejC|y#ryD#SKfPIhWz%$5 zQ(!Yr!*B1yGmO;fyi;vuX#kC98q)*yA2)7(qwa&vA-1|RcLejg_Wu{b^{IF5a|~r~ zhw{3Pcc<|>_dVl-Jz>m_VULxREiPMDT3j@@YDHx+XQ8m|&_p9$0CNz{&l9&#xp|gz z9*xaSNoBQ;~CR6~=soAy;7~69(o8&mtUgHDeFA zW$XyTJj^=du3>C9!ncP@f?#4`2+ z!ueRG#jJz$sPa1yo<#V6e@12;+u`-7PV}FB2-{*xe0>9BozN6RZ)WT!g!^s*98GZ3 zt&AN+m|nx!^{Dz0wT%54RbIA{u{x@99fd_r&kyPVU$^DKmqLRF-;etpjCFfRzvtw` zb?tT^;T}0b?_nKa^5l#+aY1YkHt5K<8HPiBer3T7BG6(6SK<)>9vb)mlRTg;%`h4d z@(3o-075Dzp{+83X0*ga@Ib2rM~es&q+P2#pad2kfl5}r;hAMojl%4^2b=0Hh&75o z{hDWUgJiUk=`UJu!k_bD>SjIX<`%kt_)vQI9?Q+FJ?lH!I2B|M?3?{CMA^CbPd~q> zZQj|bNk?JdYJD1gGj$aF41@Sz}ZuEhWIP)gqi)ttEO=?3Uo9$o}xTGGh#DO%M`};jKk@$5!AN z{`~3n;#Z#Lysq2+TY2!Go`U`VCB{zdCoQbI=D>K{upo{R&#QlJxcL{1Dkohb{R`n3 z1iktf%FVy9zyJH?@PNAx;8DqI;8?Kn!!1F71tmS8Ft(NOs9}%c4w`=ktMW`NM$I07%`bEpPhQ##^XxEQ=*2*PlPpMYn&nqhmO--Vo%3 z2THjj7OcPc(V^hQ|7Ohf4r9(Eb@!b7(l)FuC*jSGYt6@3aqT!2jA*FiMsf46z5dE) z*YXZ}&Z()qqi&pe+W0d-f}=5m4N_+i~`N6xX+& z+^Ux!pQ*<+H1K(Kk!NbP-aYwysOde}h*B%X@K*oy*S_uILB*?9(^w6A-Fs)l9d$IR zrgq#N^xipecgTAefV;!qyFhjyd&7Gd1l*h6yEeFc%X=4$ySFpEw;{NN2B-`}ad*Uf z7lu0;C8RKIardr%&v#wA9#t?6v&KgDp7+kiboRdf_IID$@Y4zt1WY;mLO*hLT*#Mz?SZu@h_x}?5m2Eq z=c2rXZ3N+0dil9U;a{u7!2W~rCQ;?tG?y_-ksosln|**Mt8{k3Byc zcDIuAso}pUt{s3m#}4QZ0P~vuwFT2rU|!Xe8VPfCW2*C4l_naPP3%0=cQuaEuu5xe zObJH;MeB4DIDY$ZKDv!2S~HS$(p_iU-+mvD3b!e$&VtH*`^$V-xWfwzVn4BiMkME{ z;Qq>6U4biMPGg=1T!ir; z;UX0-R^Zwhr!_vTBki9lL9D1XvfR;-A4?J&Q*98rgCgiAQgt-0wt-{xu01yXqn6M~ zAzeV;#X94TYXQuKRodNxs|#!SyI6?vVF2&Rj~n(to*v#srHK;^V~kOO7BS-d#E27O zJQfHsx~f$1NVSE<8i$c8+!Q_@skX3gMr;s@=~9&41!bHuC&)tCT~Njw4-#c}McG48 z_ApL^l1CYdZ6IY&h3hGBy^Muz1a1f65)`hNz$F@|B`z@-xZVnvAaH$*g~2i%;rc3E zqQLbtPD@;32yp!suD8G?84E*XI>IF@Tp!?mWp5a#L(l{%Mp`J!kg9Nff%}CWHkO70 zmu5T@%9A6`vo{r%*8M-TL&i^pO*ck{A*DH9_6M$neQw+kh8&L@^ycC{crP)X9AV@&MpU*ia)r0tw7fdY}Lf zGwvavIrC8(Fqd5XFlVMk?S?05`E5 z+)>XTigN0r=MP00uVT5z`%!#?)11PGfw((=mm8Vw`OuE$Bt8tq!Xz$gKavd-eSUj; z^!YrM$8eFyC}UrHwDo8sv;#CIU*Sdw+!$kg2jIr;+SGwB(^5-;WUQXgWI=f3KMV12 zCSh6FjuLFP1y;{*Gcr2yOB2Q^o>_wDc-&E$vb<%=5@niTJkg0Kx0whu4V76!Uf!8U zB}`K3vyr}p6{z&tNWVbTNwyjdhj!*Y+Z=}kv?b5h?>XDiSWW3CtMns9`Y9^?NN@U) zD*bcT^dm)j-UaEWs`NP`{WO(6$D2OK%)g5z{~StxNiL+>4&N(_CWBmPdUyVgVwWq} zU8>mSdfDZg;#k?`N^xS)e3z;8c}V|%Y`W1S22C`>D33w&U9NDW1TN5cIEEL8&s4zC z0yxWXb>-vuY@@s@5}4Caz7VFP@o-lpFsG6+0vKbsVtGeC!N`c^>HG?#JeH>>%uzhY zg2XpNjYT2k3^i62VqdJ7p-v-d!d#VR9MZ(`Be)|y80SqhPNm81CekeIhEdV2(u_x% zJ*?1pxSM5E91jg&%;p*Ax?z->uP7&gvWyiOSuS*^Vg;NCAfA?~EGK&FdZNnmHJ7F7 zCW^X_h(ld3Q0XTLrlrP!I7{}E#86viRL7wr7b?mEL3yQ7ABT!8SHQ^vxX2g~kD6a> zRL5f$>CWF)*eSrq^S6xpcrdT<0)wzUt~5fsgZUB#oC?ZKY^gE6JLZiHV|{nj&@zRa z23!fNGF}5N{3EdVtFcV{;F1S*dWB3EZ{D5sB;26S(UX zZo0r-Z_MZ^(-Cf!!p#6~3-cI9fD2#Y1=9MV+UU^>xvy5h%LU~PMo}*d<>jc#Eo_ak zlPJv@bf(DfbEBab@0eVMUPS6L6T^Cm==L))q~FcRNwo#wRI~m1^uos**RwnZ9wh}hY*p`T%Qfs`N$P@V2#@7JDyh3vo6>ts;B6-b0 zO-Wu79?15JJm#Pfwc>qP8gb`fejd`B_ncpXij4Qy&z)#CWC;AK2+TRpLTWEfys!6jT{TP+vZ<%{wTj6O5va=lb$1 z+JYF94@~i_2v@!0`Swv**M~D3nE+9Bh$7b3DCozRg#3sBa#0`7&I~52#q+y1^ym9+ zAufI+_z7c$u_u!EG}ff@C_kgb96zJP96zJP5Q06TH`=Ko4Wrth z6_5-O^VoW$D4j0}-=KhGb|_*u8y}}*sJq2T8GsIbtHP0~!Od)s= z+^p6(CvjN=fiu@PWMIH{)TkbaA;VnW1ff;2yfI!Q%8iN(Ss03#ZiEgJxz88`oZ0=! z(tz%7Y#C(P7zK-doQdSr1%gFCHuzu+{bt7{GX$-jdknU$oyp`-&b~6X5zt&alg*)= z{l|#Ou&jE+l*PjMa|W22+T9kUw3L20!?KhP7r{GvX7!64MoR>iTZdWZxrUy6MYz(;snr0{< z*%{`sEykk+yh8!W#NcLk8u3G+e*dR{WLLILhJz8(q%xJTj0zTjrPjHF>m zuvG!cu;6Cfj7JH$T>;6C;AZz4Ny7m&I|kVdsAD`j9733?NyY+F&G-=()r?W9xp)L} zzfbWb(?Jot-*|L{P|cqR_ZNjD(?Jn?z!;Ln$F;cyKw&H}+=F;~ zw6%xk7|vYmxJ;{8cRwZR?x!T({gi}^06rz@?x!T(rIH|X8cw?V=}31!9qBH0#CR~5 z`^;WFkZ>-%G<)@c)Nb~msys3?xYIb0G(?_AwO`Rf}gPZL%E*pg|c(-xSD74(;iV4{q-0bhhhoeyE zbw;1jz&)XGWOHz{Cyj;JUA1{iWzbt@@cL+EuuBn=0m9988{dGCKWz-j2a{(MjtmfP z_N=ioA55N8O!`VD$MV6%G-;77qJsUy(8hqt9%JknFlnQhkS(GDquYAIJ#QQ)T)o1P zEuw<$H6q6X_kuBVEO0L>9N8i&Fk9bAxR;EN2=}tWk@aC7d&P(!hd#1j0m;zdX8$zq zC7{_y$j~7A$aqU1Ni+M%c5gGh$cDAXkFCZMq9OhTpznn?yt zfM5;AstI6X_7Sp3P#@VdL3Fg>iNKk202wBzi;SH}U1ZnhiM*T}m5*sPM)f4#Z}Vk5 z#t1Fo!FUKUC>~F&8liIRPH(KU(}Zb54QBy&$I#<&ydMF_IlV3u8qrUiAz(JQv26*D z8M*^CL+(l$2wI{K!h0BY{F!bOtvujDBhoa%k4X+adIT#Hf|7GOIL36FH!Y@BROt%h^AaN7zXt387b_jRk&cR%u`E|^OE4Yz7g?BFFJy;)D8m2(0v87wI(hZrECngBk3Mw>%ol^H!zC?y$tmyxmM=nX=1*l_s($o;16V zTYy~?T|3}<3>|2uowFkjo0C@)6hL;)n;Y7`vq(sdAeEK~q>I8Czjj<)^YRspRGD0v z5=`oVgwd6Fm^3Z&^TbPHbn`IOXOz6d)6Pm3VJTpoucDx&!g*XWY|CJ}(}Mi(Og>by z6H32j|CVj+r4AE`mGmC{kUjpArI%(QmDOdb8#6R5TkLcmkc*d?iOAbF+&cm>;cQtN#>H4x zXrU;TD2x-rd8n_C3bP)COczHX@%($QJw1Soof_9ywi|2Y8d^$-8~6W_QX7qz^IZK! zd#Z!f`7>k1Ow27&#`Yz6`iUcxeX0qn3dlR)^{fT}j-sG%BBTO~o`i7Vu6w5Ok1!t< z;B|_8KsxfCW5AH|=S)irR?DI6}KURQw@!&(6-DtRs&kmzXPy;19M#2v@ZlBKa z1bCCZ^Mx{>&*q*#m~#r}M%;AXw?zT2;3qeJC=aOWSs&*2qe0k10+C$NI$_2h|DqkKj+je+>T#Jf+mP z97~i*_8lA0iy$<-U99%!{I6@jke}QY5==SbzH074H9}MkKodP z5Z)x+eSn#xxHa8iUpgaqGj#MJ5H5s=Gb*=f?Tt;dc#4CD=QjQ<`}_m2muQ~@N0mhH z|FN0SS*lYfRC68To8eCz_srwT9V(%Uc%3xlHJdjmtdSO+R zn{wkUI~jp;e$%}LP7;y( zjM%=pn-*a$N=FY@Ef9*r1K}^ucy{0F(u9XUb*o0EFFHIyN%=v;d7}*RpJu z!_rX0d0?4_^>2R=3<5L_u~hu!uu+I*V5K||nEnV;fXx=+AaTtEMK-%0tkYN$Al-$} zG2UCR4Q?t8UWsq3q)8Fd;Dsa_Sn``}#5zkWaqlo9L_@{^$ zsQCMc&rtFA5Etr-H^A9jxRJXQ*;6YO(Hnp-SMfIyuU7H55nrd`?;u{I;ztnQqT(MQ zzD>nHM0|&eA47a6;&NF}#WPk;;%WV8OR&|>)&`lYFbsw=9!*3lo+9E#&p-3=c*kVv zpRu^d8u-t=qbHgjC*10wph&Em8)Q5*5)~dqIj;^14aMrxCF9P{Fjc3hco1x61uCw= zZX&7(^cuQ^s3P#Bt%<0i>Na9rBE17o@4((Gy0;wJ--M$6tuNl3@5fl*_c78N@r!xi zvGtrr_k}}#7`%rs%zdIybnxipc5~mDk@>}p5lbiP=|6j3I=k-a#JcJGPCxur-rw54 z+biwyrPE2M$ELkAZ|PslvhNss$I)N5Jn^v{?3+THa@Og@N2PhFV4Q|TsUkCCa6PuEoJv?J9snnmWOTR zL9|C1Xbw-sA|=Bc^Q6H+qB=%tZmmRHsFiD#+HfsPBW1#?3azGei2gF(kmwQEE#JIYX>!FjJt97}pcJX$jnG z=LqzE;}M|kFhYrf^cbM_nWzWp>TP76va=1o>_u&cMqH;kF=5(UO}XDj>Fn&bW+|(+ zQlxaWn)0B{AyVqiQm)nNkupG~j2XHv2BSR$ZCYtZY&aK&Kcg9kby~CoFVVM}_i-C= z_`9oF%A2)Hqzq~`?4@H^U zuxFd4T&ZnCCkr!Edd;4R7}Q9soc1ub4uAX1lp5o^s;}W|xxH<(MCZVY5=8@dBmU^6 zBXXN4QNap+7q{bqudE+$PRF6fl*k3#BK#e)Br=dw%&uwI@&b+#z^tExU7<-o`!s0_ zmbt_s5i~3DH(ZQ8GF!^NY|RYsXtMcwb1>Nn*50m2gAtKtt$kP{cKeOHuf^LpJB?qj zL66)*+~Isw2Q?RraMect z$_H*L{ywrMDp*U2+BZvd1g~IFq5|L+;%^{^5^_Skl$-c3JSM&x?Tl%&6ksCFBD`?Q z{0@pNEd>-?040ib0!t=WAH_(`4T}AW;-H`)ldX>;SE~WVIYkjIw39|1lVV;qUYmw< z0YjmjmuNIq6yh;JEQv~J(^0pp$Nq2|swXRy?6a|+gB>Le%~v#F)6h$UC=F&AU{Ay0 zZd9Keo`xwJHmKt}p#kgAjgE(7<&S(^fKjnXa5F!ekgMs%7PzLnb_s1Xj={3kl@i>r zElHF~>0%>fg;UQS+65EIDbg|<$=x|P8uFyT=ga%fyD`Jo0G)!6XiKq`q|hb4|JFg< z*_qPCdkzA>A2?b_R3o(ZGZ)emd<)>!lo*csp9!x-T5HEM;YUDUAj!S-4S?;0Hz!QB zaPc%|5MehTV>g%*11n)PU@3~BxvDZ(K8Y>B^Fi-aaI3)E06%Bx+%D{@M6FPUXgJ}B z@j4J5_al@wK|J@j0^ivRoK`91XlY3`ln*~r%atR9Y*na(dW>`=G7BT?40uXXNuz96 zYN+9!L5#&fu{W!f{$S2EJaA@e83c0<8i<;;LpJqC_Le+5#OTjqd~te7LDHx6-CHx zu~Zu)J(U2`J-H<99<0}YVmq{bTE2Ebtk$V?yFt@ZZJYw!Y!s_@90YuuYAkE*)pvtH z{%~0v^fEzp3#}dvcxempe83A@fV%=+Lv;)AokY+Ad_Ul)enF|=tTnd|d=55;dm7In!G49X)~I0{kH8oh`sm0e%iE zK60TRbUvy{a}YUhBE0Yyw4La~`z>&g3;GoF>3Rh>$3&CQ?q=}uViKgKrpOrliO*#X z+}Hml3VYxdV6@9M@j)886TEqEhP%5<80$%6OCL{xx;OC@((ZN}dlE99{tc{*+2cdPL)U7GRX#bfpxx+*9F~<6e!#9>nVe7 za+yPP2LU4nCLN)NYgyVzbCv-OE#AypHb-z%(a)*$at8EB!k``~F>!)3hk6%aB!Dz{ zO1dn-wh&P_A6*Jyl-{J9q3*F~7mfre1+0eB!I}K40n75>g6Y>wxDEH~h^m{9um&(< zVAAbY_fRcwy8VDvQ#v>^gX4e^Km2>?2)~>z-6UP63#bNA5CfBt@N{n)EX=BO69P_D zrJBPxxw5dF=zu?ZCDe4ZcqB?%U>XJMcvKoK4Y#P}CSk~JK^2vn)r6$`kxDk}4Eqin zUJUUZ2DCS;M_Tb>2;(ii6Vk%V9+Apwohq!>17L9-$hbc+6^6Bv=D-0k&3P&Dp+2&~ z6KOhwaQ}Y{@z@c?N}IN_6jMJY>u{t8f(s+HG8NZLgfJB!RBfz7iqEOUWGWUd zqD;j!Ab_dJELz5eSz5f9LYW~ibZM_y+Kspe2}EX<65*uGXtO|Y%4~~DK$&fmabcI< zA>$%5u{~5JJE-U>vr{TgHgIN>Jjn*`RB_}rU##-Y%rYcG7{Rk-Tx6Cn<8~5ahKh$m zA>E3GO!k!)n&pVg_j%f~YMa5=^H`(eS>DfRypjiW3J_00t?&4#cYlo7a^9T>7$eL1 z)YK?;oH$ksbDL0gND1Y|#>g&;f2#zM2h65p-pVOnGRDQ?);^WKFhHQA(*L1)x}OU0=+ zvMAo9mJ;zsK)$50C$X1Vr6s=25qm_C0=8R*HgT@4b`F9 zFfb2wU=4}}apP;SgNe%7Mz;R3D|xgrVgv7N$3s5_yLJOUA>lOEZ{W!Yo{_<61kjLZ z+OMHCqVXcQ3vp9J(r$)^IE~9>u<~Y+^ue3?H2}un!so^Wu-zd-IucGur;@Vz5Gl&D zw}@;H+`_Nq&Rv6U<#X}9mR*}S@k=N?d?)YX2n%561|vBHaIzHRr>*=pPZV=zN)Wwp z6|LfH*>^lq#e2Yfw^PNV*>HA5#!=!Z)}Z2@5kF^vM-LG^1&vF^C$iUABE`|F*zB<7 z6c1P(P##< zC*#^6dr$ZAkch84n|PffpXYw#aw@XpEBk#9*@iKIlk*@eJL)ZG3ni z)N&BZ8fkp6k;fZd?&lrCHnHU+1#7(7beS>ye%^6LEITeiZJf--8e|;fJ33^JAPwk) zE*7NX)CL(cE{4c_iu?BuTN1w2QjlZR>O87bD63W}W7t@>PQ^>uDC6k;d^Ap@F3%I0 z;MoJzInRjO#QQk|SiOYe#S<6XpJ%MTlSes2*%3fZ6+aH>CMbe)*8_jyQ%RkFdWgSc zBei~vze?dfb^IiSH|*jej>~BAK<)}0op~6K!Re~8@9kvSY6(u3sFvVlnUe7D?KRQ6 zPCm!GIyUd)LpHy_k9#sX6DP;$ycnH;8U{Zcp3d@S!DqvdgwKJ`h0lW@1wR@-AD%X* zbPSJ9zmoZR0{ldHI?Xx*elq+NcsgA=4gOO2%i!rj>R65$_HsmK!q0-A4Sxmv9C$iL z>4q)2+nKweZ)$Uk|?uz7qa6_+3Nx@wBCQ{d&oq5^)2Mo-^6VB|+)PenT zGg;c8^t6$wgVTZr4!%CDXmokSytRepe8ber!uh7b6&p1IW<2ok4+mhF*k3<+-WR(SoGSXsql*Mj0IXjl zz`fYIjkvMRO_>{_^Md#1vzU0-sd!hfu^m#!ci0=Yc0fSttDc_O0eQ>Is$90L;yOpIE%S%2oD?Ev!4wV^}6tEG?Y>OL?)U`>O8tS;xBHJLFjR#%&v4>HepX z5k2C%7c*QPYkK$iB!1DdWlPGB#W#K!zh=er@z2NeD>sZP3E3Kd%n^TrZH?b<-x$AQ zYkYM@7l7t&2!~cutoDKMpi6On_HbzTDW*YapJbMF=4@lf!l0*9SL>cvjfjP``GI* z)ISpQ{5PZP3IluoJa^3E>awb`!t%0}AKBJSnLfX)Y;jTX^3&5iUH0-D$B#M2w=G^; zaZPQkZShr$hVZc9t)L-iomBP@8}opqTtJW1KXu0)n^wKjj1Z$*`}MV zx@uWsS?{F9Sv6Os+7jGTJ+A8P&-3`{xueEyZ zH}YR+1f@?8%9;Mpfc?Dk)*4$770eD$1`~ zwAfQKDeL3<7ytd>lSdC% zKfC*f*S_EP{Fw0cSDZD-V`LA{S)P{k&` ztiKNp3!Yw@RJPM~Te|C##F>G;ld^J(%gdJ~I`IMB`rxF?3d^r5b~Owg?usu=^wb0l zdg`EK>*_7;xC%#wqs)=kd%mMFE7{@r_{I^Aqj`@7KM*{^@%7vnS0p=<9aY=@emMDP zIO20B+`EV%$&QNQ*Tntvj_`Bg*{{xXr1t(#czgRqPv@&T4-9YLru_)V*-vJMw-0DP zV1y&6J(2&sB;JDT$1Dbpgs;;`^u=4sLAa3pzi#(Z__5@V0lAI@#3Pwj33jP zD`DPO1*NZde5?3xfxlMjsW%0#tUf+t=|g?1vnH@bg^P0k&aEmvmtF&u9*MP|hHNg`VIXlbrLhP(}X9*>ECz#@;!x?UuFP_=m7w_H67w^>D z7yq%3FW#xYihIEH$0Q3P)ffLU%@^-9&=>!FkT2eeR>{KI*?O_nV62}C7YL)gCt!hw zeG#@*k81}p=PuA_8FJQ<%02_$gC4|Q(LzxR3pCnIRR(O;j)Uwg$9#5^qaLvUflC3d zR$yv*gQ(AYG=SJ`wo+VUG>!eqM)&))BO(*3G(*Hc!-qO#E~gPL(1zlA*3naP^I#3o z;6M(nWp)L8iH$60PidzFTPn#CZ%Js~|FR|pq+OsqOCbwzzYu<`pg0B5%yOrRa!Y|U z4drjC+*^>@FBd8I7O?(p_yd^0;vDXqej&M(I6l%or`S~14%A!gG`_oX97^$5!^b_o1zbw?utxdj6>DKp&&iy=keC`%&BP;mraXF2ZV=|MvP+$J(-z?o;NsI*rH z$T4NR%_TaZISSJ7wm@4B3W;AW@K@SO0pBWWW~)XIVz+9$#gzuZV|a0Dro9d97&Rgt z!M@|w9=tktk0ASwyRj+UC=!<2s)7E}VHXb#h{*;=2ClSETcBalf@5U#M0~530_ZlC zkFfeyIKi*o7FHmg>{jw6dn14s>5x z)eE!%AUh{Cp*8ZITA*r}=WNt|t);OxX7e;ngp%!Vts0W*!a`Z8n`dzGf-t+UAfDe^ z5^JIhrLhXvJPnN?%dq-5BI*x!9#-XDjF`jAet~>IwA(?%pR#FL=NzSoan?nXeZE$( zxY9=5ieS_=Wh=Kb(6rF^8ygQhMEU8P9kl_}lOr&~??)KPUeacx-@_UP#>6}Y-r6Bw z(Qd|wxj=il1u?bXE~cmHfY^$hROMDN-S!1GdK;uxquOe1Mfn6KHOBrSC|fR!#~i`_ z%W~kjQ@zNHGL$Z>NvLkcj6`v~!ba^cowyNEhd9BZz~Xr%X>^3kgupl(=Zi=5@Wm(h z^u;3*eeu=aJp}kr|5I)<_7G3QG;(hVG-c1ckMl-!~d&!iqTtt=`!y|X!azdRj z6XmzFz22P?HglFZPxmEWVu`P|2oz@#VzMP(Yl$!M?y|56vcw!$N4mv zp+^c=Xu$`e!V|%6vW0FtXD-E-v(**^9m-N(J)K`Zff%GTXW&i0BvM5Y&_OQKa|~{@ zz_hu02bdIg^YG4K;+k;*uG=kK=}4IJ7OBF7b=~?^fD_;+9lj!9N&hj@o1QcJPyoH- zzoNZKZAz7ovO0xLp5ql))5TFSgySsL0;dCMrk7=<_u7FxK{ z(KgddS?M%EnRj__a?M8#I>qyW)?__{X~J}LNKScGgOwt^8#UHi`dW)rbg)i&GrcGk zJw9lyRH^10q7Z`4;+bBS%EnNtP*Xl{sp5k$^3rpI$1S-RT3X;lJMndh_MH6$Ri^_k zE94V&urj&S2-%ijK(<3sX3qF68OUaODI1+S$@EHZawY8u6Q>1RD>3(K6wd5}tLY_I zI+4=btCjv-*Ihu?R0~%+qiA}`HI!scFiYdlwdMj`3oTsfw4>=IS2~B1X}&Gwtyj`H ze0~vJYb~j_TUuwY1y1KCl~+2GBGPZWK>8Dw^mNuzc{9CefgKkp6{jz9C`acrO)pDD zXJmTQiweT|*VWDoaK%d(UPmWAO)t69`I!}QCV`i$QN51aJst3!!86_pf*Dd6;D{Jz zNbl|(W=n5ph1rtUqr!pSJ2-vSq;!8GR5P+BsB>&!$Fq-|^*+Kv;AF?Avg+Sv>9XHxZMy zVn5r7>v|qw-+}O3o(Spo*eE?2SdJsynTCt`1+Nq(0#%=zkw6*nzLt|{QI%KvHtW8+ zBgQtt7Hx-k>up#6d#kC{kA=~BJFB~Bg}2J7@_)vO&iz^4#bs*tu)*(H!(uNplT)kh za*1hGx-sW;#POzE_1L6C+c`+5B+_dwlyLD>zv0?Dw5EmaSLK6#AEO)g%y!t+W<2~@PDWyMUYbrQGLhdj89w+ zJ2G&UHq0Qz$kggWNT${tasF$w5aFD|a|EUVj-$17$g7KX&Ov9Zr0JJVWtrm8$t@Cx zj&{KSjB8WVFTuh|6I|3a(NdI$A~IL?eVa9&MU9RW(?gp|VtrqY@{Kq#$(o z$rOYRNRc4*2)AncacwFH!AwDj$`pjS9Cl>kDg~hvOc4yvWax+!Rm?PTc&RU=lS<_Q zU!v`)im7U;N~wHQE-DXYL9B`8X}r5hl}*)5bx0+pGK!3Ve?_Z?W-ZV*K^LsWQ_b!{ zS%|&2e2D)q+x;nR3kpH@Xlr4fvysRPwBclvm2Wg`7KBn;@sh3>za|9`**QlwuJ{O= zwvEYzuV^EIH=ok(0G6K8(qv+Vb@S>x^#fnuI3luEFxstAhiMSN*Ffkm4pkH0)>Yy( zpkn>;bXd|SE;YcL; z%_3Vl5=`PLA`@!U(|96lWn3?*qk&>HAH|q=U`@nc&7O`m|y0b|h(L(=i zDQL^_#|q*3Eu}E!cZo)@Hj&xp1Zz46)(hCDNMkKtDWGzvE*i=6Kc4Sy4WR0eK$cRm zJ3_HBTcF{jdb{nxb~-|O*3koRf7So&q3%X!O~1uQ>PS~*+tO*$FX)vBghbv_J5w7| zW|WbszLd^i)3?D?yFjCN)a4Z1)4w)o{IgWY|F|}4Rc%b-B;&uO94M@zcvjy@0<*Yx6)5s|2{$3CRBdP}@8CBYs4jjTmhobIBiea5@ty3(OBL$wC ziNVXE);fZaLT?s4<>>d6nwTDFK@kI)hsq~3@&8lR%T`Yi<6d(uvU|j!Now?p7Jwny z99XFoQjrqXNOz%f1PL3(A1Q|C_b(vjvwCY|nbVLg#!sPC3^|T)(wg9&cy+-+6OWev}Nyz`eVqrARtwjhSmzSt@C!Q;Lq zHsWG!!cyGJH#AyNP7laQm71>NFFc!316ZeIxoDAHtq&G%)P$2bjSsCgq+GNGo%i@! zk`gVznL2Y3WiF8@GjoMRak(y(jLn5~ORIZn$8DwDX0bg@Ue)`p<)(^`z`B`iZcWwH z6zVb*#au-a-BwK&rIT3fQT)6^tbhA?7udwsy59Hi*`e6pn?3u8pxl8g$JjO-Yq~5v zJ~W3f+Uv^UtG{>nlKWq&Jr9Ul287z57LjrqB6VrLf}>3Sn;uUkmD)nZqn<&X7t43# z>uFkf))Jegv6j_b@es^h7d<6PL&Y%1I!Q(QX&S`jHg*eQ=FIBt>@@%Xksd%LvGxEt ze9`i{rQtciJIheXU(x=JhJ0De#}eIRmSL>fBC6ezyjujSzUKOGtwjGi8`XqUGFDa9 zU?J;7Za`Ah?h5N)Ut9RI`50{E(#))%mP{~5?44P>jh1Ok#GZDunC<0W2OAG$Yj$JG z$1DcL<(T0y(J2-*#rKPiqg=5RiY22o#x%7AZA0yR$H@}(51U*m+Pw=IbKyeS(Of}% zso^XO7wkX0!>dbFTyr%t%}JPN&}wr;3S2Cf`e^31lL3o{p(eI8Jd8D+_wl~?=n8(A z0~O-I*Z(1rCO$2qDa$Pl7N-4{7H4=>TF_7{;-?J7wO&9>#qTwL>&c<2IfgK-vAJ*%egvsv9mZHKMek?9L>R!3RM z?3y>vg>9_$-e=*G-yi2hU$C>fKhDYgKAp+!qMUHfUN|8^t>w)CD2#BuB)%=PS1>II zjwT5>Z$gf@vG#f&7}(h%VGkk_JIpb{UEudSJggml&xA*Kdxo9G`Cg!*uTPNkxI}>4 z3;Ym>4X1}scx}vf7D0VdxTb=rViH&C<0f0PD(pB$e27di!r9pguktlzf|g=!`kFULl> zL;{f}F3uPKJvtNO!TWV5;(dvI@6k3D#4LkL607<$YbF%mYCqJ|$LECVHy10A$7E|V zBE8$2=woE|!yaa~wo=g#O?oQr_C6P>``)jeT`VISO13Bc{)|ZJ_olR# z&I3hmQXVkVSC<(b%ljTahhdx$r-)U1n3e=f?6v+2uMf5|YHaC5d)QV5FjA8UzB4hP__&CeZ zM6U+o!!>^R2x=+e?D&M0&5hTc{qQHKf`zl=dlxo0UW@a?`(7`zGkV#R;mbf)`Qj`C z0KJ%pBU^s>2+^?_oSo4tZrJGf;ZMW@C7d0f3AMSgSn|WCsurO1^a?9O#4mqKH>1}L zF>jmrX!>~y-z)ESY>;hkyqIbiKXHLqrc=F-!@1wjT`;(AY!vHGQDA5l=9Ww8iLx1(V=wy4Ql)$z-|XhqfAEK;TK-9^YqXOZpJd#yTst3xFJW}e zcC&!ZE46xVH}0RMe!RGQC>wjH@CQ?@T&5vg)e}V z%^f-S>cXXSCzKU^Rq19wSiY}7lUIi(-&detJ7yRKvBE0de$+E&8S(T z>(YU<<&crmiQ^>iVOfRGi|U?sow`J^6h=R9V*Z+E2F9EcUD8{lJ)WUz+eK z`)52CQrjte>tD)m?)2!WM@{&B(Q9IE$gG<)sWv>Z*B5)|Uu7aT5B}xW0|TdxT77KV zJ#9FnhHVgC)K%g}(0y&09XdxV*Zro7qB*X`8fB zV?r+*nO(57Vqx+8sy)wR2nt$ORa8-4th*^bsidTAesTM&+$=C?!c-bxm*s@xW}OQx z9c)T*NnTM|)lC?41450Ho3tSquw!r6vipWkD=k|_V>W#+=em=G7vIduZ0PKbr+qHs z#`@c}#YXiSZK>_Oth;)b|y!JfYX%f!BvW zIB-Qcf`OiJ=IK$uj00=6f%rYwEYuOXEOBif%HGOW{n2oa zP^mTWYvFH%zX_hkB|4$|fTg7n;_xQpaI7#L=T@F&CpZE|8iR_0RY+}vR6ZGLL%nkJ6E4BX;pD-iOQXlJJoCea~GyGgmNq|#&@txfzbPe zQ~2DGX+WBZO)Vhge0<U#fT_eu?kJ=+!oybR@(i)gZ5l=T2E^-D9LS+_&y}L zdU0i=O!&J^;7WFs?vQumiBp2zWHP$S{!Y(qg!A;G0IJ{CrY#~%gO%3Iga` z$#IewUCku#G)bcLHLy0_M{A1W);uAWZ52$^W_5s84Ut?Sn}{jrl~Q>Mewg-(?}@i!|lz3br(BftE2#64m7 z#a*}dtv8LWN*IJDdpGXhG$GVKsc_3!5tdwvQ%C@y({cP^oEJivDUh8oa3T0cK0bK~ z5dEediEmAcZ!Th`r|PdsGiX*Ryb?-9vZ53}?j1lNWI6tpshnUKHc^+Mfy&ucAW)Sq z#v{cbz^c`>%rTw9+nWAFtqE`XQ?{z)VNqB%;zOF2`WGBkGGA#`rCZN?o2=Wl)=;7v z0w;S74Dx&4;2%PQCwj|=I}dZFs6jcT2aqoBUq9Grra*NjplznG%K;yU_PN|YIX)qv zq!I59Q4ua1nKw8ocl>y>-CP7j_t9Waj0(~exzHG7Muu_v^C|>LC4{d1y!s#&Yz5kF z2^z`24+;L>E);++ls!no=!(x|dYwzglq^B8)rS2_)@Hv}sCbaIx=n4M&}FSV zd|}>-o9HbBjU2unI1yWh@%U2}5<>0nLa)d}Kh5?CBz4pTKV}I{nB}0COu%0rIyO;X zs0N&r&XQlwh?pQ)LoiZqI)d7FSb2yONX*?cHpv6s74%4JF^ zM}i8@%hA!Su5!oyGBR zeC*r=;|C0^h(oO)JZCHjf58IS_GBM7a~&bIC_>dU;n!4KivyFj>Jo%AQ*~g47!pla z>x+BXA>WN(nIk%y!r+S~K;xpNn_;yR28ZgzYKk8uChI0D8O~EiqEV03$)mb}Z7eQQr2qNeg zbUSO=ZRA}j1?FQ&ldn0Fc=tCxLx>{LR8Nqf`%PCJS2OofRue~yDKh<_RFA?2lI90C zq26t`u;~G6TC~lI@R!E?twY;?@O^l4_2SA#sg<)fQr@$iA+urLS+KOwv&c27th{*H zY}#<)i`DXGLfQPK70W70s$5e`3-Pt?*{B8bgOgGb$kl`?uQ`RLz$0)IqcJX5{3J zPs*E-2T_C`YjU{8C*jEsrq~Dje&^j+3XD)9(`+Rh-5j#SE0svTz$`>clNK=-V_G*w zi&9L-r>QHhSvGs>ie=cxr>D)9R=2dIs`7beb(`8JQKqb`%@Tl_S>t9!KW@QsGdbvL zC}UB6iU?;4JO1Fg{y)v?;{3-a*l^^2I7MZnjZk#WYW%|5GilVQF*$jt`3X}e(L&Tx z7MZ_n8YP?7qLnAj&tPIZRFyjF?!R7>v!=_AOJ04qQ=M56k6Q}ps|Z=yzUR;Q0*?D7<=DvAC$P=p7#CLv)ni>t?l%F(x>g;7^qm7!7mSQcX zIR`0IsVV9IYwT!4<0zsxb9Z=2n{u0eMC}jL16wIH-fcs2QETp+y+mWtYa2+^18LKM zDbd7>_(3JNMU-L!i3Dy^wI3Ht)26|+SUg4Bt`MO=G?zoAS`k_hkrpxiVT-k(Z|3Ih z%_ZCFgx$=(c{}gTy!m+Z=G|;YNGEH^lL=01O1s-(hwn4<%?eEjH7gla<#wTWmSShK-Om)O$VxuYl12B+>PL=Onp z1VL27uv^ph+AicckAo0o<;1YPZi94{;dxG52F@_5LN0ezOpd=+A-P$Sq7O^-MGfsg zy7snMbIf?W&8hmOSsL4(>=Y@N*j>aTYH0BS`f42Yyr`0%SK@r<3ImT8WddgCPyhJh z=9c#+5BUe<$38-t$faP)Nhk|s0wZoha<7UbgHsOBbK*6xq^rF09Wo5U&|8$p4+}<0O>*2Jxjm8~O}GM=IJS2_^>zZB}KUxyH1GYZvj73hQMs?h!^wk&%?7vK1D8Qs$} zJ*ypRhLNbf^(hIbvKmXx&>?&)qI)lN&wis#yz2Uytazjy;WNWedwSl^X(!%*+^pf8 zIK3NqaUOEO&dRrvWjCy-c2xuFKEb+dMG$`;E^xpTcO)|uc=SeO={r#~+L`?6z|8ju z-~G__`m278~Z-P7asVyedfy4@3G@6 ze_X4dO4{X^Zo9BEInf>6-@5%$Nj|`5fy|BAJ-zXLre)5FjE@hGDwHu$D*UPTS z0(0yP78>HR!XZY`N>H{}u68-@4rN&wQO=dVSlFScCxw@4E_b|6-Eb^YB0CmFXy+c^#S-8F%#%~GDb~z);vff zG(AoYFL%1FT9Cym$YPvsgD(hb{bV`w_Y=?PCC>`)J&;{B`)i!;p=$xSOo^@Rp`c0Yf)} zO?6>IkA-9WGD6uiN9dbmH0UYMMvhXGrYGrRWKAh+v^l7SMuDepZoGOT z4gHMGC5eyCouENx9i#Cw^Rh>Hkhn*;de^bYacVK&6!mBQQ*_?V`ljg!GvSAZ{{mbV B@)iI9 delta 20681 zcmbt+30&00`~S>mcVW5Q5G&My8gyd47$O}v>OEdJNj+LdI znp$a;Seas4nwpwrnqNyiDzihh%v=8Nna^hzF#R3>-|lNZ^UU)+^UTaM&pb2pd=_eN zIoCEh)`f>^2q6?ne2j!h0C>97($b2qE!-&5XZZL&N=J4Y(%Dc{fz)OP}g zW0|FvddMc7k6f)Atn&uOhb`GEdCL~9)}?&F5>Z`EOyh%0%ji)E_Ae ziT7t9I?`3kx#TQOk^(HSk9FoB~>kl|mz3i{`b}?ODDq6|eyL!_l`I6fR z2jT!uMf|LAI=3Qd%0jQpd?n|2XT zKk;-D&p`2v;!k;qX@xlu?O$oZ)P4Yff3!VJO~iwA11RuBekahI-sdUL@*j6@0MYqn1qD00?&wOiJ>`D_ zg6QA!kU(#_b70@79##&U+%Qoy!itAPrKTb=QeG4oDW5gD(LO?fj^ddpo^4f{*{ut; z$a&o&@m$s|GQc%9fQq*P@ zsv9Bq#G{*cwW{!=?|0+n13`XrVu)Lq=n-k#UqxXG9xK;Y(@X9W#jjwa@P#-ZRbj=S*D^6rrSW=<88aTk?O z#wE!_NTKW!)={1l?BZ@~xPABKmxG<%+p0+!Y?QnzG*aFlyGIJuU6L@kYF8sBx^=2WceqLkni6>VU=P2J zT&0-iHY#-y%8Zd`h4qh81_x(!*WeU99MoO-X!&G>-vIF2MyN=$@!u0~{+ArJU3qL| zfI7J`a_0~~cfYp%S55eX@WVRzbf*ScBneEHWjR@P^bK^VRrqODX3mT z;N?rfUOg^J|DIdZeX9A(f5%43Q{yahK-|#!SL4i5O{`!Q>sK{SW#zWwt;Tsb-l~eb z@m9UI;wfqCAHq$u^d4lE9t|s-B+tz>+Ueo1>h~nf^p|H2Hqx7N&R}1;3!qza^T3Ys zrhZzve5|{4o5+{Oc9ykc&Ge37IW^WOM~-WjyN)wbf4O;Vk9xO<4|vujzRIOal#b73 zPhtdV>v>sApU$6L`1isN1swNGy@D&xFP%Jd*22*o_u3u>cXlYP_J4%qI*{`H9H*g$ z3(T`UCvvV!-zi+0MQ=^;e`K`adf9^tF87)-<95goSM(2^Knj#Wa%LQ-41_di3D~X~ zhDoTia(vRrUsrUM|E}m{zuBJiyj|~EnXYk(B(ymI$1920HwWTS;#p%miU}cvOqgZ{ z?IMm$k~Se?=|`QmcYgDyFK3^8b8Xm*Eo49Nyi3Yw!nBm+PR+Z3yPIx#Ie+4{V^@FZIpyb|KfefA zeYN*5KmIlI)XcLB_9my~cX?xo=f>r4nqPi*?~-@JelRcIw&>YaPbKHR9Od!P;@l;3 z`k(vH;+jtle`LOY#NAC>H+4Z(hw~qmUrJj1R=2<-fB*XD)Q>;d`KR9PsqUK}2#*UI z>eG@w^cjyy&z+v{ zn(Y1e-?O`hH^+MBC69Y6CT9amLWyz;`}pkIC++i~pSXTs`Ne7>ZnXuz0PHf-3C zc&M)G-S4YUZ0`KR6B9#N#nh=`zjWM^^ip}m{2glyGuI9e%5k~aEB)ZnX&vR?6N0=4 zAFs+XXmW`yFY1{QCYEm!0akrs}6@TW?-;U-DDl-$7OHrn+PX6@-3z zpyZWjzj$NdnRS8Ys27&?dg#QQPd-SvU2wMMx1VpWUY_uwZ>-lbuRT{E|83cHQ-@_F zs!`)r8`$`ttK{gV>P~(Om%M!Q%BJX{PT4LiqjFqc2~B#v=|JYq{2b#-O~_y5RL7&= zM@((1XRPw(pGjpOzVP#!=Z0MfZ|v-G;lSrfPo6tG;j1gA2b;al&3yBRcQxyO?VGyP z^OZ@-Pk#GqV$BB~{@Itfp^y9%XS?#f!;k-&_1*_l{SF*DIsW?%7dAdK&GGH@3QM2K z^*!HRKWtviF#p64MsJT?)-*`Ixct#iI{X}Te(kEbSPhqzFz$<^Ge^yK-16y#<)spt)@wXe7=Z!qT`rLe{>!2$WTsF>ZsWF{>@zmnK z=Xqc4f2qznE+-~qW8e7iI45;U$d?Iw1B?j z4xaS->X!%JIREp-18Z-ta)0vr)<bfzuY+d z$)~fY7FJF!ey73hMrl*{3omW9lG@NN%1S4ePAbW-Kl}W6>f}l2N999?-58xxEw5hb<(y5*ND*#!mBiIj-*?GQ zY3YjVOP6JIAtrc^3t0SG#K~oO`Oy?t zM`vPR-}I6j?O{jg&7rT3STxR<%e}JTE+{H3swm9Qn^^gHdA=SOP6wnU@{qH9dDZUv zPhO6u9`*#clT<=2X-Mfv8APhT@X9bpxo*8(O;Q0t3xpg%z6$xDj}WpQV+or|$W7$y zk}hO{ieg4w;(@+oZ(tK1siWm~;?ym6u=aFwkUhxoop9n$2F(SB%>&3+A@{5$v zeS(lv$S)z^*_n_N^PoK(0^gcX$fI2d34M}~>&TBIU)Pn8(N7Vg&w>|Yce)z=6in0OE|SRusuzCvIS_YxvxV6s7j zf`knB`^tb3w2@)2_Er9NTZISil%l#D@#TRQ%D?isPc!rih{D>og}>Sq>icfbfks3X z&bOmYrN7!1`Zhk>ky1X8?FcV~_VH)kNmiIDUz^7oK7A#FygN8HBzZg#Yg_SB-A zgc*xyl05jdMSmJ49&MH9pH9#>qi_jH-hDcWrAE-=`s_1V)X6|M0?GXzk-s|Y8^C*Q zq`X;<V!Fm%S%rwC=~T zvHgaLy+g>?u9R$cr}FU6R?FFE#>%?O&2)18KbMzC9sKA)p&B!uh^NxqJ{mvjCvUpq zYd8dyVqX%eBZuV^SA1)}w&8TZ9kG?{Q2NGJvL~;TZ*3(#XqYrrmIF%sBCAMtMCq8V z;&I0@+R<|x8XS7uktPMT~KlMg6}su>3T9f zBhR=VWB6UA=s_taf5_Xe52Am{`WuNhii4nBl(TP?82C!$8sR!ACYR&`H~KqV25vhd zBaX8124bu?Jq&-TTu!33WAgZ$gAmGIcQesOaTb*0a`Vj+!xfd=Md1FCi*G#{>PN2% zsb&NlDCt7)_w6coy6szIH7g?|z^qhxMr?U?gga&4VH8vv-?5)OTgj^UK4v%URZLQ6Sb2_X|K78Ako{)dP?dx|<<#RO#km8wjNF!`mVDc^djMBJevuz-N%po*yN583Ur~$O zl!szdr&>G=R{QltrJLlt!1>3jGjY7gvHkQ&TBW6kHzz4Ktgi`hrrTrWvRfv!11#6*@!q2gMLOKdgEi?0e z=-49?I%22NItiLRTQAXMgWiVJlN;oF_7CU89Z5*>1?Nk|k;Q8u#fi<)fM!r>ok3el zjBGonxiUK~Xl^Ra53~Z}&iZLV^I(fP%~Pdy5i~D$P>a^_DoHfdMX1$>b<%;eql)Y* zI6JYiI%v!nNUpK2tk#EmHtf*RlTvVJmD2>yRm2Y^D%lYeO!H+S)&#R$MLMw0^t2m2 z!_MnzjG>EK$6rYA%DOwyWN&Lf{FQ!yg}3FeC{}iWVoho_GpelwWlP&?W>i~==%iB3 zEGCt8bwoA3ZSwgD5Y+-%nq!+$2Z(Cj*kVVFI!NUV6r92AAULTvb9O?XLsVKfK?`L= zodj(Wr*&6pL4p>>4k|QfXVAh`TCkw?U_+gidYl%a(n16+k{wiN&Mu%?R9dK@MX{kS zN_6wyP&&tk~6Ap*LoGfGW3-kUNmA^Tr$wV$Ga3Sf%w9 zv?0vm1KQArY9Cr5Me$`vNG%r7*UA5iP0i8>Fe zb<%8g($qR@lsaGVI-}J(>7vdUwNARNPP(-nKcyW%8WmbV9#U%|rUosJRcmF~YGqhk zQfhtS2X`_~t&@p5FOl&~-vx?%m}Pf?k|(INeuC!6>blT;!$cL?Um$aswksV(C$a3V zs9@bWvP1_uvAV7>539o;Adp?vUJbDIY5;mwMTWD^CK^L?S+)s+CaaAML>+7_tj>g~ z=)l&Q#BdLS(~zgK3=%B)%;+yzLi`2GP=Bx#s4RoQvYkv}b^dK!&|sKaDJf(p{oxXd zRL&vbEFzDvKr=c%RYeX3vVat$#3y^Gt>Z&gb#5|?CciVI$r82BFd?Xv`2@6Sa+vUC zWh^fMLo8Q0vjyig_C^4dJ6%N%7sv|c6A0y2vb;bz@B&h$Qb&Ngj6BNT2!!y*Y)CyW zpw+B75W*i)C&gfDU~(`w3Xy(whc7HTpN<_ z;|rKR1g$@#A|Dc*&$6r#92Bga4?&eH$wIL3gTh0~j=wpCdQ7%Dn6aYqU$D^mtc|tJ z+E`(3gKc;n#>@Aqv2ejth$rw$$sU(->!k#a1YC>M*2aosNfGxeuOg+U@CxJLGz*Az z8yzPa$8AzHKF-$oIMH~K4R39H92$Sw*7!L1|4W1qmG8de#O_J*V0J4DB8Fg4w~Q(yW!>(`wIXx<}pS#ft5e-2yPodyH_F-I4WQLG7UIv$Fhz!r6< z9a)bs>Q=LZShwYg=Q+fYh?}VKmBN5ve7M@G7N}oeQI(I=(~XvO8fk zIM{jw$Pts5qG~h8HhDSd+-Df_;BYbI>ESf4W2(wE$;LGaTwDWSCy`!FpriVU8T~Jo`8Xr=p6vNJoc)-} z$U_%7WF>n)PMkk)#KEz>pwf7_B8R-ldd1sLm2SkI<@AS;)$tHwb!9wyfwL0(EFQkn zdK1_ksUv95MUvD%YaPy#ru z$7>$h;K%ENgf_=(9@Ho%7ugw(w60?w)j*_#O-Qs2p%Zc8p%S(~5hJiJsSe=dN9{io z+Z?qG0-4Gl>DA__&7&Lz(63WW^pu##8$s-myk?U0? z4^`xl4XnH`kk+-sqY`}WH1|a(tTxKS5!^=eQrg&PXVpeGrJ(hVs!Sf7$RqEt<`iM0 zNvWW{tI~LIB9FYsW~B<+UQV;xHV;Q|+t#OXTEnO`8Y$U~n@1q>$R@Tl1H{ej#|-LU z<4@m*Sbi%r|JP=N_f>rP2Vf>95WEakOB5xmE%Eq4tG5ei=j{U8dAk6sf#s-T+Pb@d zb{59t53Lp!(9XgF+F4jYI|~a?ER6k_iM{v)yMfHFUezEEU*wPvY$XkuL_TEE{pdK` z{P8FTpTAZ8Fn?QAP9DC;R|j zWgde-`%aWJIDeDgLX)z@o+^h+)LhItc|Z# zB#%twkR$9IM_Shgk4%WQF{I7fh_Gk6$CR=3Y%7kp(b;@iRs2Ayu1Lz2x2QB!l zNFF;?Ow(A&gH(?nK#0#=Jyr|e5+Z2slcB6z2kf^f_ z?=)TD@qoTI_0V{-Wo7tz^lq)iX$w$y>|q+9)a28-{B1NoywB=bBYho~5Y7MJXlJwW zQ|KH2qtQNcPen)iYCh0x``v zzd+i9v{%LLL%v^ynWcz!9?UKHDAIRG{Lpe7iPz?dzc@LG^aB!q#div+35nCrAU})5 zU)b?7cW7*75e@OY1n4pnKj3i+ztG%SGAWEDSJK-5)`owOa%l}}WOECft2bg%5gz0M z?9AaD1=jOLEdqD74t#A3`vZ^G4RE!}!(o1a=XE*E&odl$M#lFSz{XC<4y!O1)C{~ zFE9wxucITQU|M%^L&L&vi=75ApDI1yb>`|dozc{ybu<#y8ab*>BOp@`pbjgnl2oDmd&Wm=6`^qu_yOkz z{+rFG5R4m{#2NUl{=b5_i$-;r@{8CtXCftH*R+UaA^k`X#6%KF45HROu%~8{c+h&F zlm;jhP#Uml;Eu*Klk_C%B#Lv@kl7HHi9!@A#Df?GVhZr&cpZMT&HqowBz&+G5(CGcr% zJx9f=%?TIfEQZ_C($k7WzKyR3e2V4`w8><(wY0OAD}k-4rAh7_;vZ`}IrFnw+4I!f zeuPqmxy;33r%kKM>5bd4^|MR`oLwK3_%gqn+1Ss@iJUVt)6=xGL(cp$Y7>8;iH=G) z+ID2TO7?r=9%O#5+vp52GJRx13TGtZZ}|M-{Wdn;&xd+H(Nig%&Vm8dogp5WBs%; zM@xtA#jJR6g}s$|hO`Dvw&_NoRbYrc@ao69{y1$JRsd^!hIVcUe2Ny*wsvW&dyUIf zKTlc(wyXR1)3o;9b(^3sYu%E&>NcR=;(J$H37>7PHsh{pqPuL_Lfm_Pe}>MWhuM2i z(PQ?{N=*h-YF*8?{uknBm{ws=-%D6S-gEaGdjj?)YuyoT>%!kC9l7-k)i)$PPs{H; z5+CelRsqBBFQD_1`w6(_-YQ_^{RP}wdOrcj@tVZigGcT!;N&uToU+5ysn!&N3HL%B z<%FeFNx*=uQdr{~)WeRKR(i8nZ%SURcft+|k5cE91Kas9?ag+~p!VHr^&)~MC@Rc1 zV4}hn0khv`(7`x=B+R6}M=3{N?Al_1a>3ZywU`ibc4Z#XIN4IY6W0rT^WNrj;UlEUHk2N@CqRF=Y{jR0KU242$! zKHLT-Tv+Qk!o@&%WeX=@P#n%_1J|{}tZqH^?uK!yC>S##eEHwiFTRiutfzSC%}g8c z5}dGXC974kO~`Qi@!<{(hb*oF6JYBBFaa=|_73%MN&%!E7g^_xGysxPHVT2|8|h;x zo!>|&;xfP0seLC@Ni63b!Cdza#XH%CTkp_`cF4znKzs9i<;Qr}gd6HLzOSMmm`>KX zgFcTNhA~k=@gDl9@O;1_D$E!3CKcx0Kd!)9u9#*O<}-M$4c@005Ku7ZF{$uSz#$xl z2Km{rn!|Q;^|}!B<=aMD4|`kChYj09&7BVS5qxbekpGP#Y3jocZJ}O$nmHZA;J9lF zEX4!X_f_zi6_TRBT8__ZgRkw&$~I9irv)kwxV`S+l5Shp~~pDR|7)JMhjnE3k7KU>pbqo{P>>U>AKx4TqsT6S8$2W_@;1{0f(4?-EmAyNd>NL=y^ITit0rz`Si2?VSg;^CmDg zU68HeFeGxgQNinlnibfAFZyN`F9F7(l-ITEj!dt@d|@Ogu(&K`rL(^ExYA79O})^Y zT9u8j_XR3kfZnXxP5VQ9b*7N0;nKHevc5ZLq@#k;aV=Xu7ZY+EDC>%8;^a1q&^*_f zz^616e@;hoOK;pyk7>BYAENttp7#ws%k!*b)JgXs>I#4QFy6dvM9hyrC2~cZbsu~k z@H*7EoBz0t|BBW`8{R%i{d6nN(54!G(H}_hhdW3qNXbY%%*bCna~gjcItVEpDFZ1J zsUH&mNl+Hj03`kkuxuo_WHJP4C=&nS&2S|CdzukQ{8u*oS2J8D|Gf;)@nJJ1&8zH- z)3g^`d5*d^xSpf_)1`|avM!^k4;%cTlP z*tEFlv`pM*qB7%W&&J-W7DPC zE_wZn%W@|b`_qLZ%O_2yW&I}Ui!1V-pJg?pX{VZRM@_GCNz1G*_bIE$ryX1^qw-5g zdGVym{EYnR+M-8SxTRNBRF>&Wie@a#$S5i?kx>t2XHLvWizXpa7E8D(I@DxJtuT!w zTS}*BT^ye>3>%S}KKO~uPOd{njvPMtC8PAvO5@0^%*;^($k2?;F%w6nrqvG4962g= z#HhKMHDo|(W&V`>=_V4q@Amc|Hvh4OtUL14hr7RM-bc0_so(SV$Dg}A;h0W>w_e}= z1NNpJXBwLhfA#TKnw?Ur)bQaa$B%utd&@!E!NoBf|Al1`G4-n|om^Q|mQre(l3$rY z3P;uAkNHCKaw}_TlzmFLDX-RUzc$pR*wKVV-mj);L2!Rv-sJsG3!Ey-rVe$UXI~UG z*Dl#)N!O&)0R@dFb6#$=xpDsPZsns2^GkQxrJBfglT<|PEv8Xrro@Oudpl~c@lUpY ztSJ1J$ud7;r~OVi>n9zaN;E9=$#mSCMLL^JX4A((1HGaKd+l_Y9~-s5+s;(G%<7^_ zQ%y?bAiI>z(md0Ef<4-yIr-I;M*q@rS4@hS6<=6R2|>@e>z)2R#l6*#Rn>&&Og)z#)# zwM)&9uQu0~tu~)wEvwC|&2{E{kayN}&L^wQr~Gx#n$H)Tin={-8Z<6^PD{$E)B60% z(?qxKr}xg1&o_{fRk^10vXWdVoU9?At~@ zdGF9?jqmKZY~R0rl6|+E69<$QRW=n(DlVFFMl)jcf*S%a7kgZ(G+hAK0D=uZ$2a^;*ZqtSif)EFO!^QJqdJijC&|j z>#x<7k4;UP@@W3(vgu@MZduvXh>?XPKfkgfBE782xwKLm8s{Drk(y`88&H|Q$)T&J zvLYv>C^Vupr7lVn{6o%2(=6RtazqzVvwLZ0sZ6$?roBv$b`8$ya>cpmnyH8B^f(Jm z_1*cJ^dHIL31w3-gTgf)tC#0uck4s=B%Z3 zj6SCCXnp$VFYWfy^2K!+ktulJN8jw48@%(daq}N8j-T5{MT`ureEhW+3rd!fjGF1B ztUROavC_ds+KNh7iz)cnuOE{`J1&3s;l4elk*RcE(03muYSWrJ=QXC66<3v%)(uOU zy?U=pi;jP<>!Ks>=pO#bDdwUR|C)Z)#kgM71#kL#q~Xi+-;rGh*ME58$R}Hy{yA`E z_l^OEJ;plA0aI{V;8hwOaf3chYr4lgM}wvM{JPgnAsywAFjLfUefqXW9GyafFD1nuKKxhGyh|zXC%HI|E-cz) za(X_-)H`IXeP~2_es*zjMTpTZywNd&JUFSiD&LgU=a$JlDWuLWe#>Fq+?6#s{=byz z%5+7#=+Mc!lt`U!$GIo_>P}?7=lGUmU){uAkI#(MMd~WoyniI}gdtKl@s%O3m2ga? zuIw@YFAu$7xMoP*pR0=sHF#==-mK|V)hW*4>EPK{_tRK|=WRRB*uFZwCug5F)zNc% zOr%I|CFhHY1+E);Lm@N#;6F>IoA1?8~y2Rtz z;&R5N^78cGTpUcjQpcn|9p%%Xxb391z4OWRlAsTxh+&^L`de*e_|&X@cq7*9oh|{! zkcU!m3eO)B)H80jA?|_44LqwckeWae!Uj=I9P4Y=Ji&GbYihPMODFXI=h5&h3qM?4 z)3Sxvr3jre&g}s4gZMwLO93jz^M-`qX0n7EHcSpMp)ndh>&|2(eo2>)ZzUAwfjDK{ zzf`wD5peK^r8(AG& zb5k0|R^ODemy~O1H7^FRi#H`B8+1#mUQ!-d0xnL#u6n#JIjdhRo zTUwE@!FR*U@3F3TB(LCE^fCN-@9`w`j66ZKwMGIevv=(L&Dlk}lEgOGF z>Ni09U|MSS^s-0tCs%IYk%MDxMP*)DalV|x;b8>@MU(SAt8$1v88Wh8+4Pc%bOQ>t zP?<(YM&uV{<`q>wr3J5+{dPy{g~bxoBBh3DM->)TU>6gc*sQahKC%!SSz>c18yx+s zfZ5U(sZ@`{j9)59D*`o@E^naYCFnB$lrb8pN!Rmh0gnOL-l^gT4_5*;BiY^wG+g?O zut&RT<~ZyIM>jqr4ap&zd76esvnGXZ3DPvuhQ=^WinPUo@`?yeh8~d;{x4-(_rbnf= zO=cIzjO?^zb3$xFe4-^IA<+_*mKdcZ(E6t*o73adV>6-?Q{&4kV#YI8O}%-odOkLDRS*UX!K8Wv8{T(rI)sUNcAfiLif=>;49{ lh|M)<2C-+W@Z!18!_ -import java.sql.Timestamp; + import java.sql.Timestamp; <#if hasBigDecimal> -import java.math.BigDecimal; + import java.math.BigDecimal; import java.io.Serializable; <#if !auto && pkColumnType = 'Long'> -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; + import com.fasterxml.jackson.databind.annotation.JsonSerialize; + import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; /** @@ -23,18 +21,18 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; @Data public class ${className}Dto implements Serializable { <#if columns??> -<#list columns as column> + <#list columns as column> -<#if column.remark != ''> - /** ${column.remark} */ - -<#if column.columnKey = 'PRI'> -<#if !auto && pkColumnType = 'Long'> - /** 防止精度丢失 */ - @JsonSerialize(using= ToStringSerializer.class) - - - private ${column.columnType} ${column.changeColumnName}; - + <#if column.remark != ''> + /** ${column.remark} */ + + <#if column.columnKey = 'PRI'> + <#if !auto && pkColumnType = 'Long'> + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + + + private ${column.columnType} ${column.changeColumnName}; + } diff --git a/mes/qd/src/api/wms/sch/point.js b/mes/qd/src/api/wms/sch/point.js index b41e5141..7a781111 100644 --- a/mes/qd/src/api/wms/sch/point.js +++ b/mes/qd/src/api/wms/sch/point.js @@ -23,14 +23,6 @@ export function edit(data) { data }) } - -export function syncStruct() { - return request({ - url: 'api/point/syncStruct', - method: 'put' - }) -} - export function findPoints(area_type) { return request({ url: 'api/point/area_type/' + area_type @@ -53,4 +45,27 @@ export function getPoint(data) { }) } -export default { add, edit, del, syncStruct, changeActive, findPoints, getPoint } +export function getRegion() { + return request({ + url: '/api/point/getRegion', + method: 'get' + }) +} + +export function changeUsed(data) { + return request({ + url: 'api/point/changeUsed', + method: 'post', + data: data + }) +} + +export function changeLock(data) { + return request({ + url: 'api/point/changeLock', + method: 'post', + data: data + }) +} + +export default { add, edit, del, changeActive, findPoints, getPoint, getRegion, changeUsed, changeLock } diff --git a/mes/qd/src/api/wms/sch/region.js b/mes/qd/src/api/wms/sch/region.js index 6cfc1e99..cfaf0da6 100644 --- a/mes/qd/src/api/wms/sch/region.js +++ b/mes/qd/src/api/wms/sch/region.js @@ -32,21 +32,20 @@ export function changeActive(data) { }) } -export function getPointStatusSelectById(id) { +export function getPointStatusSelectByCode(code) { return request({ - url: 'api/region/getPointStatusSelectById', + url: 'api/region/getPointStatusSelectByCode', method: 'post', - data: id + data: code }) } -export function getPointTypeSelectById(id) { +export function getPointTypeSelectByCode(code) { return request({ - url: 'api/region/getPointTypeSelectById', + url: 'api/region/getPointTypeSelectByCode', method: 'post', - data: id + data: code }) } - -export default { add, edit, del, changeActive, getPointStatusSelectById, getPointTypeSelectById } +export default { add, edit, del, changeActive, getPointStatusSelectByCode, getPointTypeSelectByCode } diff --git a/mes/qd/src/views/wms/sch/point/MaterialDialog.vue b/mes/qd/src/views/wms/sch/point/MaterialDialog.vue new file mode 100644 index 00000000..b5f8400e --- /dev/null +++ b/mes/qd/src/views/wms/sch/point/MaterialDialog.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/mes/qd/src/views/wms/sch/point/ViewDialog.vue b/mes/qd/src/views/wms/sch/point/ViewDialog.vue new file mode 100644 index 00000000..7b4c2be8 --- /dev/null +++ b/mes/qd/src/views/wms/sch/point/ViewDialog.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/mes/qd/src/views/wms/sch/point/WorkOrderDialog.vue b/mes/qd/src/views/wms/sch/point/WorkOrderDialog.vue new file mode 100644 index 00000000..d9141c23 --- /dev/null +++ b/mes/qd/src/views/wms/sch/point/WorkOrderDialog.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/mes/qd/src/views/wms/sch/point/index.vue b/mes/qd/src/views/wms/sch/point/index.vue index 5e5bacae..aeb97cea 100644 --- a/mes/qd/src/views/wms/sch/point/index.vue +++ b/mes/qd/src/views/wms/sch/point/index.vue @@ -7,7 +7,7 @@ :inline="true" class="demo-form-inline" label-position="right" - label-width="80px" + label-width="90px" label-suffix=":" > @@ -19,6 +19,23 @@ @keyup.enter.native="crud.toQuery" /> + + + + + - - - - - - - - - - + + + + + + + + + + + + + - - + /> - - - + /> @@ -112,15 +145,52 @@ - 仓位同步 + 启用 + + + 禁用 + + + 锁定 + + + 解锁 @@ -129,28 +199,84 @@ :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" - width="500px" + width="540px" > - + + + + + + + + + + + + + + + + - + - + - + + + + + + @@ -171,32 +297,60 @@ /> - - - - - - {{ item.label }} - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -216,28 +370,38 @@ @selection-change="crud.selectionChangeHandler" > - - + + + + + + + + + + + - - - + - - - - - + + + + + + + + + + diff --git a/mes/qd/src/views/wms/sch/task/index.vue b/mes/qd/src/views/wms/sch/task/index.vue index eb7928da..79bd8cc1 100644 --- a/mes/qd/src/views/wms/sch/task/index.vue +++ b/mes/qd/src/views/wms/sch/task/index.vue @@ -30,67 +30,22 @@ @keyup.enter.native="crud.toQuery" /> - + - - - - - - - - - - - - - - @@ -112,6 +67,17 @@ + + + - - + + + - - - + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -203,11 +188,11 @@ width="30%" > - + + + + + 取 消 确 定 @@ -221,24 +206,34 @@ import crudTask from '@/api/wms/sch/task' import CRUD, { crud, header, presenter } from '@crud/crud' import rrOperation from '@crud/RR.operation' import crudOperation from '@crud/CRUD.operation' +import udOperation from '@crud/UD.operation' import pagination from '@crud/Pagination' +import Treeselect, { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect' +import '@riophae/vue-treeselect/dist/vue-treeselect.css' +import crudClassstandard from '@/api/wms/basedata/master/classstandard' export default { name: 'Task', - dicts: ['SCH_TASK_TYPE', 'SCH_TASK_TYPE_DTL'], + dicts: ['acs_task_type', 'vehicle_type', 'task_finished_type'], components: { - pagination, crudOperation, rrOperation + pagination, crudOperation, rrOperation, Treeselect, udOperation }, mixins: [presenter(), header(), crud()], cruds() { return CRUD({ title: '任务', url: 'api/task', - idField: 'taskdtl_id', - sort: 'taskdtl_id,desc', + idField: 'task_id', + sort: 'task_id,desc', crudMethod: { ...crudTask }, query: { - task_code:'',vehicle_code:'',start_point_code:'',next_point_code:'',task_type:'',taskdtl_type:'',finished_type:'',task_status:"" + task_code: '', + vehicle_code: '', + start_point_code: '', + next_point_code: '', + task_type: '', + finished_type: '', + task_status: '' }, optShow: { add: false, @@ -253,7 +248,6 @@ export default { return { viewDialogVisible: false, fullscreen: false, - taskdtl_id: '', currentComponent: '', openParam: {}, create_time: [], @@ -263,26 +257,65 @@ export default { permission: { }, - rules: {} + rules: {}, + classes1: [] } }, created() { + this.initClass1() crudTask.getTaskStatus().then(data => { this.taskStatusList = data }) crudTask.getFinishType().then(data => { this.finishTypeList = data }) - this.crud.query.task_status = ['-1'] - this.crud.toQuery() + // this.crud.query.task_status = ['-1'] + // this.crud.toQuery() }, methods: { + initClass1() { + const param = { + parent_class_code: 'task_type' + } + crudClassstandard.getClassType(param).then(res => { + const data = res.content + this.buildTree(data) + this.classes1 = data + }) + }, + buildTree(classes) { + classes.forEach(data => { + if (data.children) { + this.buildTree(data.children) + } + if (data.hasChildren && !data.children) { + data.children = null // 重点代码 + } + }) + }, + // 获取子节点数据 + loadChildNodes({ action, parentNode, callback }) { + if (action === LOAD_CHILDREN_OPTIONS) { + crudClassstandard.getClass({ pid: parentNode.id }).then(res => { + parentNode.children = res.content.map(function(obj) { + if (obj.hasChildren) { + obj.children = null + } + return obj + }) + setTimeout(() => { + callback() + }, 100) + }) + } + }, hand(value) { this.crud.toQuery() }, handTaskStatus(value) { + this.crud.query.more_task_status = null if (value) { - this.query.task_status = this.task_status.toString() + this.crud.query.more_task_status = value.toString() } this.crud.toQuery() }, @@ -294,46 +327,28 @@ export default { } return '' }, - formatFinishTypeName(row, column) { - for (const item of this.finishTypeList) { - if (item.code === row.finished_type) { - return item.name - } - } - return '' - }, - beforeHandleCommand(index, row, command) { - return { - 'index': index, - 'row': row, - 'command': command - } - }, - handleCommand(command) { + doOperate(row, command) { let method_name = '' - switch (command.command) { + switch (command) { case 'a':// 完成 method_name = 'forceFinish' break case 'b':// 取消 method_name = 'cancel' break - case 'c':// 拉回 - method_name = 'pullBack' + case 'c':// 下发 + method_name = 'immediateNotifyAcs' break - case 'd':// 重发 - method_name = 'renotifyAcs' - break - case 'e':// 详情 + case 'd':// 详情 method_name = 'view' break } if (method_name === 'view') { - this.view(command.row) + this.view(row) return } const data = { - taskdtl_id: command.row.taskdtl_id, + task_id: row.task_id, method_name: method_name } crudTask.operation(data).then(res => { @@ -344,7 +359,7 @@ export default { }) }, view(row) { - this.taskdtl_id = row.taskdtl_id + this.task_id = row.task_id switch (row.task_type) { case '01':// 入库 this.fullscreen = true